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

C 卸载驱动程序时取消WSK I/O操作,c,windows,driver,wdk,C,Windows,Driver,Wdk,最近我一直在学习如何用WindowsDDK编写驱动程序。在创建了几个测试驱动程序来测试系统线程和同步之后,我决定将其提高一个档次,并编写一个实际执行某些操作的驱动程序,尽管这些操作毫无用处 目前,我的驱动程序使用Winsock内核连接到我的另一台计算机,只是循环并回显我发送给它的任何内容,直到它得到命令“exit”,这导致它脱离循环。在我的循环中,在调用WskReceive()从另一台计算机获取一些数据后,我使用KeWaitForMultipleObjects()等待两个同步事件中的任何一个。B

最近我一直在学习如何用WindowsDDK编写驱动程序。在创建了几个测试驱动程序来测试系统线程和同步之后,我决定将其提高一个档次,并编写一个实际执行某些操作的驱动程序,尽管这些操作毫无用处

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

当我发送“exit”命令时,线程会毫无问题地终止,之后我可以安全地卸载驱动程序。但是,如果我试图在驱动程序仍在等待来自另一台计算机的数据时停止该驱动程序,它会出现蓝色屏幕,显示错误:
driver\u UNLOADED\u而不取消\u PENDING\u操作

在获得EndEvent之后但在退出循环之前,我尝试使用
IoCancelIrp()
取消IRP,并使用
IoCompleteRequest()
完成IRP,但这两种方法都会给我
驱动程序IRQL\u不小于或等于
错误

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

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