ExitProcess

Тема в разделе "WASM.WIN32", создана пользователем Crash, 4 ноя 2006.

  1. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Привет всем!

    Известно, что ExitProcess дважды вызывает ZwTerminateProcess. Первый раз с хендлом, равным 0, второй раз - с хендлом, равным 0xFFFFFFFF.

    При перехвате ZwTerminateProcess обнаружил такую вещь: при первом вызове ZwTerminateProcess с хендлом 0 все нормально, функция запускается и завершается. А при втором вызове с 0xFFFFFFFF - функция не завершается.

    Перехват делаю так:

    Код (Text):
    1. NTSTATUS NewZwTerminateProcess(HANDLE ProcessHandle, NTSTATUS ExitStatus) {
    2.     NTSTATUS status;
    3.  
    4.     DbgPrint("Begin NewZwTerminateProcess(%x), %x", ProcessHandle, ExitStatus);
    5.     status = OldZwTerminateProcess(ProcessHandle, ExitStatus);
    6.     DbgPrint("End NewZwTerminateProcess(%x), %x", ProcessHandle, ExitStatus);
    7.  
    8.     return status;
    9. }
    Запускаю, например, notepad. Затем закрываю его окно и при этом смотрю в окно DbgView.
    Появляются строки:
    Begin NewZwTerminateProcess(0), 0
    End NewZwTerminateProcess(0), 0
    Begin NewZwTerminateProcess(FFFFFFFF), 0

    Причем это для любой программы. Здесь видно, что OldZwTerminateProcess(0xFFFFFFFF, 0) не завершается, т.к. выполнение не доходит до строки со вторым DbgPrint.

    Странно. Или я чего-то не знаю? Кто-нибудь знает, в чем дело?
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Crash
    А куда он может вернуться, если процесс уже сдох?
     
  3. BUGOR

    BUGOR New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2005
    Сообщения:
    44
    Ты интересный, а зачем после "конца" программы, который характеризуется вызовом ExitProcess, управление опять должно возвращаться твоей программе? Естественно процесс уничтожается не возвращаясь из ZwTerminateProcess.

    Quantum опередил :)
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Процесс-то завершается. Ты перехват из dll небось делаешь?
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Эк все ринулись отвечать :)
     
  6. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Господа, я забыл сказать, что перехват делаю в драйвере. Процесс, естественно, завершается. Есть еще какие-нибудь соображения?
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Посмотри реализацию ZwTerminateProcess.