Posts tagged: NtQueryInformationProcess

Замена WaitForInputIdle() для консольных процессов

By , 27 ноября, 2014 23:31

Известно, что после создания процесса в Windows с помощью CreateProcess поток не ожидает его инициализации, и управление возвращается сразу. Для того, чтобы дождаться инициализации, многие используют функцию WaitForInputIdle, но она не умеет работать с консольными процессами и процессами без очереди сообщений:

If this process is a console application or does not have a message queue, WaitForInputIdle returns immediately.

Я решил эту проблему с помощью Native API. В расширенной версии структуры PEB имеются два поля, Ldr и LoaderLock, заполняемые загрузчиком PE в процессе инициализации. Таким образом, для полноценной проверки нам достаточно определить адрес PEB в другом процессе с помощью Native API NtQueryInformationProcess, считать структуру PEB, используя ReadProcessMemory, и проверить оба поля на NULL. В случае, если какое-либо из полей равно нулю, загрузка PE ещё не завершена; иначе, процесс уже инициализирован и загрузчиком передано управление на точку входа.

Теперь можно написать функцию ожидания. Вот мой вариант (возвращает 0 в случае успешного ожидания и WAIT_TIMEOUT, если время ожидания истекло):

Работает стабильно. Один из комментаторов в MSDN указывает на возможные проблемы с WOW64, но я никаких проблем пока не обнаружил.

Panorama Theme by Themocracy