WdfRequestCancelSentRequest 函数 (wdfrequest.h)

[适用于 KMDF 和 UMDF]

WdfRequestCancelSentRequest 方法尝试取消调用方之前提交到 I/O 目标的 I/O 请求。

语法

BOOLEAN WdfRequestCancelSentRequest(
  [in] WDFREQUEST Request
);

参数

[in] Request

框架请求对象的句柄。

返回值

如果 WdfRequestCancelSentRequest 成功将取消请求传递到驱动程序的 I/O 目标,则返回 TRUE。 如果请求已完成或取消,或者 I/O 目标驱动程序尚未调用 WdfRequestMarkCancelableWdfRequestMarkCancelableEx,则此方法返回 FALSE

如果驱动程序提供无效的对象句柄,则会发生 bug 检查。

注解

驱动程序可以调用 WdfRequestCancelSentRequest ,以尝试通过调用 WdfRequestSend 取消之前已发送到 I/O 目标的 I/O 请求。

如果请求位于 I/O 目标的队列中,框架将取消该请求。 如果框架已将请求传递到 I/O 目标的驱动程序,并且该驱动程序已调用 WdfRequestMarkCancelableWdfRequestMarkCancelableEx 以启用取消,则框架将调用该驱动程序的 EvtRequestCancel 回调函数。 如果目标的驱动程序未调用 WdfRequestMarkCancelableWdfRequestMarkCancelableEx,则请求不会取消,除非请求变为可取消。

如果驱动程序已为请求注册 CompletionRoutine 回调函数,框架会在取消请求后调用回调函数。

通常,如果驱动程序调用 WdfRequestCancelSentRequest,则必须递增请求对象的引用计数。 有关详细信息,请参阅 同步取消已发送的请求

有关请求取消的详细信息,请参阅 取消 I/O 请求

示例

下面的代码示例来自 kmdf_fx2 示例驱动程序。 此示例是 EvtIoStop 回调函数。 由于此驱动程序将每个请求发送到其 I/O 目标,因此,如果设备已删除, EvtIoStop 回调函数会调用 WdfRequestCancelSentRequest

VOID
OsrFxEvtIoStop(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN ULONG  ActionFlags
    )
{
    UNREFERENCED_PARAMETER(Queue);

    if (ActionFlags & WdfRequestStopActionSuspend) {
        WdfRequestStopAcknowledge(Request, FALSE);
    } else if (ActionFlags & WdfRequestStopActionPurge) {
        WdfRequestCancelSentRequest(Request);
    }
    return;
}

要求

要求
目标平台 通用
最低 KMDF 版本 1.0
最低 UMDF 版本 2.0
标头 wdfrequest.h (包括 Wdf.h)
Library Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
DDI 符合性规则 DriverCreate (kmdf) EvtIoStopCancel (kmdf) EvtIoStopCompleteOrStopAck (kmdf) InvalidReqAccess (kmdf) 、 InvalidReqAccessLocal (kmdf) KmdfIrql (kmdf) KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf)

另请参阅

CompletionRoutine

EvtRequestCancel

WdfRequestMarkCancelable

WdfRequestMarkCancelableEx

WdfRequestSend