WdfUsbTargetDeviceFormatRequestForCyclePort 函数 (wdfusb.h)

[仅适用于 KMDF]

WdfUsbTargetDeviceFormatRequestForCyclePort 方法为指定设备连接到的端口生成电源周期请求,但不会发送请求。

语法

NTSTATUS WdfUsbTargetDeviceFormatRequestForCyclePort(
  [in] WDFUSBDEVICE UsbDevice,
  [in] WDFREQUEST   Request
);

参数

[in] UsbDevice

USB 设备对象的句柄,该对象是从之前调用 WdfUsbTargetDeviceCreateWithParameters 获取的

[in] Request

框架请求对象的句柄。 有关更多信息,请参见下面的“备注”部分。

返回值

如果操作成功,WdfUsbTargetDeviceFormatRequestForCyclePort 将返回STATUS_SUCCESS。 否则,此方法可返回以下值之一:

返回代码 说明
STATUS_INVALID_DEVICE_STATE
设备的 USB 设备不可用。
STATUS_INSUFFICIENT_RESOURCES
可用内存不足。
 

此方法还可能返回其他 NTSTATUS 值

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

注解

使用 WdfUsbTargetDeviceFormatRequestForCyclePort(后跟 WdfRequestSend)以同步或异步方式发送电源周期请求。 或者,使用 WdfUsbTargetDeviceCyclePortSynchronously 方法以同步方式发送请求。

在驱动程序调用 WdfRequestSend 之前,它必须调用 WdfIoTargetStop ,并且必须 完成取消 它已发送到 I/O 目标的所有 I/O 请求。 在周期请求完成之前,驱动程序不得向 I/O 目标发送其他 I/O 请求。

可以转发驱动程序在 I/O 队列中收到的 I/O 请求,也可以创建并发送新请求。

若要转发驱动程序在 I/O 队列中收到的 I/O 请求,请为 WdfUsbTargetDeviceFormatRequestForCyclePort 方法的 Request 参数指定接收的请求句柄。

若要创建新的 I/O 请求,请调用 WdfRequestCreate 以预分配请求对象。 为 WdfUsbTargetDeviceFormatRequestForCyclePort 方法的 Request 参数提供 请求 句柄。 可以通过调用 WdfRequestReuse 重用请求对象。 驱动程序的 EvtDriverDeviceAdd 回调函数可以预分配设备的请求对象。

调用 WdfUsbTargetDeviceFormatRequestForCyclePort 以格式化 I/O 请求后,驱动程序必须调用 WdfRequestSend 以同步或异步方式将请求 () 发送到 I/O 目标。 此对 WdfRequestSend 的 调用必须在 IRQL = PASSIVE_LEVEL进行。

对使用相同请求的 WdfUsbTargetDeviceFormatRequestForCyclePort 的多次调用不会导致额外的资源分配。 因此,为了降低 WdfRequestCreate 返回STATUS_INSUFFICIENT_RESOURCES的可能性,驱动程序的 EvtDriverDeviceAdd 回调函数可以调用 WdfRequestCreate 来预分配设备的一个或多个请求对象。 驱动程序随后可以重复使用 (调用 WdfRequestReuse) 、重新设置格式 (调用 WdfUsbTargetDeviceFormatRequestForCyclePort) ,并重新发送 (调用 WdfRequestSend) 每个请求对象,而不会因以后调用 WdfRequestCreate 而STATUS_INSUFFICIENT_RESOURCES返回值。 如果参数值不更改,则对 WdfUsbTargetDeviceFormatRequestForCyclePort 的所有后续调用都将返回STATUS_SUCCESS。 (如果驱动程序不每次调用相同的请求格式设置方法,则可能会分配其他资源。)

有关 WdfUsbTargetDeviceFormatRequestForCyclePort 方法和 USB I/O 目标的详细信息,请参阅 USB I/O 目标

示例

下面的代码示例设置 power-cycle 请求的格式,注册 CompletionRoutine 回调函数,并将请求发送到 I/O 目标。

status = WdfUsbTargetDeviceFormatRequestForCyclePort(
                                            UsbDevice,
                                            request
                                            );
if (!NT_SUCCESS(status)){
    return status;
}
WdfRequestSetCompletionRoutine(
                               request,
                               MyCompletionRoutine,
                               NULL
                               );

if (WdfRequestSend(
                   request,
                   WdfUsbTargetDeviceGetIoTarget(UsbDevice),
                   NULL
                   ) == FALSE) {
    status = WdfRequestGetStatus(request);
}

要求

要求
目标平台 通用
最低 KMDF 版本 1.0
标头 wdfusb.h (包括 Wdfusb.h)
Library Wdf01000.sys (请参阅框架库版本控制.)
IRQL <=DISPATCH_LEVEL
DDI 符合性规则 DriverCreate (kmdf) KmdfIrql (kmdf) KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf) , RequestFormattedValid (kmdf) RequestSendAndForgetNoFormatting (kmdf) RequestSendAndForgetNoFormatting2 (kmdf) UsbKmdfIrql (kmdf) UsbKmdfIrql2 (kmdf) 、UsbKmdfIrqlExplicit (kmdf)

另请参阅

EvtDriverDeviceAdd

WdfRequestReuse

WdfRequestSend

WdfUsbTargetDeviceCreateWithParameters

WdfUsbTargetDeviceCyclePortSynchronously