Bagikan melalui


Menggunakan Kunci Kerangka Kerja

Terkadang pengemudi harus menyediakan sinkronisasi spesifik untuk driver dari fungsi panggilan balik yang terkait dengan permintaan I/O, baik sebagai tambahan atau sebagai pengganti sinkronisasi yang disediakan oleh 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 callback peristiwa terkait permintaan I/O dari 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, pengemudi dapat menggunakan sinkronisasi otomatis untuk sebuah objek item kerja hanya jika tingkat eksekusi dari induk objek item kerja adalah WdfExecutionLevelPassive (karena fungsi callback item kerja selalu dieksekusi pada IRQL= PASSIVE_LEVEL). Oleh karena itu, jika driver menentukan WdfExecutionLevelDispatch pada 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 dalam Kerangka Kerja

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

Kerangka Kunci Putar

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 level sebelumnya.

Driver yang tidak menggunakan sinkronisasi kerangka kerja otomatis mungkin menggunakan spin lock untuk menyinkronkan akses ke ruang konteks dari objek perangkat, jika ruang konteks tersebut dapat ditulis dan jika lebih dari satu fungsi callback peristiwa driver mengakses objek perangkat tersebut.

Sebelum driver dapat menggunakan spin lock framework, terlebih dahulu harus memanggil WdfSpinLockCreate untuk membuat objek spin-lock. Driver kemudian dapat memanggil WdfSpinLockAcquire untuk memperoleh kunci dan WdfSpinLockRelease untuk melepaskannya.

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

Kunci Interupsi Kerangka Kerja

Untuk objek interupsi yang mendukung penanganan gangguan DIRQL, kunci interupsi kerangka kerja adalah kunci putar. Setelah driver Anda memperoleh kunci putaran interupsi, driver tersebut beroperasi di DIRQL perangkat sampai melepaskan kunci tersebut. 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 beroperasi pada IRQL = PASSIVE_LEVEL sampai kunci dilepaskan. Untuk informasi selengkapnya tentang penanganan tingkat pasif, lihat Dukungan untuk Interupsi Tingkat Pasif.