开发者

Canceling a WSK I/O operation when driver is unloading

开发者 https://www.devze.com 2022-12-31 08:58 出处:网络
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 wri

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?

0

精彩评论

暂无评论...
验证码 换一张
取 消