次の方法で共有


WdfUsbTargetPipeSendUrbSynchronously 関数 (wdfusb.h)

[KMDF にのみ適用]

WdfUsbTargetPipeSendUrbSynchronously メソッドは、指定した URB が記述する要求パラメーターを使用して、指定された USB パイプの USB 要求をビルドします。

構文

NTSTATUS WdfUsbTargetPipeSendUrbSynchronously(
  [in]           WDFUSBPIPE                Pipe,
  [in, optional] WDFREQUEST                Request,
  [in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions,
  [in]           PURB                      Urb
);

パラメーター

[in] Pipe

WdfUsbInterfaceGetConfiguredPipe呼び出すことによって取得されたフレームワーク パイプ オブジェクトへのハンドル。

[in, optional] Request

フレームワーク要求オブジェクトへのハンドル。 このパラメーターは省略可能であり、NULLできます。 詳細については、次の「解説」セクションを参照してください。

[in, optional] RequestOptions

要求のオプションを指定する呼び出し元によって割り当てられた WDF_REQUEST_SEND_OPTIONS 構造体へのポインター。 このポインターは省略可能であり、NULLできます。 詳細については、次の「解説」セクションを参照してください。

[in] Urb

ドライバー初期化 URB 構造体へのポインター。

以前に WdfUsbTargetDeviceCreateWithParameters 呼び出して UsbDevice作成 場合、ドライバーは WdfUsbTargetDeviceCreateUrb 使用するか、WdfUsbTargetDeviceCreateIsochUrb を してこの URB を作成する必要があります。

戻り値

WdfUsbTargetPipeSendUrbSynchronously 操作が成功した場合、I/O ターゲットの完了状態値を返します。 それ以外の場合、このメソッドは次のいずれかの値を返す可能性があります。

リターン コード 形容
STATUS_INFO_LENGTH_MISMATCH
RequestOptions パラメーターが指定した WDF_REQUEST_SEND_OPTIONS 構造体のサイズが正しくありません。
STATUS_INVALID_PARAMETER
無効なパラメーターが検出されました。
STATUS_INSUFFICIENT_RESOURCES
メモリが不足していました。
STATUS_INVALID_DEVICE_REQUEST
呼び出し元の IRQL がPASSIVE_LEVELされていないか、指定された I/O 要求が既に I/O ターゲットにキューに登録されています。
STATUS_IO_TIMEOUT
ドライバーがタイムアウト値を指定し、割り当てられた時間内に要求が完了しませんでした。
STATUS_REQUEST_NOT_ACCEPTED
要求 パラメーターが表す I/O 要求パケット (IRP) は、ドライバーが要求を転送するのに十分な IO_STACK_LOCATION 構造体を提供しません。
 

このメソッドは、他の NTSTATUS 値を返す場合もあります。

ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。

備考

WdfUsbTargetPipeSendUrbSynchronously メソッドを使用して、USB 要求を同期的に送信します。 このような要求を非同期に送信するには、WdfUsbTargetPipeFormatRequestForUrbを使用し、その後に WdfRequestSendします。

WdfUsbTargetPipeSendUrbSynchronously メソッドは、RequestOptions パラメーターが指す WDF_REQUEST_SEND_OPTIONS 構造体のタイムアウト値をドライバーが提供しない限り、またはエラーが検出されない限り、要求が完了するまで戻りません。

フレームワークは USB 要求を調べません。 要求によって USB パイプの状態が変更された場合、フレームワークは変更を認識しません。

ドライバーが I/O キューで受信した I/O 要求を転送することも、新しい要求を作成して送信することもできます。

ドライバーが I/O キューで受信した I/O 要求を転送するには、WdfUsbTargetPipeSendUrbSynchronously メソッドの Request パラメーターに対して、受信した要求のハンドル 指定します。

新しい要求を作成して送信するには、Request パラメーターに対して NULL 要求ハンドルを指定するか、新しい要求オブジェクトを作成してそのハンドルを指定します。

  • NULL 要求ハンドルを指定すると、フレームワークは内部要求オブジェクトを使用します。 この手法は簡単に使用できますが、ドライバーは要求をキャンセルできません。
  • WdfRequestCreate を呼び出して 1 つ以上の要求オブジェクトを作成する場合は、WdfRequestReuse呼び出すことによって、これらの要求オブジェクトを再利用できます。 この手法を使用すると、ドライバーの EvtDriverDeviceAdd コールバック関数を使用して、デバイスの要求オブジェクトを事前に割り当てることができます。 さらに、別のドライバー スレッドは、WdfRequestCancelSentRequest を呼び出して、必要に応じて要求を取り消すことができます。
ドライバーは、以外の NULL または NULLRequest パラメーターを提供するかどうかに関係なく、NULLRequestOptions パラメーターを指定できます。 たとえば、RequestOptions パラメーターを使用してタイムアウト値を指定できます。

I/O 要求が完了した後の状態情報の取得については、「完了情報の取得を参照してください。

WdfUsbTargetPipeSendUrbSynchronously メソッドと USB I/O ターゲットの詳細については、「USB I/O ターゲットの」を参照してください。

次のコード例では、URB を初期化し、USB パイプに URB を送信します。

URB  urb;
PURB  pUrb = NULL;
NTSTATUS status;

pUrb = &urb;
pUrb->UrbHeader.Length = (USHORT) sizeof(struct _URB_GET_CURRENT_FRAME_NUMBER);
pUrb->UrbHeader.Function = URB_FUNCTION_GET_CURRENT_FRAME_NUMBER;
pUrb->UrbGetCurrentFrameNumber.FrameNumber = 0; 

status = WdfUsbTargetPipeSendUrbSynchronously(
                                              Pipe,
                                              Request,
                                              NULL,
                                              pUrb
                                              );

必要条件

要件 価値
ターゲット プラットフォーム の 万国
最小 KMDF バージョン 1.0
ヘッダー wdfusb.h (Wdfusb.h を含む)
ライブラリ Wdf01000.sys (フレームワーク ライブラリのバージョン管理を参照)。
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 を する DriverCreate(kmdf), IoctlReqs(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit (kmdf) , SyncReqSend(kmdf), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf)

関連項目

WDF_REQUEST_SEND_OPTIONS

WdfRequestCancelSentRequest

WdfUsbInterfaceGetConfiguredPipe の