Отмена операции ввода-вывода WSK при выгрузке драйвера - PullRequest
4 голосов
/ 21 мая 2010

Недавно я научился писать драйверы для 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, на котором я работаю, когда драйвер выгружен?

...