Menggunakan Kunci Kerangka Kerja

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

Kunci Sinkronisasi Callback

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 driver.

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

Anda mungkin ingin driver Anda menggunakan kunci sinkronisasi callback jika driver menggunakan sinkronisasi tingkat perangkat atau sinkronisasi tingkat antrian dari fungsi callback terkait permintaan I/O, tetapi harus menyinkronkan beberapa kode yang berjalan di IRQL = PASSIVE_LEVEL dengan fungsi callback yang berjalan di IRQL = DISPATCH_LEVEL. Ini karena driver dapat menggunakan sinkronisasi otomatis hanya untuk fungsi callback yang dijalankan di 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 callback 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 callback untuk menyinkronkan fungsi callback EvtWorkItem dengan fungsi callback 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 pengemudi dapat menggunakan kunci tunggu kerangka kerja, ia harus memanggil WdfWaitLockCreate untuk membuat objek kunci tunggu. Pengemudi kemudian dapat menghubungi WdfWaitLockAcquire untuk mendapatkan kunci dan WdfWaitLockRelease untuk melepaskannya.

Kunci Spin Kerangka Kerja

Gunakan kunci spin kerangka kerja untuk menyinkronkan akses ke data driver dari kode yang berjalan di IRQL <= DISPATCH_LEVEL. Ketika thread driver memperoleh kunci spin, sistem menetapkan IRQL thread ke DISPATCH_LEVEL. Ketika thread melepaskan kunci, sistem mengembalikan IRQL thread ke level 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 satu fungsi callback peristiwa driver mengakses ruang.

Sebelum driver dapat menggunakan kunci spin kerangka kerja, ia harus memanggil WdfSpinLockCreate untuk membuat objek spin-lock. Pengemudi kemudian dapat memanggil WdfSpinLockAcquire untuk mendapatkan kunci dan WdfSpinLockRelease untuk melepaskannya.

Misalnya penggunaan kunci putar, lihat Menyinkronkan Pembatalan Permintaan terkirim.

Kunci Interupsi Kerangka Kerja

Untuk objek interupsi yang mendukung penanganan interupsi DIRQL, kunci interupsi kerangka kerja adalah kunci putar. Setelah driver Anda memperoleh kunci spin interupsi, driver mengeksekusi di DIRQL perangkat sampai 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, pengemudi mengeksekusi di IRQL = PASSIVE_LEVEL sampai melepaskan kunci. Untuk informasi selengkapnya tentang penanganan tingkat pasif, lihat Mendukung Interupsi Tingkat Pasif.