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(如果请求是可取消的),或者调用 WdfRequestStopAcknowledgeRequeue 值为 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 回调函数可以在设备处于低功率状态时完成请求。
对于保证在少量时间内完成的请求,驱动程序可能会选择在 EvtIoStop 中采取任何作。

在这种情况下,框架会等待指定的请求完成,然后才能将设备(或系统)移到较低电源状态或删除设备。 这种不作可能会阻止系统进入其休眠状态或其他低系统电源状态。 在极端情况下,可能会导致系统崩溃并出现 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 (请参阅“备注”部分)

另请参阅

EvtIoResume

WDF_OBJECT_ATTRIBUTES

WDF_REQUEST_STOP_ACTION_FLAGS

WdfIoQueueCreate

WdfRequestComplete

WdfRequestStopAcknowledge