次の方法で共有


WdfDmaTransactionDmaCompletedWithLength 関数 (wdfdmatransaction.h)

[KMDF にのみ適用]

WdfDmaTransactionDmaCompletedWithLength メソッドは、デバイスの DMA 転送操作が完了したことをフレームワークに通知し、完了した転送の長さを提供します。

構文

BOOLEAN WdfDmaTransactionDmaCompletedWithLength(
  [in]  WDFDMATRANSACTION DmaTransaction,
  [in]  size_t            TransferredLength,
  [out] NTSTATUS          *Status
);

パラメーター

[in] DmaTransaction

ドライバーが WdfDmaTransactionCreate の以前の呼び出しから取得した DMA トランザクション オブジェクトへのハンドル。

[in] TransferredLength

デバイスが現在の DMA 転送で転送したバイト数。

[out] Status

DMA 転送の状態を受け取る場所へのポインター。 詳細については、「 WdfDmaTransactionDmaCompleted」の「解説」セクションを参照してください。

戻り値

WdfDmaTransactionDmaCompletedWithLengthFALSE を 返し、DMA トランザクションを完了するために追加の転送が必要な場合、 Status はSTATUS_MORE_PROCESSING_REQUIREDを受け取ります。 メソッドは、追加の転送が必要ない場合に TRUE を 返します。

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

注釈

ドライバーが WdfDmaTransactionDmaCompletedWithLength メソッドを呼び出すと、フレームワークは現在の転送を終了し、必要に応じて新しい転送を開始します。

WdfDmaTransactionDmaCompletedWithLength メソッドは WdfDmaTransactionDmaCompleted と同じように動作します。ただし、ドライバーは転送されたバイト数を報告するデバイスに対して WdfDmaTransactionDmaCompletedWithLength を呼び出す点が異なります。 フレームワークは、トランザクションを完了するために複数の転送が必要な場合に、報告されたバイト数を使用して、指定された DMA トランザクションの次の DMA 転送の開始を決定します。

DMA 転送の完了の詳細については、「DMA 転送 の完了」を参照してください。

次のコード例は、 PLX9x5x サンプル ドライバーのものです。 次の使用例は 、WdfDmaTransactionGetCurrentDmaTransferLength を呼び出して現在の転送の元の長さを決定し、実際の転送長を計算します。 次に、 WdfDmaTransactionDmaCompletedWithLength を呼び出して、実際の転送長をフレームワークに報告します。 現在の転送がトランザクションの最後の転送である場合、この例では I/O 要求を完了するプライベート ルーチンを呼び出します。

BOOLEAN  hasTransitioned;
PDMA_TRANSFER_ELEMENT  dteVA;
ULONG  length;
//
// Use "DMA Clear-Count Mode" to get the complementary 
// transferred byte count.
//
length = WdfDmaTransactionGetCurrentDmaTransferLength(dmaTransaction);
dteVA = (PDMA_TRANSFER_ELEMENT) devExt->ReadCommonBufferBase;
while(dteVA->DescPtr.LastElement == FALSE) {
    length -= dteVA->TransferSize;
    dteVA++;
}
length -= dteVA->TransferSize;
//
// Indicate that this DMA operation has completed.
//
hasTransitioned = 
    WdfDmaTransactionDmaCompletedWithLength(
                                            dmaTransaction,
                                            length,
                                            &status
                                            ); 
if (hasTransitioned) {
    //
    // Complete this DMA transaction.
    //
    devExt->CurrentReadDmaTransaction = NULL;
    PLxReadRequestComplete(
                           dmaTransaction,
                           status
                           );
}

要件

要件
対象プラットフォーム ユニバーサル
最小 KMDF バージョン 1.0
Header wdfdmatransaction.h (Wdf.h を含む)
Library Wdf01000.sys (「Framework ライブラリのバージョン管理」を参照)。
IRQL <=DISPATCH_LEVEL
DDI コンプライアンス規則 DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

こちらもご覧ください

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength