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

时间:2010-05-21 16:47:39

标签: c windows driver wdk

我最近一直在学习如何使用Windows DDK编写驱动程序。在创建了一些试验系统线程和同步的测试驱动程序之后,我决定将其提升一个档次并编写一个实际执行某些操作的驱动程序,尽管它没用。

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

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

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

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

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

0 个答案:

没有答案
相关问题