WdfUsbTargetPipeFormatRequestForAbort 函数 (wdfusb.h)
[适用于 KMDF 和 UMDF]
WdfUsbTargetPipeFormatRequestForAbort 方法为指定的 USB 管道生成中止请求,但它不会发送请求。
语法
NTSTATUS WdfUsbTargetPipeFormatRequestForAbort(
[in] WDFUSBPIPE Pipe,
[in] WDFREQUEST Request
);
参数
[in] Pipe
通过调用 WdfUsbInterfaceGetConfiguredPipe 获取的框架管道对象的句柄。
[in] Request
框架请求对象的句柄。 有关更多信息,请参见下面的“备注”部分。
返回值
如果操作成功,WdfUsbTargetPipeFormatRequestForAbort 将返回 I/O 目标的完成状态值。 否则,此方法可返回以下值之一:
返回代码 | 说明 |
---|---|
|
检测到无效的参数。 |
|
可用内存不足。 |
|
请求参数表示的 I/O 请求数据包 (IRP) 不提供足够的IO_STACK_LOCATION结构来允许驱动程序转发请求。 |
此方法还可能返回其他 NTSTATUS 值。
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
注解
使用 WdfUsbTargetPipeFormatRequestForAbort(后跟 WdfRequestSend)以同步或异步方式发送 USB 中止请求。 或者,使用 WdfUsbTargetPipeAbortSynchronously 方法以同步方式发送请求。
USB 中止请求会导致驱动程序的 I/O 目标取消已发送到管道的所有 I/O 请求。 当驱动程序调用 WdfRequestSend 时,框架会将 URB_FUNCTION_ABORT_PIPE 请求发送到 I/O 目标。 有关取消 USB 管道 (也称为“中止管道”) 的操作的详细信息,请参阅 USB 规范。
可以转发驱动程序在 I/O 队列中收到的 I/O 请求,也可以创建并发送新请求。
若要转发驱动程序在 I/O 队列中收到的 I/O 请求,请为 WdfUsbTargetPipeFormatRequestForAbort 方法的 Request 参数指定接收的请求句柄。
若要创建新的 I/O 请求,请调用 WdfRequestCreate 以预分配请求对象。 为 WdfUsbTargetPipeFormatRequestForAbort 方法的 Request 参数提供 请求 句柄。 可以通过调用 WdfRequestReuse 重用请求对象。 驱动程序的 EvtDriverDeviceAdd 回调函数可以预分配设备的请求对象。
调用 WdfUsbTargetPipeFormatRequestForAbort 以格式化 I/O 请求后,驱动程序必须调用 WdfRequestSend 以同步或异步方式将请求 () 发送到 I/O 目标。
对使用同一请求的 WdfUsbTargetPipeFormatRequestForAbort 的多次调用不会导致额外的资源分配。 因此,为了降低 WdfRequestCreate 返回STATUS_INSUFFICIENT_RESOURCES的可能性,驱动程序的 EvtDriverDeviceAdd 回调函数可以调用 WdfRequestCreate 来预分配设备的一个或多个请求对象。 驱动程序随后可以重复使用 (调用 WdfRequestReuse) 、重新设置格式 (调用 WdfUsbTargetPipeFormatRequestForAbort) ,并重新发送 (调用 WdfRequestSend) 每个请求对象,而不会有STATUS_INSUFFICIENT_RESOURCES从以后调用 WdfRequestCreate 返回值的风险。 如果参数值不更改,对 WdfUsbTargetPipeFormatRequestForAbort 的所有后续调用都将返回STATUS_SUCCESS。 (如果驱动程序不每次调用相同的请求格式设置方法,则可能会分配其他资源。)
有关在 I/O 请求完成后获取状态信息的信息,请参阅 获取完成信息。
有关 WdfUsbTargetPipeFormatRequestForAbort 方法和 USB I/O 目标的详细信息,请参阅 USB I/O 目标。
示例
下面的代码示例格式化 USB 管道的中止请求,注册 CompletionRoutine 回调函数,并发送请求。
status = WdfUsbTargetPipeFormatRequestForAbort(
pipe,
Request
);
if (!NT_SUCCESS(status)) {
goto Exit;
}
WdfRequestSetCompletionRoutine(
Request,
AbortCompletionRoutine,
pipe
);
if (WdfRequestSend(
Request,
WdfUsbTargetPipeGetIoTarget(pipe),
WDF_NO_SEND_OPTIONS
) == FALSE) {
status = WdfRequestGetStatus(Request);
goto Exit;
}
Exit:
if (!NT_SUCCESS(status)) {
WdfRequestCompleteWithInformation(
Request,
status,
0
);
}
return;
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | wdfusb.h (包括 Wdfusb.h) |
Library | Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
DDI 符合性规则 | DriverCreate (kmdf) 、 KmdfIrql (kmdf) 、 KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf) , RequestFormattedValid (kmdf) 、 RequestForUrbXrb (kmdf) 、 RequestSendAndForgetNoFormatting (kmdf) 、 RequestSendAndForgetNoFormatting 2 (kmdf) 、 UsbKmdfIrql (kmdf) 、 UsbKmdfIrql2 (kmdf) 、 UsbKmdfIrqlExplicit (kmdf) |