При работе со списком EPROCESS (WinXP SP1) я заметил одну интересную вещь: при определенных условиях, мне неизвестных, иногда после завершения процесса запись о нем сохраняется в этом списке. Т.е. PID, ImageFileName - все валидно, такой процесс действительно был, но уже завершился. А запись осталась. Внимание вопрос: как тогда узнать, жив ли очередной процесс из списка или мертв? Ведь натив-функции, типа ZwQuerySystemInformation возвращают всегда верную информацию...
Создай процесс через CreateProcess, подожди пока завершится, но не закрывай его хендлы из PROCESS_INFORMATION - это и будет твой зомби.
Т.е. пока есть открытые хэндлы, описывающие этот процесс он не удалится из списка EPROCESS? Тогда понятно. Но вопрос остается открытым - как отличить нормальный процесс от процесса-зомби? Приходит на ум одно - "мертвый" процесс не имеет потоков, нужно определить количество таковых для каждого процесса и если оно равно нулю, то этот процесс - "зомби". Поправьте если не прав...
Попробуй ObReferenceObjectByPointer для каждого процесса, если сработает, то выводи, если нет, то это процесс - "зомби". Может сработать =)
С потоками не выйдет, по-моему. Кто-нибудь может не закрыть хендл потока и он будет находиться, имхо. Twister BOOL GetExitCodeProcess( HANDLE hProcess, LPDWORD lpExitCode ); Должно получиться. Можно попробовать скопировать в этот процесс какой-нибудб хендл. Может что и получиться.
вот как раз так то их точно не отличишь GetExitCodeProcess (это вообще есть в ядре?) тоже не оч хорошее решение - процесс может завершиться с кодом STILL_RUNNING наверное, идея с потоками самая реалистичная, непонятно только, удаляются ли из процесса ссылки на завершившиеся потоки
Twister Юзай WaitForSingleObject(hProcess, TimeOut) - когда процесс завершается, "The state of the process object becomes signaled, satisfying any threads that had been waiting for the process to terminate". Так что если функция вернет WAIT_OBJECT_0, этот процесс точно завершился.
Process =>> PsActiveProcessHead ProcessLinksOffset =>> Смещение на поле структуры (для ХР - 0x088) pEPROCESS = (PEPROCESS)((ULONG)Process - ProcessLinksOffset); Deleted = *(PULONG)((ULONG)Process - ProcessLinksOffset + 4); if (Deleted == 1) { ... процесса нет ... }
Atlantic Прочитай еще раз топик внимательно... MegaZu Не совсем понял, ты имеешь ввиду проверять поле EPROCESS.Pcb.Header.SignalState ?
Twister Да я в курсе, что тебе это надо сделать из ринг-0. Но неужели там нет никакого способа узнать, что объект "процесс" перешел в сигнальное состояние? это ведь оно, я правильно понял?
Atlantic Объект-процесс и запись в списке EPROCESS это разные вещи... MegaZu Гуд. Будем исправлять. Всем спасибо.
<Т.е. пока есть открытые хэндлы, описывающие этот процесс он не удалится из списка EPROCESS? Тогда понятно. Но вопрос остается открытым - как отличить нормальный процесс от процесса-зомби? Приходит на ум одно - "мертвый" процесс не имеет потоков, нужно определить количество таковых для каждого процесса и если оно равно нулю, то этот процесс - "зомби". Поправьте если не прав... > Потоки данного процесса не планируются. Как это узнать я думаю знаешь