GetBinaryType () завершается с ошибкой ERROR_PARTIAL_COPY - PullRequest
1 голос
/ 30 января 2012

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)

1 Ответ

1 голос
/ 05 февраля 2012

Я не могу проверить это прямо сейчас, поэтому следующее немного умозрительно: - (

Действительно трудно убедиться, что вызывает то, что вы видите - AFAIK, вам нужно проверить следующие возможности:

  • Служба Windows
    В каком пользователе / ​​контексте работает служба?
    Так как Windows Vista MS применила несколько изменений для повышения безопасности, которые изменили поведение, например, при доступе к сетевому ресурсу из службы Windows!

  • разрядность
    ERROR_PARTIAL_COPY может произойти, особенно когда битность вашего приложения отличается от битности файла, который вы проверяете.

  • .NET файлы (EXE / DLL)
    GetBinaryType() может вести себя странно, если проверяемый файл является файлом .NET.

  • Антивирус и т. Д. Любой сканер вирусов и т. Д. Может странным образом мешать работе GetBinaryType().

  • заражение руткитами и аналогичные
    Это может дать действительно странные результаты, поскольку руткит не идеален ...

  • виртуальная машина
    Если служба Windows размещена на виртуальной машине, у меня было несколько странных опытов с доступом к сети.

Еще один момент, который вы могли бы проверить, является ли поведение при запуске этого кода из «обычного приложения» таким же: это может дать вам подсказку, имеет ли отношение «служба Windows / общий сетевой ресурс» к этому.

Также проверьте, можете ли вы открыть соответствующий файл (только для чтения, без блокировок) и что GetFileType() возвращает в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...