5

我最近一直在学习如何使用 Windows DDK 编写驱动程序。在创建了一些测试驱动程序并尝试了系统线程和同步之后,我决定将其提高一个档次并编写一个可以实际做某事的驱动程序,尽管它是无用的。

目前,我的驱动程序使用 Winsock 内核连接到我的另一台计算机,并且只是循环并回显我发送给它的任何内容,直到它收到命令“退出”,这会导致它跳出循环。在我的循环中,在我调用WskReceive()从另一台计算机获取一些数据之后,我习惯于KeWaitForMultipleObjects()等待两个 SynchronizationEvents 中的任何一个。BlockEvent 由我的 IRP 设置,CompletionRoutine()让我的线程知道它从套接字接收到一些数据。EndEvent 由我的DriverUnload()例程设置,以告诉线程它正在被卸载并且它需要终止。

当我发送“退出”命令时,线程没有问题地终止,之后我可以安全地卸载驱动程序。但是,如果我在驱动程序仍在等待另一台计算机的数据时尝试停止驱动程序,则会出现蓝屏错误:DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS

在我得到 EndEvent 之后但在我退出循环之前,我尝试用 取消 IRPIoCancelIrp()并用 完成它IoCompleteRequest(),但这两个都给了我DRIVER_IRQL_NOT_LESS_OR_EQUAL错误。

然后我尝试调用WskDisconnect(),希望这会导致接收操作完成,但这让我回到了CANCELLING_PENDING_OPERATIONS错误。

卸载驱动程序时,如何在运行的 IRQL 上取消 WSK 套接字的挂起 I/O 操作?

4

0 回答 0