Menggunakan Kunci Kerangka Kerja

Terkadang driver harus menyediakan sinkronisasi khusus driver dari fungsi panggilan balik terkait permintaan I/O, baik selain atau sebagai pengganti sinkronisasi yang disediakan kerangka kerja. Driver dapat menggunakan kunci sinkronisasi panggilan balik, kunci putar, kunci tunggu, dan kunci interupsi untuk menyinkronkan kode driver.

Kunci Sinkronisasi Panggilan Balik

Jika Anda telah menyiapkan driver untuk menggunakan kemampuan sinkronisasi otomatis kerangka kerja, kerangka kerja memperoleh kunci sinkronisasi sebelum memanggil fungsi panggilan balik peristiwa terkait permintaan I/O driver.

Kunci sinkronisasi panggilan balik ini, yang terkait dengan objek perangkat kerangka kerja dan objek antrean, juga dapat diperoleh oleh driver. Untuk memperoleh kunci sinkronisasi, driver memanggil WdfObjectAcquireLock. Untuk melepaskan kunci, driver memanggil WdfObjectReleaseLock.

Anda mungkin ingin driver Anda menggunakan kunci sinkronisasi panggilan balik jika driver menggunakan sinkronisasi tingkat perangkat atau tingkat antrean kerangka kerja dari fungsi panggilan balik terkait permintaan I/O tetapi harus menyinkronkan beberapa kode yang berjalan di IRQL = PASSIVE_LEVEL dengan fungsi panggilan balik yang berjalan di IRQL = DISPATCH_LEVEL. Ini karena driver dapat menggunakan sinkronisasi otomatis hanya untuk fungsi panggilan balik yang dijalankan pada IRQL yang sama.

Misalnya, driver dapat menggunakan sinkronisasi otomatis untuk objek item kerja hanya jika tingkat eksekusi induk objek item kerja adalah WdfExecutionLevelPassive (karena fungsi panggilan balik item kerja selalu dijalankan di IRQL= PASSIVE_LEVEL). Oleh karena itu, jika driver menentukan WdfExecutionLevelDispatch di anggota ExecutionLevel dari struktur WDF_OBJECT_ATTRIBUTES objek perangkat, driver tidak dapat mengatur anggota AutomaticSerialization dari struktur konfigurasi objek item kerja anak. Sebagai gantinya, driver harus memperoleh kunci sinkronisasi panggilan balik untuk menyinkronkan fungsi panggilan balik EvtWorkItem dengan fungsi panggilan balik objek perangkat induk.

Kunci Tunggu Kerangka Kerja

Gunakan kunci tunggu kerangka kerja untuk menyinkronkan akses ke data driver dari kode yang berjalan di IRQL = PASSIVE_LEVEL. Sebelum driver dapat menggunakan kunci tunggu kerangka kerja, driver harus memanggil WdfWaitLockCreate untuk membuat objek kunci tunggu. Driver kemudian dapat memanggil WdfWaitLockAcquire untuk memperoleh kunci dan WdfWaitLockRelease untuk melepaskannya.

Kunci Putar Kerangka Kerja

Gunakan kunci putar kerangka kerja untuk menyinkronkan akses ke data driver dari kode yang berjalan di IRQL <= DISPATCH_LEVEL. Ketika utas driver memperoleh kunci putaran, sistem mengatur IRQL utas ke DISPATCH_LEVEL. Ketika utas melepaskan kunci, sistem memulihkan IRQL utas ke tingkat sebelumnya.

Driver yang tidak menggunakan sinkronisasi kerangka kerja otomatis mungkin menggunakan kunci putar untuk menyinkronkan akses ke ruang konteks objek perangkat, jika ruang konteks dapat ditulis dan jika lebih dari salah satu fungsi panggilan balik peristiwa driver mengakses ruang.

Sebelum driver dapat menggunakan kunci putar kerangka kerja, ia harus memanggil WdfSpinLockCreate untuk membuat objek kunci putar. Driver kemudian dapat memanggil WdfSpinLockAcquire untuk memperoleh kunci dan WdfSpinLockRelease untuk melepaskannya.

Untuk contoh penggunaan kunci putar, lihat Menyinkronkan Pembatalan Permintaan Terkirim.

Kunci Gangguan Kerangka Kerja

Untuk objek interupsi yang mendukung penanganan gangguan DIRQL, kunci gangguan kerangka kerja adalah kunci putar. Setelah driver Anda memperoleh kunci putaran yang mengganggu, driver akan dijalankan di DIRQL perangkat hingga melepaskan kunci. Untuk informasi selengkapnya tentang menggunakan kunci interupsi, lihat Menyinkronkan Kode Interupsi.

Untuk objek interupsi yang mendukung penanganan tingkat pasif, kunci interupsi kerangka kerja adalah kunci tunggu. Setelah driver Anda memperoleh kunci tunggu interupsi, driver dijalankan di IRQL = PASSIVE_LEVEL hingga melepaskan kunci. Untuk informasi selengkapnya tentang penanganan tingkat pasif, lihat Mendukung Gangguan Tingkat Pasif.