小编ead*_*cac的帖子

卸载驱动程序时取消 WSK I/O 操作

我最近一直在学习如何使用 Windows DDK 编写驱动程序。在创建了几个测试系统线程和同步的测试驱动程序后,我决定更上一层楼,编写一个驱动程序,它实际上可以做一些事情,尽管有些东西没用。

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

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

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

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

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

c windows driver wdk

5
推荐指数
0
解决办法
462
查看次数

标签 统计

c ×1

driver ×1

wdk ×1

windows ×1