Fungsi WdfInterruptAcquireLock (wdfinterrupt.h)
[Berlaku untuk KMDF dan UMDF]
Metode WdfInterruptAcquireLock memulai urutan kode yang dijalankan pada tingkat permintaan interupsi perangkat perangkat (DIRQL) sambil menahan kunci spin objek interupsi.
Untuk objek interupsi tingkat pasif, metode memulai urutan kode yang dijalankan pada tingkat pasif sambil memegang kunci pasif objek interupsi.
Sintaks
void WdfInterruptAcquireLock(
[in] WDFINTERRUPT Interrupt
);
Parameter
[in] Interrupt
Handel ke objek interupsi kerangka kerja.
Keterangan
Pemeriksaan bug terjadi jika driver menyediakan handel objek yang tidak valid.
Ketika driver memanggil WdfInterruptAcquireLock pada objek interupsi DIRQL, sistem menaikkan IRQL prosesor ke DIRQL perangkat dan memperoleh kunci spin yang ditentukan driver dalam struktur WDF_INTERRUPT_CONFIG objek interupsi. Akibatnya, fungsi panggilan balik objek interupsi EvtInterruptIsr dan EvtInterruptSynchronize (dan kode lain yang memanggil WdfInterruptAcquireLock untuk objek interupsi yang sama) tidak dapat dijalankan.
Ketika driver memanggil WdfInterruptReleaseLock, sistem mengembalikan IRQL prosesor ke tingkat sebelumnya dan melepaskan kunci putaran.
Ketika driver memanggil WdfInterruptAcquireLock pada objek interupsi tingkat pasif, sistem memperoleh kunci interupsi tingkat pasif yang dikonfigurasi driver dalam struktur WDF_INTERRUPT_CONFIG objek interupsi.
Ketika driver memanggil WdfInterruptReleaseLock, sistem melepaskan kunci interupsi.
Untuk gangguan tingkat pasif, driver harus memanggil WdfInterruptAcquireLock di IRQL = PASSIVE_LEVEL.
Jangan panggil WdfInterruptAcquireLock dari konteks utas arbitrer, seperti penangan permintaan.
Anda dapat menggunakan WdfInterruptAcquireLock dan WdfInterruptReleaseLock jika driver Anda harus menjalankan beberapa baris kode tanpa didahulukan dan dengan layanan interupsi perangkat yang dinonaktifkan secara efektif. Untuk bagian kode yang lebih besar, driver Anda harus menyediakan fungsi panggilan balik EvtInterruptSynchronize .
Driver Anda tidak dapat memanggil WdfInterruptAcquireLock sebelum kerangka kerja memanggil fungsi panggilan balik EvtInterruptEnable driver atau setelah kerangka kerja memanggil fungsi panggilan balik EvtInterruptDisable driver.
Setelah driver Anda memanggil WdfInterruptAcquireLock, itu tidak boleh memanggil metode lagi untuk objek interupsi yang sama sebelum memanggil WdfInterruptReleaseLock.
Untuk informasi selengkapnya tentang metode WdfInterruptAcquireLock , lihat Menyinkronkan Kode Interupsi.
Untuk informasi selengkapnya tentang menangani gangguan dalam driver berbasis kerangka kerja, lihat Menangani Gangguan Perangkat Keras.
Untuk objek interupsi tingkat pasif, driver harus memanggil WdfInterruptTryToAcquireLock alih-alih WdfInterruptAcquireLock, saat berjalan dalam utas arbitrer, seperti fungsi panggilan balik objek antrean. Misalnya, driver mungkin memanggil WdfInterruptTryToAcquireLock dari EvtIoRead.
Melakukannya menghindari kemungkinan kebuntuan, seperti yang dijelaskan dalam skenario berikut.
- Untuk menentukan apakah perangkatnya terganggu, driver fungsi untuk perangkat periferal SPB mengirim I/O ke busnya dari dalam ISR-nya, dengan kunci interupsi tingkat pasif ditahan.
- Pengemudi bus menyelesaikan permintaan kedua dalam utas yang sama di mana ia menerima permintaan di atas.
- Rutinitas penyelesaian permintaan kedua mengirimkan permintaan ke driver periferal.
- Pengiriman I/O driver periferal rutin memanggil WdfInterruptAcquireLock, yang kemudian kebuntuan mencoba untuk memperoleh kunci pasif objek interupsi.
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Universal |
Versi KMDF minimum | 1,0 |
Versi UMDF minimum | 2.0 |
Header | wdfinterrupt.h (termasuk Wdf.h) |
IRQL | <= DIRQL |
Aturan kepatuhan DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfInterruptLock(kmdf), WdfInterruptLockRelease(kmdf) |