Привет,
есть такой код
DriverEntry()
KeInitializeEvent(&DriverData.SyncEvent, NotificationEvent, FALSE);
...
DriverThread()
PVOID lEvents[] = { &Data->SyncEvent };
KeWaitForMultipleObjects(sizeof(lEvents) / sizeof(lEvents[0]), lEvents, ...);
...
DriverUnload()
KeSetEvent(&DriverData.SyncEvent, 0, FALSE);
Больше нигде этот эвент не используется. На нем ждет только ядреный поток.
Если драйвер просто загрузить и выгрузить — все отрабатывает идеально.
Если же драйвер выполняет какие-либо операции ВВ, то при попытке выгрузки получаю бсод. Но самое странное что при этом
kd> dt -r 0xF135A140 KEVENT
+0x008 WaitListHead : _LIST_ENTRY [ 0x21c07559 — 0x294a2d8e ]
+0x000 Flink : 0x21c07559 _LIST_ENTRY
+0x004 Blink : 0x294a2d8e _LIST_ENTRY
Тоесть мало того что присутствуют странные ожидальщики, так еще и адреса вообще указывают черт знает куда. Откуда это?
Не мудрено что следствием становится
FAULTING_IP:
nt!KeSetEvent+30
804f8fdc 66394616 cmp word ptr [esi+16h],ax
Похожая бага обсуждалась на OSR, но там человек использовал событие на стеке с IRP.