WdfUsbTargetPipeReadSynchronously 関数 (wdfusb.h)
[KMDF と UMDF に適用]
WdfUsbTargetPipeReadSynchronously メソッドは、読み取り要求をビルドし、指定された USB 入力パイプに同期的に送信します。
構文
NTSTATUS WdfUsbTargetPipeReadSynchronously(
[in] WDFUSBPIPE Pipe,
[in, optional] WDFREQUEST Request,
[in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions,
[in, optional] PWDF_MEMORY_DESCRIPTOR MemoryDescriptor,
[out, optional] PULONG BytesRead
);
パラメーター
[in] Pipe
WdfUsbInterfaceGetConfiguredPipe
[in, optional] Request
フレームワーク要求オブジェクトへのハンドル。 このパラメーターは省略可能であり、NULL
[in, optional] RequestOptions
要求のオプションを指定する呼び出し元によって割り当てられた WDF_REQUEST_SEND_OPTIONS 構造体へのポインター。 このポインターは省略可能であり、NULL
[in, optional] MemoryDescriptor
デバイスからデータを受信するバッファーを記述する呼び出し元によって割り当てられた WDF_MEMORY_DESCRIPTOR 構造体へのポインター。 ドライバーが WdfUsbTargetPipeSetNoMaximumPacketSizeCheck
[out, optional] BytesRead
操作が成功した場合に読み取られたバイト数を受け取る場所へのポインター。 このパラメーターは省略可能であり、NULL
戻り値
WdfUsbTargetPipeReadSynchronously 操作が成功した場合、I/O ターゲットの完了状態値を返します。 それ以外の場合、このメソッドは次のいずれかの値を返すことができます。
リターン コード | 形容 |
---|---|
|
RequestOptions が指していた WDF_REQUEST_SEND_OPTIONS 構造体のサイズが正しくありません。 |
|
無効なパラメーターが検出されました。 |
|
メモリが不足していました。 |
|
呼び出し元の IRQL がPASSIVE_LEVELされなかった、無効なメモリ記述子が指定された、パイプの種類が無効、転送方向が無効、または指定された I/O 要求が既に I/O ターゲットにキューに登録されている。 |
|
バッファー サイズは、パイプの最大パケット サイズの倍数ではありません。 |
|
ドライバーがタイムアウト値を指定し、割り当てられた時間内に要求が完了しませんでした。 |
|
要求 パラメーターが表す I/O 要求パケット (IRP) は、ドライバーが要求を転送するのに十分な IO_STACK_LOCATION 構造体を提供しません。 |
このメソッドは、他の
ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。
備考
WdfUsbTargetPipeReadSynchronously メソッドを使用して、読み取り要求を同期的に送信します。 読み取り要求を非同期的に送信するには、WdfUsbTargetPipeFormatRequestForRead
WdfUsbTargetPipeReadSynchronously メソッドは、RequestOptions パラメーターが指す WDF_REQUEST_SEND_OPTIONS 構造体のタイムアウト値をドライバーが指定しない限り、またはエラーが検出されない限り、要求が完了するまで戻りません。
ドライバーが I/O キューで受信した I/O 要求を転送することも、新しい要求を作成して送信することもできます。 どちらの場合も、フレームワークには要求オブジェクトとバッファー領域が必要です。
ドライバーが I/O キューで受信した I/O 要求を転送するには:
- Request パラメーターに対して、受信した要求のハンドルを指定します。
-
受け取った要求の出力バッファーを、WdfUsbTargetPipeReadSynchronously メソッドの MemoryDescriptor パラメーターに使用します。
ドライバーは、
WdfRequestRetrieveOutputMemory を呼び出して、要求の出力バッファーを表すフレームワーク メモリ オブジェクトへのハンドルを取得し、MemoryDescriptor が指すWDF_MEMORY_DESCRIPTOR 構造体にそのハンドルを配置する必要があります。
ドライバーは、多くの場合、受信した I/O 要求を、I/O ターゲットに送信する小さな要求に分割するため、ドライバーは新しい要求を作成する可能性があります。
新しい I/O 要求を作成するには:
-
WdfUsbTargetPipeReadSynchronously メソッドの Request パラメーターで、NULL 要求ハンドルを指定するか、新しい要求オブジェクトを作成してそのハンドルを指定します。
- NULL 要求ハンドルを指定すると、フレームワークは内部要求オブジェクトを使用します。 この手法は簡単に使用できますが、ドライバーは要求をキャンセルできません。
WdfRequestCreate を呼び出して 1 つ以上の要求オブジェクトを作成する場合は、WdfRequestReuse呼び出すことによって、これらの要求オブジェクトを再利用できます。 この手法を使用すると、ドライバーの EvtDriverDeviceAdd コールバック関数を使用して、デバイスの要求オブジェクトを事前に割り当てることができます。 さらに、別のドライバー スレッドは、WdfRequestCancelSentRequest を呼び出して、必要に応じて要求を取り消すことができます。
ドライバーは、以外の NULL または NULLRequest パラメーターを提供するかどうかに関係なく、NULLRequestOptions パラメーターを指定できます。 たとえば、RequestOptions パラメーターを使用してタイムアウト値を指定できます。
-
WdfUsbTargetPipeReadSynchronously メソッドの MemoryDescriptor パラメーターのバッファー領域を指定します。
ドライバーは、ローカルに割り当てられたバッファーとして、WDFMEMORY ハンドルとして、または MDL として、このバッファー領域を指定できます。 最も便利な方法を使用できます。
必要に応じて、フレームワークは、バッファーの説明を、データ バッファーにアクセスするための I/O ターゲットの メソッド正しいものに変換します。
次の手法を使用できます。
-
ローカル バッファーを指定する
WdfUsbTargetPipeReadSynchronously は I/O 要求を同期的に処理するため、ドライバーは、次のコード例に示すように、呼び出し元ルーチンにローカルな要求バッファーを作成できます。
WDF_MEMORY_DESCRIPTOR memoryDescriptor; MY_BUFFER_TYPE myBuffer; WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&memoryDescriptor, (PVOID) &myBuffer, sizeof(myBuffer));
-
WDFMEMORY ハンドルを指定する
次のコード例に示すように、WdfMemoryCreate
呼び出すか、WdfMemoryCreatePreallocated を して、フレームワークマネージド メモリへのハンドルを取得します。 WDF_MEMORY_DESCRIPTOR memoryDescriptor; WDFMEMORY memoryHandle = NULL; status = WdfMemoryCreate(NULL, NonPagedPool, POOL_TAG, MY_BUFFER_SIZE, &memoryHandle, NULL); WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&memoryDescriptor, memoryHandle, NULL);
または、ドライバー WdfRequestRetrieveOutputMemory を呼び出して、受信した I/O 要求の出力バッファーを表すフレームワーク メモリ オブジェクトへのハンドルを取得することもできます (ドライバーがそのバッファーの内容を I/O ターゲットに渡す場合)。 WdfUsbTargetPipeReadSynchronously が I/O ターゲットに送信する新しい要求
が削除、再利用、または再フォーマットされるまで、ドライバーは受信した I/O 要求を完了してはなりません。 (WdfUsbTargetPipeReadSynchronously メモリ オブジェクトの参照カウントをインクリメントします。要求オブジェクトを削除、再利用、または再フォーマットすると、メモリ オブジェクトの参照カウントがデクリメントされます)。 -
MDL を提供する
ドライバーは、WdfRequestRetrieveOutputWdmMdl
呼び出すことによって、受信した I/O 要求に関連付けられている MDL を取得できます。
-
ローカル バッファーを指定する
ドライバーは、パイプ 連続リーダー を構成している場合、 WdfUsbTargetPipeReadSynchronousously を呼び出すことはできません。
I/O 要求が完了した後の状態情報の取得については、「完了情報の取得を参照してください。
WdfUsbTargetPipeReadSynchronously メソッドと USB I/O ターゲットの詳細については、「USB I/O ターゲットの」を参照してください。
例
次のコード例では、フレームワーク メモリ オブジェクトを作成し、
WDFMEMORY wdfMemory;
WDF_MEMORY_DESCRIPTOR readBufDesc;
ULONG BytesRead;
status = WdfMemoryCreate(
WDF_NO_OBJECT_ATTRIBUTES,
NonPagedPool,
0,
readSize,
&wdfMemory,
NULL
);
if (!NT_SUCCESS(status)){
return ;
}
buffer = WdfMemoryGetBuffer(
wdfMemory,
NULL
);
WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(
&readBufDesc,
buffer,
readSize
);
status = WdfUsbTargetPipeReadSynchronously(
Pipe,
NULL,
NULL,
&readBufDesc,
&BytesRead
);
必要条件
要件 | 価値 |
---|---|
ターゲット プラットフォーム の |
万国 |
最小 KMDF バージョン | 1.0 |
UMDF の最小バージョン を |
2.0 |
ヘッダー | wdfusb.h (Wdfusb.h を含む) |
ライブラリ | Wdf01000.sys (KMDF);WUDFx02000.dll (UMDF) |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 を |
DriverCreate(kmdf), InternalIoctlReqs(kmdf), IoctlReqs(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExp SyncReqSend(kmdf), usbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf), WriteReqs(kmdf) |
関連項目
WDF_MEMORY_DESCRIPTOR_INIT_BUFFER
WdfUsbTargetPipeGetInformation の