Недавно я научился писать драйверы для Windows DDK. После создания нескольких тестовых драйверов, экспериментирующих с системными потоками и синхронизацией, я решил повысить его и написать драйвер, который действительно что-то делает, хотя и бесполезный.
В настоящее время мой драйвер подключается к моему другому компьютеру с помощью ядра Winsock и просто зацикливается и возвращает все, что я ему отправляю, до тех пор, пока не получит команду «выход», что приведет к его выходу из цикла. В моем цикле после вызова WskReceive()
для получения данных с другого компьютера я использую KeWaitForMultipleObjects()
для ожидания одного из двух событий SynchronizationEvents. BlockEvent устанавливается моим IRP CompletionRoutine()
, чтобы сообщить моему потоку, что он получил некоторые данные из сокета. EndEvent устанавливается моей подпрограммой DriverUnload()
, чтобы сообщить потоку, что он выгружается и что его нужно завершить.
Когда я отправляю команду «выход», поток завершается без проблем, и я могу безопасно выгрузить драйвер после этого. Однако, если я пытаюсь остановить драйвер, пока он еще ожидает данные с другого компьютера, он отображается синим цветом с ошибкой: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
После того, как я получил EndEvent, но перед выходом из цикла, я попытался отменить IRP с помощью IoCancelIrp()
и завершить его с помощью IoCompleteRequest()
, но оба из них дают мне ошибку DRIVER_IRQL_NOT_LESS_OR_EQUAL
.
Затем я попытался вызвать WskDisconnect()
, надеясь, что это приведет к завершению операции приема, но это вернуло меня к ошибке CANCELLING_PENDING_OPERATIONS
.
Как отменить ожидающую операцию ввода-вывода из моего сокета WSK на IRQL, на котором я работаю, когда драйвер выгружен?