我使用在WDK的KbFilter例如,尝试在由KbFilter_ServiceCallback称为并且因此在DISPATCH_LEVEL执行功能发送IOCTL。该功能只是必须发送一个IOCTL和回报,我不是等待被填充的输出缓冲器,因此它可以是异步的,发射后不管。

我目前使用的WDF功能的 WdfIoTargetFormatRequestForIoctl WdfRequestSend ,以尝试并发送在DISPATCH_LEVEL和得到什么。到WdfRequestSend呼叫正在取得成功,但IOCTL不会出现接收。

使用任一种的 WdfIoTargetSendIoctlSynchronously 或所述WDM图案的 IoBuildDeviceIoControlRequest函数()和IoCallDriver函数()需要PASSIVE_LEVEL我知道在PASSIVE_LEVEL调用这些的唯一方法是创建一个单独的运行在PASSIVE_LEVEL和经由缓冲器或队列,具有自旋锁和旗语同步传递给它的指令的线程。

谁能告诉我,如果有要的IOCTL传递给我下面的过滤器驱动程序更简单的方法,或者是线程/队列接近正常模式时,你需要在更高的IRQL做的事情?在什么情况下,我可以使用 KeRaiseIrql 而这是我应该用什么呢?感谢。

有帮助吗?

解决方案

使用IoAllocateIrp和IoCallDriver函数。它们可以在IRQL运行<= DISPATCH_LEVEL。

您不能降低你的IRQL(除非你是谁提出的话)。 KeRaiseIrql仅用于提高IRQL。到KeRaiseIrql呼叫是有效的,如果调用者指定NewIrql> = CurrentIrql。

注意:是您的IOCTL预计在DISPATCH_LEVEL

下面是一个代码段:

PIRP Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

Irp->Tail.Overlay.Thread  = PsGetCurrentThread(); 
Irp->RequestorMode        = KernelMode; 
Irp->IoStatus.Status      = STATUS_NOT_SUPPORTED; 
Irp->IoStatus.Information = 0; 

PIO_STACK_LOCATION stack  = IoGetNextIrpStackLocation(Irp); 
stack->MajorFunction      = IRP_MJ_DEVICE_CONTROL; 
stack->Parameters.DeviceIoControl.IoControlCode = ...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top