Процесс-зомби в списке EPROCESS

Тема в разделе "WASM.NT.KERNEL", создана пользователем Twister, 11 янв 2007.

  1. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    При работе со списком EPROCESS (WinXP SP1) я заметил одну интересную вещь: при определенных условиях, мне неизвестных, иногда после завершения процесса запись о нем сохраняется в этом списке. Т.е. PID, ImageFileName - все валидно, такой процесс действительно был, но уже завершился. А запись осталась.

    Внимание вопрос: как тогда узнать, жив ли очередной процесс из списка или мертв? Ведь натив-функции, типа ZwQuerySystemInformation возвращают всегда верную информацию...
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Создай процесс через CreateProcess, подожди пока завершится, но не закрывай его хендлы из PROCESS_INFORMATION - это и будет твой зомби.
     
  3. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Т.е. пока есть открытые хэндлы, описывающие этот процесс он не удалится из списка EPROCESS? Тогда понятно. Но вопрос остается открытым - как отличить нормальный процесс от процесса-зомби? Приходит на ум одно - "мертвый" процесс не имеет потоков, нужно определить количество таковых для каждого процесса и если оно равно нулю, то этот процесс - "зомби". Поправьте если не прав...
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    в sp2 такая же ботва проскакивает
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Попробуй ObReferenceObjectByPointer для каждого процесса, если сработает, то выводи, если нет, то это процесс - "зомби". Может сработать =)
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    С потоками не выйдет, по-моему. Кто-нибудь может не закрыть хендл потока и он будет находиться, имхо.

    Twister
    BOOL GetExitCodeProcess(
    HANDLE hProcess,
    LPDWORD lpExitCode
    );
    Должно получиться.

    Можно попробовать скопировать в этот процесс какой-нибудб хендл. Может что и получиться.
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    вот как раз так то их точно не отличишь
    GetExitCodeProcess (это вообще есть в ядре?) тоже не оч хорошее решение - процесс может завершиться с кодом STILL_RUNNING
    наверное, идея с потоками самая реалистичная, непонятно только, удаляются ли из процесса ссылки на завершившиеся потоки
     
  8. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    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, этот процесс точно завершился.
     
  9. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Process =>> PsActiveProcessHead
    ProcessLinksOffset =>> Смещение на поле структуры (для ХР - 0x088)

    pEPROCESS = (PEPROCESS)((ULONG)Process - ProcessLinksOffset);
    Deleted = *(PULONG)((ULONG)Process - ProcessLinksOffset + 4);
    if (Deleted == 1)
    { ... процесса нет ... }
     
  10. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Atlantic
    Прочитай еще раз топик внимательно... ;)

    MegaZu
    Не совсем понял, ты имеешь ввиду проверять поле EPROCESS.Pcb.Header.SignalState ?
     
  11. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    Twister
    Да я в курсе, что тебе это надо сделать из ринг-0. Но неужели там нет никакого способа узнать, что объект "процесс" перешел в сигнальное состояние?
    это ведь оно, я правильно понял?
     
  12. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    угу
     
  13. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Atlantic
    Объект-процесс и запись в списке EPROCESS это разные вещи...

    MegaZu
    Гуд. Будем исправлять. Всем спасибо.
     
  14. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    <Т.е. пока есть открытые хэндлы, описывающие этот процесс он не удалится из списка EPROCESS? Тогда понятно. Но вопрос остается открытым - как отличить нормальный процесс от процесса-зомби? Приходит на ум одно - "мертвый" процесс не имеет потоков, нужно определить количество таковых для каждого процесса и если оно равно нулю, то этот процесс - "зомби". Поправьте если не прав...
    >

    Потоки данного процесса не планируются. Как это узнать я думаю знаешь