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::OnRead、 IQueueCallbackWrite::OnWrite 或 IQueueCallbackDeviceIoControl::OnDeviceIoControl 事件回调函数的输入后,驱动程序可以调用 MarkCancelable 方法来启用请求取消。 稍后,驱动程序可以调用 IWDFIoRequest::UnmarkCancelable 方法来禁用取消请求。
在驱动程序调用 MarkCancelable 之前,驱动程序必须实现 IRequestCallbackCancel::OnCancel 方法。
用户模式驱动程序框架 (UMDF) 每个队列只允许一个 IRequestCallbackCancel::OnCancel 方法。 因此,当驱动程序为与特定队列关联的请求调用 MarkCancelable 以使框架能够取消这些请求时,驱动程序必须将指向同一 request-callback 对象的 IRequestCallbackCancel 接口的指针传递。 稍后,为了取消每个请求,框架在调用此 request-callback 对象的 IRequestCallbackCancel::OnCancel 方法时,将指向请求的 IWDFIoRequest 接口的指针。
驱动程序必须从 IRequestCallbackCancel::OnCancel 方法或其常规 I/O 完成路径调用 IWDFIoRequest::Complete。
在驱动程序调用 MarkCancelable 以启用取消后,当驱动程序拥有请求对象时,请求仍可取消,除非驱动程序调用 UnmarkCancelable 来禁用取消。
如果驱动程序调用 IWDFIoRequest::ForwardToIoQueue 方法将请求转发到其他队列,则以下规则适用:
-
当驱动程序将请求转发到其他队列时,无法启用取消 I/O 请求。
通常,驱动程序不应在调用 IWDFIoRequest::ForwardToIoQueue 之前调用 MarkCancelable 来启用取消请求。 或者,驱动程序可以使请求可取消。 但是,驱动程序随后必须调用 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
IRequestCallbackCancel::OnCancel