gpt4 book ai didi

c++ - 从 IRQL=DISPATCH_LEVEL (KbFilter/KMDF) 发送 IOCTL

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:17 32 4
gpt4 key购买 nike

我正在使用 WDK 中的 KbFilter 示例,尝试在由 KbFilter_ServiceCallback 调用并因此在 DISPATCH_LEVEL 执行的函数中发送 IOCTL。该函数只需发送一个 IOCTL 并返回,而不是等待输出缓冲区被填充,因此它可以是异步的,即触发即忘。

我目前正在使用 WDF 函数 WdfIoTargetFormatRequestForIoctlWdfRequestSend 尝试在 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。如果调用者指定 NewIrql >= CurrentIrql,则对 KeRaiseIrql 的调用是有效的。

注意:您的 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 = ...

关于c++ - 从 IRQL=DISPATCH_LEVEL (KbFilter/KMDF) 发送 IOCTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1513092/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com