KMESSAGE_SERVICE_ROUTINE fungsi panggilan balik (wdm.h)

InterruptMessageService layanan rutin gangguan yang disinyalir pesan.

Sintaksis

C++
KMESSAGE_SERVICE_ROUTINE KmessageServiceRoutine;

BOOLEAN KmessageServiceRoutine(
  [in] _KINTERRUPT *Interrupt,
  [in] PVOID ServiceContext,
       ULONG MessageID
)
{...}

Parameter

[in] Interrupt

Penunjuk ke struktur KINTERRUPT untuk interupsi. Driver menerima pointer ini dalam panggilan ke rutinitas IoConnectInterruptEx yang mendaftarkan rutinitas InterruptMessageService driver.

[in] ServiceContext

Nilai ServiceContext yang diteruskan driver ke IoConnectInterruptEx ketika rutinitas InterruptMessageService terdaftar.

MessageID

ID pesan untuk interupsi. Nilai ini adalah indeks untuk entri interupsi dalam array anggota MessageInfo dalam struktur IO_INTERRUPT_MESSAGE_INFO yang menjelaskan gangguan yang diberi sinyal pesan driver.

Mengembalikan nilai

Rutinitas InterruptMessageService mengembalikan TRUE jika gangguan ditangani oleh rutinitas InterruptMessageService. Jika tidak, ia mengembalikan FALSE.

Komentar

Driver menggunakan IoConnectInterruptEx untuk mendaftarkan InterruptMessageService rutin untuk menangani gangguan yang disinyalir pesan. Driver kemudian dapat membatalkan pendaftaran rutinitas dengan memanggil IoDisconnectInterruptEx. Interupsi yang disinyalir pesan didukung dimulai dengan Windows Vista.

Sistem dapat memanggil rutinitas InterruptMessageService bahkan ketika gangguan rutin belum terjadi. Misalnya, jika interupsi yang diberi sinyal pesan dibagikan, InterruptMessageService dapat dipanggil untuk interupsi milik perangkat lain. Rutinitas harus memeriksa apakah nilai untuk parameter ServiceContext cocok dengan nilai yang diteruskan ke IoConnectInterruptEx. Jika nilainya cocok, InterruptMessageService menangani gangguan dan mengembalikan TRUE. Jika tidak, InterruptMessageService tidak menangani gangguan dan mengembalikan FALSE.

Driver yang menggunakan MSI (PCI 2.2) harus memeriksa parameter MessageID untuk membedakan antara berbagai pesan yang dihasilkan oleh perangkat, karena semuanya berbagi sumber daya interupsi yang sama (dan oleh karena itu InterruptMessageService yang sama> panggilan balik).

Perhatikan bahwa jika sistem menerima beberapa gangguan identik selama interval waktu yang singkat, sistem dapat menggabungkannya menjadi satu panggilan ke InterruptMessageService. Rutinitas harus ditulis untuk menangani beberapa gangguan identik dalam satu panggilan.

Interupsi yang disinyalir pesan mirip dalam perilaku dengan gangguan yang dipicu tepi. Perangkat mengirimkan permintaan interupsi tetapi tidak menerima pengakuan perangkat keras apa pun bahwa permintaan diterima.

InterruptMessageService dijalankan pada IRQL yang lebih besar dari atau sama dengan perangkat maksimum IRQL (DIRQL) untuk setiap mengganggu handel rutin.

Contoh

Untuk menentukan rutinitas panggilan balik InterruptMessageService, Anda harus terlebih dahulu memberikan deklarasi fungsi yang mengidentifikasi jenis rutinitas panggilan balik yang Anda tentukan. Windows menyediakan sekumpulan tipe fungsi panggilan balik untuk pengandar. Mendeklarasikan fungsi menggunakan jenis fungsi panggilan balik membantu Analisis Kode untuk Driver, Pemverifikasi Driver Statis (SDV), dan alat verifikasi lainnya menemukan kesalahan, dan itu adalah persyaratan untuk menulis driver untuk sistem operasi Windows.

Misalnya, untuk menentukan rutinitas panggilan balik InterruptMessageService yang diberi nama MyInterruptMessageService, gunakan jenis KMESSAGE_SERVICE_ROUTINE seperti yang ditunjukkan dalam contoh kode ini:

C++
KMESSAGE_SERVICE_ROUTINE MyInterruptMessageService;

Kemudian terapkan rutinitas panggilan balik Anda sebagai berikut:

C++
_Use_decl_annotations_
BOOLEAN
  MyInterruptMessageService(
    struct _KINTERRUPT  *Interrupt,
    PVOID  ServiceContext,
    ULONG  MessageId 
    )
  {
      // Function body
  }

Jenis fungsi KMESSAGE_SERVICE_ROUTINE ditentukan dalam file header Wdm.h. Untuk mengidentifikasi kesalahan dengan lebih akurat saat Anda menjalankan alat analisis kode, pastikan untuk menambahkan anotasi Use_decl_annotations ke definisi fungsi Anda. Anotasi Use_decl_annotations memastikan bahwa anotasi yang diterapkan ke jenis fungsi KMESSAGE_SERVICE_ROUTINE dalam file header digunakan. Untuk informasi selengkapnya tentang persyaratan untuk deklarasi fungsi, lihat Mendeklarasikan Fungsi dengan Menggunakan Jenis Peran Fungsi untuk Driver WDM. Untuk informasi tentang Use_decl_annotations, lihat Anotasi Perilaku Fungsi.

Persyaratan

Syarat Nilai
klien minimum yang didukung Lihat bagian Keterangan.
Platform Target Desktop
Header wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h)
IRQL Lihat bagian Keterangan.

Lihat juga

Menggunakan Deskriptor Sumber Daya Interupsi

IO_INTERRUPT_MESSAGE_INFO

IoConnectInterruptEx

IoDisconnectInterruptEx