Bagikan melalui


KMESSAGE_SERVICE_ROUTINE fungsi panggilan balik (wdm.h)

Layanan rutin InterruptMessageService merupakan interupsi bertanda pesan.

Sintaks

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

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

Mengembalikan nilai

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

Keterangan

Driver menggunakan IoConnectInterruptEx untuk mendaftarkan rutinitas InterruptMessageService untuk menangani interupsi yang disinyalkan pesan mereka. 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 interupsi dan mengembalikan TRUE. Jika tidak, InterruptMessageService tidak menangani interupsi 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 memiliki sumber daya interupsi yang sama (dan oleh karena itu panggilan balik InterruptMessageService> yang sama).

Perhatikan bahwa jika sistem menerima beberapa interupsi 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 IRQL perangkat maksimum (DIRQL) untuk setiap gangguan 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 driver. 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:

KMESSAGE_SERVICE_ROUTINE MyInterruptMessageService;

Kemudian terapkan rutinitas panggilan balik Anda sebagai berikut:

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

Jenis fungsi KMESSAGE_SERVICE_ROUTINE didefinisikan dalam file header Wdm.h. Untuk mengidentifikasi kesalahan secara lebih akurat saat Anda menjalankan alat analisis kode, pastikan untuk menambahkan Use_decl_annotations anotasi 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 Menganotasi Perilaku Fungsi.

Persyaratan

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

Lihat juga

Menggunakan Interupsi Deskriptor Sumber Daya

IO_INTERRUPT_MESSAGE_INFO

IoConnectInterruptEx

IoDisconnectInterruptEx