次の方法で共有


SpbRequestGetTransferParameters 関数 (spbcx.h)

SpbRequestGetTransferParameters メソッドは、I/O 転送シーケンス内の個々の転送の転送パラメーターを取得します。

構文

void SpbRequestGetTransferParameters(
  [in]            SPBREQUEST              SpbRequest,
  [in]            ULONG                   Index,
  [out, optional] SPB_TRANSFER_DESCRIPTOR *TransferDescriptor,
  [out, optional] PMDL                    *TransferBuffer
);

パラメーター

[in] SpbRequest

転送パラメーターを取得する I/O 要求に対する SPBREQUEST ハンドル。 このパラメーターは、 IOCTL_SPB_EXECUTE_SEQUENCE 要求のハンドルである必要があります。

[in] Index

I/O 転送シーケンス内の転送のインデックス。 詳細については、「解説」を参照してください。

[out, optional] TransferDescriptor

メソッドが転送パラメーターを書き込む呼び出し元によって割り当てられた SPB_TRANSFER_DESCRIPTOR 構造体へのポインター。 TransferDescriptor パラメーターは省略可能であり、呼び出し元が転送パラメーターを必要としない場合は NULL として指定できます。 詳細については、「解説」を参照してください。

[out, optional] TransferBuffer

メソッドが転送バッファー内の物理メモリを記述する MDL (または MDL チェーン) へのポインターを書き込む場所へのポインター。 呼び出し元は、この MDL の内容を変更することはできません。 このパラメーターは省略可能であり、MDL が必要ない場合は NULL に設定できます。 詳細については、「解説」を参照してください。

戻り値

なし

解説

I/O 転送シーケンスを要求するには、SPB コントローラー ドライバーのクライアント (周辺機器ドライバー) が、シーケンス内の転送の一覧を含む IOCTL_SPB_EXECUTE_SEQUENCE 要求を送信します。 コントローラー ドライバーは SpbRequestGetTransferParameters を呼び出して、シーケンス内の特定の転送に関する情報を取得できます。

Index パラメーターは、シーケンス内の特定の転送を識別するインデックスです。 N がシーケンス内の転送数の場合、有効なインデックスの範囲は 0 から N から 1 です。 シーケンス内の転送の数を確認するには、 SpbRequestGetParameters メソッドを 呼び出します。 このメソッドは、要求パラメーターを含む SPB_TRANSFER_DESCRIPTOR 構造体を取得します。 この構造体の TransferCount メンバーは、シーケンス内の転送の数を指定します。

TransferDescriptor が NULL 以外の場合、呼び出し元は spbRequestGetTransferParameters を呼び出す前に、SPB_TRANSFER_DESCRIPTOR_INIT関数を呼び出して構造体を初期化する必要があります。 構造体が初期化された後は、再初期化することなく、必要な回数だけ再利用できます。

TransferBuffer は、 SpbRequestGetTransferParameters が転送バッファーの物理ページ レイアウトを記述する MDL へのポインターを書き込む省略可能なポインターです。 転送バッファーは、1 つの MDL または MDL チェーンによって記述できます。 仮想メモリの連続したブロックで構成される単純なバッファーは、1 つの MDL によって記述されます。 転送バッファーが分散収集リストとして書式設定されている場合、バッファー内の仮想メモリの連続する各ブロックは、MDL チェーン内の MDL によって記述されます。 MDL の詳細については、「MDL の使用」を参照してください。

//
// Note that this snippet shows a transfer completing synchronously. This
// is a horrible thing for a driver to do, but demonstrates the DDI nicely.
//

WDF_REQUEST_PARAMETERS parameters;
WDF_TRANSFER_DESCRIPTOR transfer;

WDF_REQUEST_PARAMETERS_INIT(&parameters);
WDF_TRANSFER_DESCRIPTOR_INIT(&transfer);

SpbRequestGetParameters(request, &parameters);

for (ULONG i = 0; i < parameters.SequenceCount; i += 1)
{
    WDFMEMORY buffer;

    SpbRequestGetTransferParameters(request, i, &transfer, &buffer);

    MyDriverPerformTransfer(deviceContext, 
                            request,
                            transfer,
                            buffer);
}

要件

要件
サポートされている最小のクライアント Windows 8以降で使用できます。
対象プラットフォーム ユニバーサル
Header spbcx.h
Library Spbcxstubs.lib
IRQL <= DISPATCH_LEVEL

こちらもご覧ください