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

我一直在学习如何用Windows DDK编写驱动程序。 在创build了几个testing驱动程序来testing系统线程和同步之后,我决定把它提升一个档次,然后写一个实际上做些什么的驱动程序,尽pipe有些没用。

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

当我发送“退出”命令,线程终止没有问题,我可以安全地卸载司机后。 如果我在尝试停止驱动程序的同时还在等待来自其他计算机的数据,则会显示以下错误信息: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS

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

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

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