Fungsi WdfDmaTransactionDmaCompletedWithLength (wdfdmatransaction.h)

[Hanya berlaku untuk KMDF]

Metode WdfDmaTransactionDmaCompletedWithLength memberi tahu kerangka kerja bahwa operasi transfer DMA perangkat selesai dan memasok lamanya transfer yang selesai.

Sintaks

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

Parameter

[in] DmaTransaction

Handel ke objek transaksi DMA yang diperoleh driver dari panggilan sebelumnya ke WdfDmaTransactionCreate.

[in] TransferredLength

Jumlah byte yang ditransfer perangkat dalam transfer DMA saat ini.

[out] Status

Penunjuk ke lokasi yang menerima status transfer DMA. Untuk informasi selengkapnya, lihat bagian Keterangan untuk WdfDmaTransactionDmaCompleted.

Nilai kembali

WdfDmaTransactionDmaCompletedWithLength mengembalikan FALSE dan Status menerima STATUS_MORE_PROCESSING_REQUIRED jika transfer tambahan diperlukan untuk menyelesaikan transaksi DMA. Metode mengembalikan TRUE jika tidak ada transfer tambahan yang diperlukan.

Pemeriksaan bug terjadi jika driver menyediakan handel objek yang tidak valid.

Keterangan

Ketika driver Anda memanggil metode WdfDmaTransactionDmaCompletedWithLength , kerangka kerja mengakhiri transfer saat ini dan, jika perlu, memulai yang baru.

Metode WdfDmaTransactionDmaCompletedWithLength berperilaku sama seperti WdfDmaTransactionDmaCompleted, kecuali bahwa driver memanggil WdfDmaTransactionDmaCompletedWithLength untuk perangkat yang melaporkan jumlah byte yang ditransfer. Kerangka kerja menggunakan jumlah byte yang dilaporkan untuk menentukan awal transfer DMA berikutnya untuk transaksi DMA yang ditentukan, jika beberapa transfer diperlukan untuk menyelesaikan transaksi.

Untuk informasi selengkapnya tentang menyelesaikan transfer DMA, lihat Menyelesaikan Transfer DMA.

Contoh

Contoh kode berikut berasal dari driver sampel PLX9x5x . Contoh ini memanggil WdfDmaTransactionGetCurrentDmaTransferLength untuk menentukan panjang asli transfer saat ini, dan kemudian menghitung panjang transfer aktual. Selanjutnya, contoh memanggil WdfDmaTransactionDmaCompletedWithLength untuk melaporkan panjang transfer aktual ke kerangka kerja. Jika transfer saat ini adalah yang terakhir untuk transaksi, contohnya memanggil rutinitas privat yang menyelesaikan permintaan 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
                           );
}

Persyaratan

Persyaratan Nilai
Target Platform Universal
Versi KMDF minimum 1,0
Header wdfdmatransaction.h (termasuk Wdf.h)
Pustaka Wdf01000.sys (lihat Penerapan Versi Pustaka Kerangka Kerja.)
IRQL <=DISPATCH_LEVEL
Aturan kepatuhan DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Lihat juga

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength