OpenProcess () успешно, но EnumProcessModules () не работает - PullRequest
2 голосов
/ 02 марта 2012

У меня есть следующий код, выполняющийся в службе Windows в Windows XP 32-разрядная версия:

HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                       FALSE,
                       a_impl->pid);

if (0 == h)
{
    throw Process_exception(__LINE__,
                            __FILE__,
                            "Failed obtain module list for '" +
                                a_impl->exe_name + "'",
                            GetLastError());
}

DWORD required_size  = 1024 * sizeof(HMODULE);
DWORD module_entries = 0;
BOOL result;
DWORD last_error;
HMODULE* module_handles = 0;

do
{
    module_entries = required_size / sizeof(HMODULE);
    delete[] module_handles;
    module_handles = new HMODULE[module_entries];
    memset(module_handles, 0, sizeof(HMODULE) * module_entries);

    result = EnumProcessModules(h,
                                module_handles, 
                                sizeof(HMODULE) * module_entries,
                                &required_size);

    last_error = GetLastError();

} while (TRUE == result &&
         required_size > (sizeof(HMODULE) * module_entries));

if (FALSE == result)
{
    CloseHandle(h);
    delete[] module_handles;

    throw Process_exception(__LINE__,
                            __FILE__,
                            "Failed to enumerate module list for '" +
                                a_impl->exe_name + "'",
                            last_error);
}

Служба Windows развернута на многих машинах и на некоторых машинах. (к которому у меня нет доступа) вызов EnumProcessModules() завершается неудачно с ERROR_PARTIAL_COPY. Насколько мне известно, это не удается при запросе процесса запущен вошедшим в систему пользователем: я не смог воспроизвести это и попробовал следующее:

  • При использовании Process Explorer отказано в чтении памяти локальной системной учетной записи и запись доступа к памяти для процесса, запущенного вошедшим в систему пользователем.
  • Запуск процесса в другом сеансе (службы Windows и процессы запускается первым вошедшим в систему пользователем, выполняющимся в том же сеансе, 0)

Может кто-нибудь объяснить это поведение?

Обратите внимание, единственный процесс, который я видел это поведение, это системный процесс (обычно идентификатор процесса 4).

Ответы [ 2 ]

7 голосов
/ 02 марта 2012

Документация содержит ответ:

Если эта функция вызывается из 32-разрядного приложения, работающего на WOW64, она может перечислять только модули 32-разрядногопроцесс.Если процесс представляет собой 64-разрядный процесс, эта функция завершается ошибкой, и последний код ошибки равен ERROR_PARTIAL_COPY (299).

Число машин, на которых возвращается этот код ошибки, равно 64битовые системы и процесс, чьи модули вы перечисляете, - это 64-битный процесс.

Чтобы перечислить модули 64-битного процесса из вашей 32-битной службы, вам нужно использовать EnumProcessModulesEx. На самом деле похоже, что для перечисления модулей процесса вам может потребоваться запустить 64-битный процесс.

Обновление : вы, очевидно, уверены, что системы включеныкод не работает 32-битные системы.В этом случае, возможно, сбои происходят при попытке перечислить модули 16-битных процессов.

2 голосов
/ 11 января 2015

Причина может заключаться в том, что вы используете CreateProcessA в своем коде ... и внезапно вызываете EnumProcessModules. Таким образом, Windows не может создать ModuleInfo к этому времени. И он возвращает ошибку 299 (думая, что это 64-битная система .., поскольку он не работаетдля чтения из памяти).

Пожалуйста, ищите здесь решение Не удалось выполнить EnumProcessModules с ошибкой 299 на 32-битной win7

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