Хукаю NtDeviceIoControlFile() на Windows 7 x86 через патчинг SSDT, всё ОК работает после установки хука, но после снятия перехвата в момент выгрузки драйвера БСОД. В чём дело пока до конца не разобрался. Может кто подскажет? Код (Text): #define SYSTEM_SERVICE(p) KeServiceDescriptorTable.ServiceTableBase[p] NT_DEVICE_IO_CONTROL_FILE OldNtDeviceIoControlFile; NTSTATUS NewNtDeviceIoControlFile() { ... } void RemoveHook(void) { DbgMsg("Hook removing...\n"); __asm { push eax mov eax, CR0 and eax, 0FFFEFFFFh mov CR0, eax pop eax } InterlockedExchange((PLONG)&SYSTEM_SERVICE(FuncId), (ULONG)OldNtDeviceIoControlFile); __asm { push eax mov eax, CR0 or eax, NOT 0FFFEFFFFh mov CR0, eax pop eax } DbgMsg("Hook removed\n"); } void UnloadDriver(IN PDRIVER_OBJECT DriverObject) { RemoveHook(); DbgMsg("DriverUnloaded()\n"); UNREFERENCED_PARAMETER(DriverObject); return; } WinDBG Я так понимаю у меня драйвер выгружается без ожидания завершения работы потоков с моей функцией перехвата NewNtDeviceIoControlFile() - как мне сделать ожидание завершения всех поступающих вызовов к ней?
Сделай счетчик вхождений в твой перехватчик. сними перехват и если счетчик равен 0 выгружай драйвер. Или под перехватчик выдели отдельный участок памяти которую будешь или позже или вообще не выгружать.
спасибо, первый вариант проще им и воспользуюсь - теперь возник вопрос а как сделать таймер чтобы узнать когда счетчик равен 0, а до этого UnloadDriver() висел ожидая этого события?