IWDFIoRequest::MarkCancelable 方法(wudfddi.h)

[警告: UMDF 2 是最新版本的 UMDF,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 没有将新功能添加到 UMDF 1,并且对较新版本的 Windows 10 上的 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。 有关详细信息,请参阅 UMDF入门 。]

MarkCancelable 方法允许取消 I/O 请求。

语法

void MarkCancelable(
  [in] IRequestCallbackCancel *pCancelCallback
);

参数

[in] pCancelCallback

指向 IRequestCallbackCancel 接口的指针,该接口在取消 I/O 请求后框架调用的方法。

返回值

没有

言论

在驱动程序收到 I/O 请求作为 IQueueCallbackRead::OnReadIQueueCallbackWrite::OnWriteIQueueCallbackDeviceIoControl::OnDeviceIoControl 事件回调函数后, 驱动程序可以调用 MarkCancelable 方法来启用取消请求。 稍后,驱动程序可以调用 IWDFIoRequest::UnmarkCancelable 方法来禁用取消请求。

在驱动程序 MarkCancelable调用之前,驱动程序必须实现 IRequestCallbackCancel::OnCancel 方法。

用户模式驱动程序框架(UMDF)仅允许每个队列一个 IRequestCallbackCancel::OnCancel 方法。 因此,当驱动程序调用与特定队列关联的请求 MarkCancelable,以使框架能够取消这些请求时,驱动程序必须向同一请求回调对象的 IRequestCallbackCancel 接口传递指针。 稍后,为了取消每个请求,框架在调用此请求回调对象的 IRequestCallbackCancel::OnCancel 方法时,将指针传递给 IWDFIoRequest 接口。

驱动程序必须从 IRequestCallbackCancel::OnCancel 方法或其常规 I/O 完成路径调用 IWDFIoRequest::Complete

驱动程序调用 MarkCancelable 启用取消后,该请求在驱动程序拥有请求对象时仍可取消,除非驱动程序调用 UnmarkCancelable 禁用取消。

如果驱动程序调用 IWDFIoRequest::ForwardToIoQueue 方法将请求转发到其他队列,则适用以下规则:

  • 当驱动程序将请求转发到其他队列时,无法启用取消 I/O 请求。

    通常,驱动程序不应调用 MarkCancelable,以便在调用 IWDFIoRequest::ForwardToIoQueue之前启用取消请求。 或者,驱动程序可以取消请求。 但是,驱动程序随后必须调用 UnmarkCancelable,在调用 IWDFIoRequest::ForwardToIoQueue之前禁用取消请求。

  • 当请求位于第二个队列中时,框架拥有该请求,并且可以取消该请求,而无需通知驱动程序。
  • 框架从第二个队列取消请求并将其传递到驱动程序后,驱动程序可以调用 MarkCancelable 以启用取消。

例子

下面的代码示例设置一个请求,以便框架可以取消它。

    //
    // The QueryInteraface should not fail.
    //
    (VOID)this->QueryInterface(_uuidof(IRequestCallbackCancel),
                               (PVOID *)&cancelCallback);

    pWdfRequest->MarkCancelable(cancelCallback);

要求

要求 价值
终止支持 在 UMDF 2.0 及更高版本中不可用。
目标平台 桌面
最低 UMDF 版本 1.5
标头 wudfddi.h (包括 Wudfddi.h)
DLL WUDFx.dll

另请参阅

IQueueCallbackDeviceIoControl::OnDeviceIoControl

IQueueCallbackRead::OnRead

IQueueCallbackWrite::OnWrite

IRequestCallbackCancel

IRequestCallbackCancel::OnCancel

IWDFIoRequest

IWDFIoRequest::Complete

IWDFIoRequest::ForwardToIoQueue

IWDFIoRequest::UnmarkCancelable