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」の「解説」セクションを参照してください。
戻り値
WdfDmaTransactionDmaCompletedWithLength は FALSE を 返し、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) |