[KMDF にのみ適用]
WdfUsbTargetDeviceFormatRequestForUrb メソッドは、URBで記述されている要求パラメーターを使用して、指定された USB デバイスの USB 要求をビルドしますが、要求は送信されません。
構文
NTSTATUS WdfUsbTargetDeviceFormatRequestForUrb(
[in] WDFUSBDEVICE UsbDevice,
[in] WDFREQUEST Request,
[in] WDFMEMORY UrbMemory,
[in, optional] PWDFMEMORY_OFFSET UrbMemoryOffset
);
パラメーター
[in] UsbDevice
WdfUsbTargetDeviceCreateWithParametersへの以前の呼び出しから取得された USB デバイス オブジェクトへのハンドル。
[in] Request
フレームワーク要求オブジェクトへのハンドル。 詳細については、次の「解説」セクションを参照してください。
[in] UrbMemory
URB 構造体または構造体の共用体メンバーの 1 つを含むフレームワーク メモリ オブジェクトへのハンドル。 (URB 構造体のすべての共用体メンバーには、_URB_HEADER 構造体が含まれています。
ドライバーが以前に WdfUsbTargetDeviceCreateWithParameters 呼び出UsbDeviceを作成する場合、ドライバーは WdfUsbTargetDeviceCreateUrb を使用するか、WdfUsbTargetDeviceCreateIsochUrb を して、このメモリ オブジェクトに含まれる URB を作成する必要があります。 それ以外の場合は、バグ チェックが発生します。
[in, optional] UrbMemoryOffset
省略可能なバイト オフセットと長さの値を提供する呼び出し元によって割り当てられた WDFMEMORY_OFFSET 構造体へのポインター。 フレームワークでは、これらの値を使用して、UrbMemory が指定するメモリ内の URB の開始アドレス 決定します。 このポインターが NULL 場合、URB は UrbMemory メモリの先頭にあります。
戻り値
WdfUsbTargetDeviceFormatRequestForUrb 、操作が成功した場合にSTATUS_SUCCESSを返します。 それ以外の場合、このメソッドは次のいずれかの値を返すことができます。
リターン コード | 形容 |
---|---|
|
無効なパラメーターが検出されました。 |
|
メモリが不足していました。 |
|
UsbMemoryOffset パラメーターが指定したオフセットが無効でした。 |
このメソッドは、他のNTSTATUS 値を返す場合もあります。
ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。
備考
WdfUsbTargetDeviceFormatRequestForUrbを使用し、その後に WdfRequestSend して、USB コントロール転送要求を同期的または非同期的に送信します。 または、WdfUsbTargetDeviceSendUrbSynchronously メソッドを使用して、要求を同期的に送信します。
ドライバーが I/O キューで受信した I/O 要求を転送することも、新しい要求を作成して送信することもできます。
ドライバーが I/O キューで受信した I/O 要求を転送するには、WdfUsbTargetDeviceFormatRequestForUrb メソッドの Request パラメーターに対して、受信した要求のハンドルを指定します。
新しい I/O 要求を作成するには、WdfRequestCreate 呼び出して要求オブジェクトを事前割り当てします。 WdfUsbTargetDeviceFormatRequestForUrb メソッドの Request パラメーターの要求ハンドルを指定します。 WdfRequestReuse 呼び出すことによって、要求オブジェクトを再利用できます。 ドライバーの EvtDriverDeviceAdd コールバック関数は、デバイスの要求オブジェクトを事前割り当てできます。
WdfUsbTargetDeviceFormatRequestForUrb を呼び出して I/O 要求を書式設定した後、ドライバーは WdfRequestSend を呼び出して、要求を (同期的または非同期的に) I/O ターゲットに送信する必要があります。 送信および忘れオプション を使用して要求を送信しないでください。
同じ要求を使用 WdfUsbTargetDeviceFormatRequestForUrb を複数回呼び出しても、追加のリソース割り当ては発生しません。 そのため、WdfRequestCreate がSTATUS_INSUFFICIENT_RESOURCESを返す可能性を減らすために、ドライバーの EvtDriverDeviceAdd コールバック関数は、WdfRequestCreate を呼び出して、デバイスの 1 つ以上の要求オブジェクトを事前割り当てできます。 その後、ドライバーは、WdfRequestReuse 呼 び出し)、再フォーマット (WdfUsbTargetDeviceFormatRequestForUrbの呼び出し)、および各要求オブジェクトの再送信 (WdfRequestSendの呼び出し) を、後で WdfRequestCreate STATUS_INSUFFICIENT_RESOURCES戻り値を危険にさらすことなく再利用できます。 再利用された要求オブジェクトに対して WdfUsbTargetDeviceFormatRequestForUrb を 後続のすべての呼び出しは、パラメーター値が変更されない場合、STATUS_SUCCESSを返します。 (ドライバーが毎回同じ要求形式メソッドを呼び出さない場合は、追加のリソースが割り当てられる可能性があります)。
I/O 要求が完了した後の状態情報の取得については、「完了情報の取得を参照してください。
WdfUsbTargetDeviceFormatRequestForUrb メソッドと USB I/O ターゲットの詳細については、「USB I/O ターゲットを参照してください。
例
次のコード例では、URB 構造体を保持するメモリ オブジェクトを作成し、URB 構造体を初期化し、WdfUsbTargetDeviceFormatRequestForUrb を呼び出して、URB 構造体の内容を使用する要求を書式設定します。 次に、この例では、CompletionRoutine コールバック関数を登録し、要求を I/O ターゲットに送信します。
WDFMEMORY urbMemory;
URB *urbBuffer;
status = WdfMemoryCreate(
WDF_NO_OBJECT_ATTRIBUTES,
NonPagedPool,
0,
sizeof(struct _URB_CONTROL_GET_CONFIGURATION_REQUEST),
&urbMemory,
NULL
);
if (!NT_SUCCESS(status)){
return status;
}
urbBuffer = (PURB) WdfMemoryGetBuffer(
urbMemory,
NULL
);
urbBuffer->UrbHeader.Function = URB_FUNCTION_GET_CONFIGURATION;
urbBuffer->UrbHeader.Length = sizeof(struct _URB_CONTROL_GET_CONFIGURATION_REQUEST);
urbBuffer->UrbControlGetConfigurationRequest.TransferBufferLength = 1 ;
urbBuffer->UrbControlGetConfigurationRequest.TransferBufferMDL = NULL;
urbBuffer->UrbControlGetConfigurationRequest.TransferBuffer = outBuffer;
urbBuffer->UrbControlGetConfigurationRequest.UrbLink = NULL;
status = WdfUsbTargetDeviceFormatRequestForUrb(
deviceContext->WdfUsbTargetDevice,
request,
urbMemory,
NULL
);
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) |
関連項目
EvtDriverDeviceAdd の
WdfUsbTargetDeviceCreateWithParameters
WdfUsbTargetDeviceSendUrbSynchronously を する