EDIT:
Ошибка ERROR_PARTIAL_COPY
была вызвана не вызовом GetBinaryType()
, а более ранним вызовом EnumProcessModules()
, который пытался получить полный путь к исполняемому файлу для передачи процесса на GetBinaryType()
, что не удалось. Возникла цепочка исключений, которую я пропустил, и в этом сообщении об ошибке исключения было указано то же сообщение об ошибке в исходном сообщении, но сохранился код ошибки ОС ERROR_PARTIAL_COPY
.
Эта функция вызывается из 32-разрядной службы Windows. Я искал в Интернете и stackoverflow и не нашел другого экземпляра, где GetBinaryType()
не удалось и GetLastError()
вернул ERROR_PARTIAL_COPY
:
Была выполнена только часть запроса ReadProcessMemory или WriteProcessMemory.
Возможность, которую я рассмотрел, состояла в том, что ERROR_PARTIAL_COPY
был установлен более ранним вызовом WINAPI и GetBinaryType()
не правильно SetLastError()
. Я попытался воспроизвести это с помощью:
- выполнение его с путем к файлу, который не существует
- выполнить его с путем к неисполняемому файлу
- выполнение его с путем к файлу, который запрещает доступ
безуспешно (я звонил SetLastError(ERROR_PARTIAL_COPY);
до каждой попытки): каждая из этих попыток дала ожидаемый результат.
Фрагмент кода:
std::string full_exe_path =
a_impl->exe_installation_dir + "\\" + a_impl->exe_name;
DWORD bin_type;
if (FALSE == GetBinaryType(full_exe_path.c_str(), &bin_type))
{
throw Base_exception(
__LINE__,
__FILE__,
"Failed to get binary type for " + a_impl->exe_name);
// Optional argument here that defaults to GetLastError()
}
Кто-нибудь знает или имеет какие-либо предложения относительно причины этого?
Примечание: это происходит на машине, к которой у меня нет доступа (и работает на более чем 99% машин, на которых работает служба Windows)