Корректная выгрузка драйвера после снятия перехвата

Тема в разделе "WASM.NT.KERNEL", создана пользователем d2k9, 8 дек 2011.

  1. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Хукаю NtDeviceIoControlFile() на Windows 7 x86 через патчинг SSDT, всё ОК работает после установки хука, но после снятия перехвата в момент выгрузки драйвера БСОД. В чём дело пока до конца не разобрался. Может кто подскажет?

    Код (Text):
    1. #define SYSTEM_SERVICE(p) KeServiceDescriptorTable.ServiceTableBase[p]
    2.  
    3. NT_DEVICE_IO_CONTROL_FILE OldNtDeviceIoControlFile;
    4.  
    5. NTSTATUS NewNtDeviceIoControlFile()
    6. {
    7. ...
    8. }
    9.  
    10. void RemoveHook(void)
    11. {
    12.  
    13.     DbgMsg("Hook removing...\n");
    14.  
    15.     __asm
    16.     {
    17.         push eax
    18.         mov  eax, CR0
    19.         and  eax, 0FFFEFFFFh
    20.         mov  CR0, eax
    21.         pop  eax
    22.     }
    23.  
    24.     InterlockedExchange((PLONG)&SYSTEM_SERVICE(FuncId), (ULONG)OldNtDeviceIoControlFile);
    25.  
    26.     __asm
    27.     {
    28.         push eax
    29.         mov  eax, CR0
    30.         or   eax, NOT 0FFFEFFFFh
    31.         mov  CR0, eax
    32.         pop  eax
    33.     }
    34.     DbgMsg("Hook removed\n");
    35. }
    36.  
    37. void UnloadDriver(IN PDRIVER_OBJECT DriverObject)
    38. {  
    39.     RemoveHook();
    40.  
    41.     DbgMsg("DriverUnloaded()\n");
    42.  
    43.     UNREFERENCED_PARAMETER(DriverObject);
    44.     return;
    45. }
    WinDBG

    Я так понимаю у меня драйвер выгружается без ожидания завершения работы потоков с моей функцией перехвата NewNtDeviceIoControlFile() - как мне сделать ожидание завершения всех поступающих вызовов к ней?
     
  2. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Сделай счетчик вхождений в твой перехватчик. сними перехват и если счетчик равен 0 выгружай драйвер.
    Или под перехватчик выдели отдельный участок памяти которую будешь или позже или вообще не выгружать.
     
  3. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    d2k9
    Для начала онакомтесь: http://wasm.ru/forum/viewtopic.php?id=42791
     
  4. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    спасибо, первый вариант проще им и воспользуюсь - теперь возник вопрос а как сделать таймер чтобы узнать когда счетчик равен 0, а до этого UnloadDriver() висел ожидая этого события?
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    d2k9
    Можно просто опрашивать счетчик в цикле с KeDelayExecutionThread.
     
  6. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Mika0x65
    так и сделал немного подумав, но всё равно спасибо, тему можно закрывать