EVT_WDF_IO_QUEUE_IO_STOP回调函数 (wdfio.h)
[适用于 KMDF 和 UMDF]
驱动程序的 EvtIoStop 事件回调函数完成、重新排队或暂停对指定请求的处理,因为请求的 I/O 队列正在停止。
语法
EVT_WDF_IO_QUEUE_IO_STOP EvtWdfIoQueueIoStop;
void EvtWdfIoQueueIoStop(
[in] WDFQUEUE Queue,
[in] WDFREQUEST Request,
[in] ULONG ActionFlags
)
{...}
参数
[in] Queue
与 I/O 请求关联的框架队列对象的句柄。
[in] Request
框架请求对象的句柄。
[in] ActionFlags
一个或多个 WDF_REQUEST_STOP_ACTION_FLAGS类型标志的按位 OR,用于标识调用回调函数的原因以及请求是否可取消。
返回值
没有
注解
驱动程序在调用 WdfIoQueueCreate时注册 EvtIoStop 回调函数。 有关调用 WdfIoQueueCreate的详细信息,请参阅 创建 I/O 队列。
如果驱动程序为 I/O 队列注册 EvtIoStop 回调函数,则当队列的基础设备离开其工作状态(D0)时,框架将调用它。 该框架针对驱动程序尚未 完成的每个 I/O 请求调用 EvtIoStop 回调函数,包括驱动程序 拥有 的请求以及 转发 到 I/O 目标的请求。
在大多数情况下,EvtIoStop 回调函数 完成,取消,或推迟对 I/O 请求的进一步处理。
通常,驱动程序执行以下作之一:
-
如果驱动程序拥有 I/O 请求, 它调用 WdfRequestUnmarkCancelable(如果请求是可取消的),或者调用 WdfRequestStopAcknowledge,Requeue 值为 TRUE,或者调用 WdfRequestComplete,其完成状态值为 STATUS_SUCCESS 或STATUS_CANCELLED。
在可以安全地调用 WdfRequestXxx 方法之前,驱动程序必须确保其实现 EvtIoStop 具有对请求的独占访问权限。
为此,驱动程序必须同步对请求的访问,以防止其他线程同时作请求。 你选择的同步方法将取决于驱动程序的设计。
例如,如果请求保存在共享上下文区域中,则 EvtIoStop 回调可能会获取内部驱动程序锁,从共享上下文中删除请求,然后释放该锁。 此时,EvtIoStop 回调拥有请求,并且可以安全地完成或重新排队请求。
或者,驱动程序会推迟对请求的进一步处理,并调用 WdfRequestStopAcknowledge,重新排队 值为 FALSE。
-
如果驱动程序已将 I/O 请求转发到 I/O 目标,则可以调用 WdfRequestCancelSentRequest 尝试取消请求。
或者,如果驱动程序已将 I/O 请求转发到其自己的驱动程序堆栈中的较低级别驱动程序, 和框架调用驱动程序的 EvtIoStop 回调,ActionFlags 值为 WdfRequestStopActionSuspend,驱动程序可以使用 Requeue 值 FALSE 调用 WdfRequestStopAcknowledge。 在执行此作之前,驱动程序应验证是否满足以下条件:
- 较低的驱动程序停止处理所有未完成的 I/O 请求,以响应接收设备集电源 IRP (Dx)。
- 驱动程序的 CompletionRoutine 回调函数可以在设备处于低功率状态时完成请求。
在这种情况下,框架会等待指定的请求完成,然后才能将设备(或系统)移到较低电源状态或删除设备。 这种不作可能会阻止系统进入其休眠状态或其他低系统电源状态。 在极端情况下,可能会导致系统崩溃并出现 bug 检查代码 9F。
如果在 ActionFlags 参数中设置了 WdfRequestStopRequestCancelable 标志, 驱动程序必须先调用 WdfRequestUnmarkCancelable,然后才能调用 WdfRequestComplete 以完成请求或 WdfRequestStopAcknowledge 重新排队请求。
如果驱动程序从其中一个 请求处理程序转发 I/O 请求,并在请求的 WDF_REQUEST_SEND_OPTIONS 结构中指定 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 标志,则框架不会为此请求调用驱动程序的 EvtIoStop 回调函数。 但是,如果驱动程序从另一个线程转发相同的 I/O 请求,框架可能会为此请求调用 EvtIoStop。
有关 EvtIoStop 回调函数的详细信息,请参阅 使用 Power-Managed I/O 队列。
可以在 IRQL <= DISPATCH_LEVEL调用此回调函数,除非设备或驱动程序 WDF_OBJECT_ATTRIBUTES 结构的 ExecutionLevel 成员设置为 WdfExecutionLevelPassive。
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | wdfio.h (包括 Wdf.h) |
IRQL | <= DISPATCH_LEVEL (请参阅“备注”部分) |