WdfIoQueueReadyNotify 函数 (wdfio.h)
[适用于 KMDF 和 UMDF]
WdfIoQueueReadyNotify 方法注册(或取消注册)事件回调函数,该函数框架每次为空的指定 I/O 队列每次接收一个或多个 I/O 请求时都会调用该函数。
语法
NTSTATUS WdfIoQueueReadyNotify(
[in] WDFQUEUE Queue,
[in, optional] PFN_WDF_IO_QUEUE_STATE QueueReady,
[in, optional] WDFCONTEXT Context
);
参数
[in] Queue
框架队列对象的句柄。
[in, optional] QueueReady
指向驱动程序提供的 EvtIoQueueState 回调函数的指针(如果驱动程序正在注册就绪通知);如果驱动程序正在取消注册,则 NULL。
[in, optional] Context
框架传递给 EvtIoQueueState 回调函数的驱动程序提供的上下文信息的非类型化指针,如果驱动程序正在注册就绪通知,或 NULL(如果驱动程序正在取消注册)。
返回值
如果作成功,WdfIoQueueReadyNotify 将返回STATUS_SUCCESS。 否则,此方法可能会返回以下值之一:
返回代码 | 说明 |
---|---|
|
驱动程序提供了无效句柄。 |
|
如果出现以下情况之一,则返回此值:
|
此方法还可以 返回其他NTSTATUS 值。
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
注解
在驱动程序调用 WdfIoQueueReadyNotify 以注册 EvtIoQueueState 回调函数后,框架会在指定的队列的状态从空更改为非空时调用回调函数。 具体而言,框架在请求到达空队列时调用 EvtIoQueueState,即使驱动程序仍拥有以前从尚未完成的队列传递的请求。 可以通过在队列创建时在 WDF_OBJECT_ATTRIBUTES 中指定 ExecutionLevel 来修改回调运行所在的 IRQL。 有关详细信息,请参阅EVT_WDF_IO_QUEUE_STATE的“备注”部分。
当指定的队列停止时,框架不会调用 EvtIoQueueState。 队列启动时,如果队列不为空,框架将调用 EvtIoQueueState。
驱动程序只能针对使用 手动调度 方法的 I/O 队列调用 WdfIoQueueReadyNotify。
EvtIoQueueState 回调函数通常调用 WdfIoQueueRetrieveNextRequest 或 WdfIoQueueRetrieveRequestByFileObject,以检索自上次执行回调函数以来到达的所有请求。
若要阻止框架调用 EvtIoQueueState 回调函数,驱动程序必须再次调用 WdfIoQueueReadyNotify,并将 QueueReady 参数设置为 NULL。 但是,驱动程序必须首先调用 WdfIoQueueStop 或 WdfIoQueueStopSynchronously 来停止 I/O 队列。 驱动程序随后可以调用 WdfIoQueueStart 以重启队列。
当驱动程序调用 WdfIoQueueReadyNotify 注册 EvtIoQueueState 回调函数时,框架可以在 WdfIoQueueReadyNotify 返回之前调用回调函数。
有关 WdfIoQueueReadyNotify 方法的详细信息,请参阅 I/O 请求的调度方法。
例子
下面的代码示例注册驱动程序的 EvtIoQueueReady 函数,以便在指定的 I/O 队列收到 I/O 请求时调用此函数。
Status = WdfIoQueueReadyNotify(
ReadQueue,
EvtIoQueueReady,
myQueueContext
);
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | wdfio.h (包括 Wdf.h) |
图书馆 | Wdf01000.sys(KMDF):WUDFx02000.dll (UMDF) |
IRQL | <= DISPATCH_LEVEL |
DDI 符合性规则 | DriverCreate(kmdf),KmdfIrql(kmdf),KmdfIrql2(kmdf),KmdfIrqlExplicit(kmdf) |