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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk