Menyinkronkan Kode Pembatalan dan Penyelesaian

Jika driver Anda memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx untuk membuat permintaan I/O dapat dibatalkan, ada potensi masalah sinkronisasi. Misalnya, driver dan perangkat Anda mungkin melakukan operasi I/O perangkat secara asinkron dengan fungsi panggilan balik EvtInterruptIsr dan EvtInterruptDpc , dan fungsi panggilan balik EvtInterruptDpc dan EvtRequestCancel mungkin berisi panggilan ke WdfRequestComplete.

Driver harus memanggil WdfRequestComplete hanya sekali, untuk menyelesaikan atau membatalkan permintaan. Tetapi jika fungsi panggilan balik EvtInterruptDpc dan EvtRequestCancel tidak disinkronkan satu sama lain, kerangka kerja dapat memanggil satu saat yang lain sedang dijalankan.

Menghindari masalah ini mudah jika driver Anda menggunakan sinkronisasi otomatis kerangka kerja, karena sinkronisasi otomatis memastikan bahwa fungsi panggilan balik akan dipanggil satu per satu.

Jika driver Anda tidak menggunakan sinkronisasi otomatis kerangka kerja, driver dapat menggunakan kunci kerangka kerja untuk menyinkronkan kode pembatalan dan penyelesaian.

Baik driver menggunakan sinkronisasi otomatis kerangka kerja atau menyediakan sinkronisasinya sendiri, fungsi panggilan balik EvtRequestCancel driver harus memanggil WdfRequestComplete untuk membatalkan permintaan. Fungsi panggilan balik EvtInterruptDpc driver harus memanggil WdfRequestUnmarkCancelable sebagai berikut:

Status = WdfRequestUnmarkCancelable(Request);
if( Status != STATUS_CANCELLED ) {
    WdfRequestComplete(Request, RequestStatus);
    }

Kode ini memastikan bahwa driver tidak memanggil WdfRequestComplete untuk menyelesaikan permintaan jika driver telah memanggilnya untuk membatalkan permintaan.

Untuk informasi selengkapnya tentang aturan yang harus diikuti driver Anda saat memanggil WdfRequestUnmarkCancelable, lihat WdfRequestUnmarkCancelable.