[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の「解説」セクションを参照してください。
戻り値
WdfDmaTransactionDmaCompletedWithLength は、FALSE を返し、DMA トランザクションを完了するために追加の転送が必要な場合は、状態 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 |
ヘッダー | wdfdmatransaction.h (Wdf.h を含む) |
図書館 | Wdf01000.sys (フレームワーク ライブラリのバージョン管理を参照)。 |
IRQL | <=DISPATCH_LEVEL |
DDI コンプライアンス規則 を する | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |