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) |
Library | Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF) |
IRQL | <= DISPATCH_LEVEL |
DDI 符合性规则 | DriverCreate (kmdf) 、 KmdfIrql (kmdf) 、 KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf) |