Пишу драйвер, ставит хуки в SDT и IDT. Все работало замечательно, но сегодня заметил странное поведение - если выгрузить драйвер при активном сканере DrWeb то падаем в синий экран с ошибкой DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS Я так понял надо использовать KeWaitForMultipleObjects но как - не знаю, прошу помощи.
Из WinDDK: The driver failed to cancel lookaside lists, DPCs, worker threads, or other such items before unloading. Вывод: надо канселить или ждать завершения для всех Pending IRPs и чистить за собой все системные ресурсы
А ты учел, что один из потоков может прерваться в теле обработчика хука, например, если у него истечет квант времени, а когда ты выгрузишь драйвер он получит управление и выпадет в осадок, если я не ошибаюсь, то кажется именно с таким кодом. Можно завести счетчик, в котором регистрировать сколько потоков вошло в тело твоего драйвера, а потом сколько вышло, и не выгружать драйвер пока все не выйдут. Это уменьшит вероятность, однако не на 100%, поскольку чужой поток может прерваться перед тем как это зарегистрирует счетчик (на первых инструкциях в теле хука). Потому-то большинство драйверов, кот. ставят хуки делают НЕВЫГРУЖАЕМЫМИ.