Bagikan melalui


Melayani Interupsi

Topik ini menjelaskan cara melayani gangguan DIRQL. Untuk informasi tentang layanan interupsi tingkat pasif, lihat Mendukung Gangguan Tingkat Pasif.

Melayani gangguan terdiri dari dua, dan kadang-kadang tiga, langkah:

  1. Menyimpan informasi volatil (seperti mendaftarkan konten) dengan cepat, dalam rutinitas layanan interupsi yang berjalan di IRQL = DIRQL.

  2. Memproses informasi volatil yang disimpan dalam panggilan prosedur yang ditangguhkan (DPC) yang berjalan di IRQL = DISPATCH_LEVEL.

  3. Melakukan pekerjaan tambahan di IRQL = PASSIVE_LEVEL, jika perlu.

Ketika perangkat menghasilkan gangguan perangkat keras, kerangka kerja memanggil rutinitas layanan interupsi (ISR) driver, yang diterapkan driver berbasis kerangka kerja sebagai fungsi panggilan balik EvtInterruptIsr .

Fungsi panggilan balik EvtInterruptIsr , yang berjalan di DIRQL perangkat, harus dengan cepat menyimpan informasi interupsi, seperti mendaftarkan konten, yang akan hilang jika gangguan lain terjadi.

Biasanya, fungsi panggilan balik EvtInterruptIsr menjadwalkan panggilan prosedur yang ditangguhkan (DPC) untuk memproses informasi yang disimpan nanti di IRQL yang lebih rendah (DISPATCH_LEVEL). Driver berbasis kerangka kerja menerapkan rutinitas DPC sebagai fungsi panggilan balik EvtInterruptDpc atau EvtDpcFunc .

Sebagian besar driver menggunakan satu fungsi panggilan balik EvtInterruptDpc untuk setiap jenis gangguan. Untuk menjadwalkan eksekusi fungsi panggilan balik EvtInterruptDpc , driver harus memanggil WdfInterruptQueueDpcForIsr dari dalam fungsi panggilan balik EvtInterruptIsr .

Jika driver Anda membuat beberapa objek antrean kerangka kerja untuk setiap perangkat, Anda mungkin mempertimbangkan untuk menggunakan objek DPC terpisah dan fungsi panggilan balik EvtDpcFunc untuk setiap antrean. Untuk menjadwalkan eksekusi fungsi panggilan balik EvtDpcFunc , driver harus terlebih dahulu membuat satu atau beberapa objek DPC dengan memanggil WdfDpcCreate, biasanya dalam fungsi panggilan balik EvtDriverDeviceAdd driver. Kemudian fungsi panggilan balik EvtInterruptIsr driver dapat memanggil WdfDpcEnqueue.

Driver biasanya menyelesaikan permintaan I/O dalam fungsi panggilan balik EvtInterruptDpc atau EvtDpcFunc mereka.

Terkadang driver harus melakukan beberapa operasi layanan interupsi di IRQL = PASSIVE_LEVEL. Dalam kasus seperti itu, fungsi panggilan balik EvtInterruptDpc atau EvtDpcFunc driver, yang dijalankan di IRQL = DISPATCH_LEVEL, dapat menjadwalkan eksekusi satu atau beberapa item kerja kerangka kerja, yang berjalan di IRQL = PASSIVE_LEVEL.

Untuk contoh driver yang menggunakan item kerja saat menyela perangkat layanan, lihat driver sampel PCIDRV .