Информация о модуле не работает с DEBUG_PROCESS - PullRequest
0 голосов
/ 18 сентября 2011

Я пытаюсь создать процесс с помощью DEBUG_PROCESS |DEBUG_ONLY_THIS_PROCESS flags.
По какой-то причине, когда я пытаюсь использовать метод, такой как "GetModuleFileNameExA", я получаю ошибку "ERROR_INVALID_HANDLE".
Я знаю, что мой дескриптор процесса правильный, но это происходит, даже если я вызываю метод следующим образом:

GetModuleFileNameExA(processHandle, NULL ,moduleFileName, sizeof(moduleFileName));

, который должен дать имя основного модуля процесса.
Я прочитал в MSDN, что для создания этого процесса необходимы флаги: PROCESS_VM_READ и PROCESS_QUERY_INFORMATION, но я пробовал это вместес DEBUG_PROCESS |DEBUG_ONLY_THIS_PROCESS и это не помогло.
Когда я присоединяю свою программу к работающему процессу, она работает нормально.
что я делаю не так?

1 Ответ

1 голос
/ 18 сентября 2011

В случае успеха дескриптор, возвращенный CreateProcess, имеет PROCESS_ALL_ACCESS, так что это не проблема. Проблема в том, что сразу после CreateProcess Windows еще не выполнила инициализацию и, следовательно, не настроила список модулей. Попытка запросить модули отладчика (даже основной модуль) в этот момент потерпит неудачу, независимо от того, какой интерфейс вы используете (Toolhelp, psapi, kernel32).

Лучше всего подождать CREATE_PROCESS_DEBUG_EVENT и затем запросить. Если вам нужны имена загруженных библиотек DLL, вам придется подождать, пока они загрузятся и получат LOAD_DLL_DEBUG_EVENT. В прошлый раз, когда я проверял XP, они также не могут быть запрошены здесь, вам придется ждать следующего события отладки, чтобы эта информация была доступна.

Возможно, может помочь использование нативного NT API или это может быть исправлено в Vista и выше.

Из любопытства, зачем вам имя файла модуля, когда оно у вас явно есть при вызове CreateProcess?

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