WdfUsbTargetPipeAbortSynchronously 函数 (wdfusb.h)
[适用于 KMDF 和 UMDF]
WdfUsbTargetPipeAbortSynchronously 方法生成中止请求,并将其同步发送到指定的 USB 管道。
语法
NTSTATUS WdfUsbTargetPipeAbortSynchronously(
[in] WDFUSBPIPE Pipe,
[in, optional] WDFREQUEST Request,
[in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions
);
参数
[in] Pipe
通过调用 WdfUsbInterfaceGetConfiguredPipe 获取的框架管道对象的句柄。
[in, optional] Request
框架请求对象的句柄。 此参数是可选的,可以为 NULL。 有关更多信息,请参见下面的“备注”部分。
[in, optional] RequestOptions
指向调用方分配 的WDF_REQUEST_SEND_OPTIONS 结构的指针,该结构指定请求的选项。 此指针是可选的,可以为 NULL。 有关更多信息,请参见下面的“备注”部分。
返回值
如果操作成功,WdfUsbTargetPipeAbortSynchronously 将返回 I/O 目标的完成状态值。 否则,此方法可返回以下值之一:
返回代码 | 说明 |
---|---|
|
指定的 RequestOptions 参数不正确WDF_REQUEST_SEND_OPTIONS结构的大小。 |
|
检测到无效句柄。 |
|
可用内存不足。 |
|
调用方的 IRQL 未PASSIVE_LEVEL,或者指定的 I/O 请求已排队到 I/O 目标。 |
|
驱动程序提供了超时值,但请求未在分配的时间内完成。 |
此方法还可能返回其他 NTSTATUS 值。
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
注解
使用 WdfUsbTargetPipeAbortSynchronously 方法以同步方式发送 USB 中止请求。 若要异步发送此类请求,请使用 WdfUsbTargetPipeFormatRequestForAbort,然后使用 WdfRequestSend。
USB 中止请求会导致驱动程序的 I/O 目标取消已发送到管道的所有 I/O 请求。 当驱动程序调用 WdfUsbTargetPipeAbortSynchronous 时,框架会将 URB_FUNCTION_ABORT_PIPE 请求发送到 I/O 目标。 有关取消 USB 管道 (也称为“中止管道”) 的操作的详细信息,请参阅 USB 规范。
除非驱动程序在 RequestOptions 参数的 WDF_REQUEST_SEND_OPTIONS 结构中提供超时值,或者除非检测到错误,否则 WdfUsbTargetPipeAbortSynchronously 方法在请求完成之前不会返回。
可以转发驱动程序在 I/O 队列中收到的 I/O 请求,也可以创建并发送新请求。
若要转发驱动程序在 I/O 队列中收到的 I/O 请求,请为 WdfUsbTargetPipeAbortSynchronously 方法的 Request 参数指定接收的请求句柄。
若要创建并发送新请求,请为 Request 参数提供 NULL请求 句柄,或创建新的请求对象并提供其句柄:
- 如果提供 NULL 请求句柄,框架将使用内部请求对象。 此方法易于使用,但驱动程序无法取消请求。
- 如果调用 WdfRequestCreate 来创建一个或多个请求对象,可以通过调用 WdfRequestReuse 重用这些请求对象。 此方法使驱动程序的 EvtDriverDeviceAdd 回调函数能够预分配设备的请求对象。 此外,如果需要,另一个驱动程序线程可以调用 WdfRequestCancelSentRequest 来取消请求。
有关在 I/O 请求完成后获取状态信息的信息,请参阅 获取完成信息。
有关 WdfUsbTargetPipeAbortSynchronously 方法和 USB I/O 目标的详细信息,请参阅 USB I/O 目标。
示例
下面的代码示例将中止请求发送到为 USB 设备的接口配置的所有管道。
UCHAR i;
ULONG count;
NTSTATUS status;
PDEVICE_CONTEXT pDevContext;
pDevContext = GetDeviceContext(Device);
count = WdfUsbInterfaceGetNumConfiguredPipes(
pDevContext->UsbInterface
);
for (i = 0; i < count; i++) {
WDFUSBPIPE pipe;
pipe = WdfUsbInterfaceGetConfiguredPipe(
pDevContext->UsbInterface,
i,
NULL
);
status = WdfUsbTargetPipeAbortSynchronously(
pipe,
WDF_NO_HANDLE,
NULL
);
if (!NT_SUCCESS(status)) {
break;
}
}
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | wdfusb.h (包括 Wdfusb.h) |
Library | Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF) |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | DriverCreate (kmdf) 、 KmdfIrql (kmdf) 、 KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf) , RequestForUrbXrb (kmdf) 、 UsbKmdfIrql (kmdf) 、 UsbKmdfIrql2 (kmdf) 、 UsbKmdfIrqlExplicit (kmdf) |
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈