Canceling a WSK I/O operation when driver is unloading
I've been learning how to write drivers with the Windows DDK recently. After creating a few test drivers experimenting with system threads and synchronization, I decided to step it up a notch and write a driver that actually does something, albeit something useless.
Currently, my driver connects to my other computer using Winsock Kernel and just loops and echoes back whatever I send to it until it gets the command "exit", which causes it to break out of the loop. In my loop, after I call WskReceive()
to get some data from the other computer, I use KeWaitForMultipleObjects()
to wait for either of two SynchronizationEvents. BlockEvent gets set by my IRP's CompletionRoutine()
to let my thread kn开发者_运维知识库ow that it's received some data from the socket. EndEvent gets set by my DriverUnload()
routine to tell the thread that it's being unloaded and it needs to terminate.
When I send the "exit" command, the thread terminates with no problems, and I can safely unload the driver afterward. If I try to stop the driver while it's still waiting on data from the other computer, however, it blue screens with the error: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
After I get the EndEvent but before I exit the loop, I've tried canceling the IRP with IoCancelIrp()
and completing it with IoCompleteRequest()
, but both of those give me the DRIVER_IRQL_NOT_LESS_OR_EQUAL
error.
I then tried calling WskDisconnect()
, hoping that would cause the receive operation to complete, but that took me back to the CANCELLING_PENDING_OPERATIONS
error.
How do I cancel my pending I/O operation from my WSK socket at the IRQL I'm running at when the driver is unloaded?
精彩评论