WdfUsbTargetDeviceFormatRequestForCyclePort 函数 (wdfusb.h)
[仅适用于 KMDF]
WdfUsbTargetDeviceFormatRequestForCyclePort 方法为指定设备附加到的端口生成电源周期请求,但不发送请求。
语法
NTSTATUS WdfUsbTargetDeviceFormatRequestForCyclePort(
[in] WDFUSBDEVICE UsbDevice,
[in] WDFREQUEST Request
);
参数
[in] UsbDevice
从上一次调用 WdfUsbTargetDeviceCreateWithParameters获取的 USB 设备对象的句柄。
[in] Request
框架请求对象的句柄。 有关详细信息,请参阅以下“备注”部分。
返回值
如果作成功,WdfUsbTargetDeviceFormatRequestForCyclePort 返回STATUS_SUCCESS。 否则,此方法可以返回以下值之一:
返回代码 | 描述 |
---|---|
|
设备的 USB 设备不可用。 |
|
内存不足。 |
此方法还可以 返回其他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 目标。 必须在 IRQL = PASSIVE_LEVEL 上调用 WdfRequestSend。
多次调用 WdfUsbTargetDeviceFormatRequestForCyclePort,而使用同一请求并不会导致额外的资源分配。 因此,为了减少 WdfRequestCreate 将返回STATUS_INSUFFICIENT_RESOURCES的可能性,驱动程序的 EvtDriverDeviceAdd 回调函数可以调用 WdfRequestCreate 来预分配设备的一个或多个请求对象。 驱动程序随后可以重复使用(调用 WdfRequestReuse)、重新调用(调用 WdfUsbTargetDeviceFormatRequestForCyclePort),并重新发送(调用 WdfRequestSend)每个请求对象,而不会危及STATUS_INSUFFICIENT_RESOURCES从以后调用 WdfRequestCreate返回值。 如果参数值不更改,则对 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) |
库 | 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) |