Bagikan melalui


Menyinkronkan Pembatalan Permintaan Terkirim

Ketika driver mencoba membatalkan permintaan I/O yang telah diteruskan ke target I/O, driver harus memastikan bahwa driver melewati handel permintaan yang valid ke metode WdfRequestCancelSentRequest . Handel permintaan menjadi tidak valid jika target I/O menyelesaikan permintaan, karena fungsi panggilan balik CompletionRoutine driver akan memanggil WdfRequestComplete (yang mencoba menghapus objek permintaan).

Untuk menghindari masalah ini, driver dapat melacak permintaan yang telah dikirim ke target I/O dengan, misalnya, membuat kumpulan objek permintaan. Driver dapat memanggil WdfSpinLockAcquire untuk menyinkronkan akses ke koleksi.

Ketika fungsi panggilan balik CompletionRoutine driver dipanggil, ia memperoleh kunci, menghapus handel permintaan yang telah selesai dari koleksi, dan memanggil WdfSpinLockRelease untuk melepaskan kunci.

Sebelum mencoba membatalkan permintaan yang telah diteruskan driver ke target I/O, driver dapat:

  1. Panggil WdfSpinLockAcquire untuk memperoleh kunci putar.

  2. Temukan handel objek permintaan dalam koleksi, untuk memastikan bahwa rutinitas penyelesaian driver belum menyelesaikan permintaan dan menghapus handel dari koleksi.

  3. Panggil WdfObjectReference untuk menaikkan jumlah referensi objek permintaan sehingga objek tidak dapat dihapus.

  4. Panggil WdfSpinLockRelease untuk melepaskan kunci putaran.

  5. Panggil WdfRequestCancelSentRequest.

  6. Panggil WdfObjectDereference untuk mengurangi jumlah referensi objek.

Urutan ini memastikan bahwa jika target I/O menyelesaikan permintaan sebelum driver memanggil WdfRequestCancelSentRequest, handel permintaan masih valid (karena jumlah referensi yang bertambah) bahkan jika fungsi panggilan balik CompletionRoutine driver memanggil WdfRequestComplete.