Membatalkan Transaksi DMA
[Berlaku untuk KMDF saja]
Jika driver Anda telah dibangun dengan versi 1.11 atau versi KMDF yang lebih baru dan berjalan pada Windows 8 atau yang lebih baru menggunakan akses memori langsung (DMA) versi 3, driver dapat mencoba membatalkan transaksi DMA yang tertunda dengan memanggil metode WdfDmaTransactionCancel.
Saat memanggil WdfDmaTransactionCancel, driver harus memastikan bahwa transaksi DMA yang ditentukan tidak selesai selama panggilan. Driver dapat menggunakan teknik berikut untuk membatalkan transaksi dengan aman, baik sebelum alokasi saluran DMA atau setelah beberapa operasi transfer selesai:
Di salah satu penangan permintaan driver, driver memanggil WdfRequestMarkCancelableEx dan menyediakan fungsi panggilan balik EvtRequestCancel untuk permintaan I/O. Handler permintaan kemudian memanggil WdfDmaTransactionExecute.
Fungsi panggilan balik EvtRequestCancel driver (yang mungkin mulai berjalan dalam utas terpisah segera setelah panggilan ke WdfRequestMarkCancelableEx) memanggil WdfDmaTransactionCancel.
Jika panggilan ke WdfDmaTransactionCancel terjadi setelah panggilan ke WdfDmaTransactionExecute, tetapi sebelum metode WdfDmaTransactionExecute telah memulai alokasi DMA, pembatalan transaksi berhasil dan WdfDmaTransactionCancel mengembalikan TRUE. Dalam hal ini, fungsi panggilan balik EvtRequestCancel driver harus menyelesaikan transaksi DMA. WdfDmaTransactionExecute mengembalikan nilai kesalahan.
Jika driver memanggil WdfDmaTransactionCancel setelah metode WdfDmaTransactionExecute telah memulai alokasi DMA, upaya untuk membatalkan transaksi gagal dan WdfDmaTransactionCancel mengembalikan FALSE. Dalam hal ini, WdfDmaTransactionExecute mengembalikan STATUS_SUCCESS dan handler permintaan driver harus menyelesaikan transaksi DMA.
Pada titik ini, jika driver menggunakan DMA mode sistem, fungsi panggilan balik EvtRequestCancel mungkin memanggil WdfDmaTransactionStopSystemTransfer untuk mencoba menghentikan transfer DMA mode sistem yang sedang berlangsung. Untuk contoh kode yang menunjukkan cara melakukan ini, lihat WdfDmaTransactionStopSystemTransfer.
Setelah metode WdfDmaTransactionExecute menyelesaikan alokasi DMA, kerangka kerja memanggil fungsi panggilan balik EvtProgramDma driver (yang mungkin mulai berjalan dalam utas terpisah segera setelah panggilan ke WdfDmaTransactionExecute). Pada titik ini, panggilan ke metode WdfDmaTransactionCancel akan mengembalikan FALSE.
Di EvtProgramDma, driver dapat memanggil WdfRequestUnmarkCancelable untuk mengakhiri kemungkinan pembatalan permintaan. Jika WdfRequestUnmarkCancelable mengembalikan STATUS_SUCCESS, fungsi panggilan balik harus memprogram perangkat keras untuk memulai transfer. Jika WdfRequestUnmarkCancelable mengembalikan STATUS_CANCELLED, permintaan telah dibatalkan. Dalam hal ini, EvtProgramDma harus memanggil WdfDmaTransactionDmaCompletedFinal untuk menyelesaikan transaksi DMA.
Driver dapat menggunakan teknik yang sama untuk membatalkan transaksi DMA setelah beberapa operasi transfer selesai. Dalam hal ini, driver memanggil WdfDmaTransactionCancel setelah memanggil WdfDmaTransactionDmaCompleted, tetapi sebelum kerangka kerja memanggil EvtProgramDma untuk memprogram operasi transfer berikutnya. Jika driver kebetulan memanggil WdfDmaTransactionCancel sebelum memanggil WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompleted mengembalikan TRUE, yang menunjukkan bahwa transaksi DMA telah selesai.