WdfRequestStopAcknowledge 函数 (wdfrequest.h)
[适用于 KMDF 和 UMDF]
WdfRequestStopAcknowledge 方法通知框架驱动程序已停止处理指定的 I/O 请求。
语法
void WdfRequestStopAcknowledge(
[in] WDFREQUEST Request,
[in] BOOLEAN Requeue
);
参数
[in] Request
框架请求对象的句柄。
[in] Requeue
一个布尔值,如果 TRUE,则会导致框架将请求重新排队到队列中,以便框架再次将其传递到驱动程序。 如果 FALSE,则框架不会重新排队请求。 有关详细信息,请参阅以下“备注”部分。
返回值
没有
言论
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
如果驱动程序为 I/O 队列注册 EvtIoStop 回调函数,则当队列的基础设备离开其工作状态(D0)时,框架将调用它。 该框架针对驱动程序尚未 完成的每个 I/O 请求调用 EvtIoStop 回调函数,包括驱动程序 拥有 的请求以及 转发 到 I/O 目标的请求。 驱动程序必须完成、取消或推迟处理每个请求,方法是执行以下作之一:
- 如果驱动程序拥有请求,它可以调用 WdfRequestComplete 来完成或取消请求。
- 如果驱动程序已将请求转发到 I/O 目标,则可以调用 WdfRequestCancelSentRequest 尝试取消请求。
- 如果驱动程序推迟处理请求,则必须调用 WdfRequestStopAcknowledge。
在驱动程序完成、取消或推迟 EvtIoStop 回调函数接收的每个请求之前,框架不允许设备保留其工作状态(D0)。 这种不作可能会阻止系统进入其休眠状态或其他低系统电源状态。
当驱动程序的 EvtIoStop 回调函数调用 WdfRequestStopAcknowledge时,它可以将 Requeue 参数设置为 TRUE 或 FALSE:
-
将 重新排队 设置为 TRUE 会导致框架将请求放回其 I/O 队列。
当基础设备返回到其工作状态(D0)时,框架将向驱动程序重新传送请求。
-
将 重新排队 设置为 FALSE 会导致框架不重新排队请求。 如果驱动程序 拥有 请求,则所有权将保留在驱动程序中。 如果驱动程序转发了请求,驱动程序负责在请求完成时处理请求。 驱动程序必须停止执行任何需要硬件访问的 I/O 处理。
当基础设备返回到其工作(D0)状态时,框架将调用驱动程序的 EvtIoResume 回调函数,以便驱动程序可以继续处理请求。
在调用 WdfRequestStopAcknowledge之前,驱动程序的 EvtIoStop 回调函数必须停止所有需要访问基础设备的 I/O 请求,因为设备即将进入低功率状态。
有关 WdfRequestStopAcknowledge 方法的详细信息,请参阅 使用 Power-Managed I/O 队列。
例子
如果驱动程序调用 WdfRequestStopAcknowledge,requeue 设置为 TRUE,则必须先调用 WdfRequestUnmarkCancelable。
下面的代码示例是一个 EvtIoStop 回调函数,用于检查收到的请求是否可取消,如果是,则调用 WdfRequestUnmarkCancelable。 如果 WdfRequestUnmarkCancelable 返回STATUS_CANCELLED,则示例仅返回,因为驱动程序的 EvtRequestCancel 回调函数将处理请求。 否则,该示例调用 WdfRequestStopAcknowledge 并指定 TRUE,以便框架在基础设备返回到其工作状态时重新排队请求。
VOID
MyEvtIoStop(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN ULONG ActionFlags
)
{
NTSTATUS status;
// TODO: Take steps here to suspend and, if necessary, roll back any processing that has already occurred on this request
if (ActionFlags & WdfRequestStopRequestCancelable) {
status = WdfRequestUnmarkCancelable(Request);
if (status == STATUS_CANCELLED) {
return;
}
}
// Inform framework that driver is postponing processing, cause framework to redeliver request when device returns to D0
WdfRequestStopAcknowledge(Request, TRUE);
}
通常,如果驱动程序调用 WdfRequestStopAcknowledge,Requeue 设置为 FALSE,则会使请求保持可取消。
下面的代码示例是一个 EvtIoStop 回调函数,该函数调用 WdfRequestStopAcknowledge,并指定 FALSE,以便框架最终调用驱动程序的 EvtIoResume 回调函数,其中驱动程序恢复处理请求。
如果可以停止处理特定请求,并在以后继续处理,而不是从头开始重新传送并重启处理,则可以使用类似代码。
VOID
MyEvtIoStop(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN ULONG ActionFlags
)
{
//TODO: Take steps here to suspend processing of the request so it can be resumed when power returns
// Acknowledge the stop, but leave the request under driver's ownership.
// Provide a corresponding EvtIoResume handler to resume processing when power returns
WdfRequestStopAcknowledge(Request, FALSE);
}
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | wdfrequest.h (包括 Wdf.h) |
库 | Wdf01000.sys(KMDF):WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
DDI 符合性规则 | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), EvtIoStopCancel(kmdf), EvtIoStopCompleteOrStopAck(kmdf), EvtIoStopResume(kmdf), kmdfIrql(kmdf),KmdfIrql2(kmdf),KmdfIrqlExplicit(kmdf),RequestCompleted(kmdf),RequestCompletedLocal(kmdf),StopAckWithinEvtIoStop(kmdf) |