Bagikan melalui


Menggunakan Objek Panggilan Balik yang Didefinisikan oleh Driver

Untuk menggunakan objek panggilan balik yang ditentukan oleh driver lain, driver membuka objek, lalu mendaftarkan rutinitas untuk dipanggil saat panggilan balik dipicu, seperti yang ditunjukkan pada gambar berikut. Driver yang meminta pemberitahuan harus mengetahui nama objek panggilan balik dan harus memahami semantik argumen yang diteruskan ke rutinitas panggilan balik.

diagram yang mengilustrasikan pendaftaran untuk pemberitahuan panggilan balik.

Sebelum dapat membuka objek, driver harus memanggil InitializeObjectAttributes untuk membuat blok atribut, menentukan nama objek. Setelah memiliki penunjuk ke blok atribut, ia memanggil ExCreateCallback, meneruskan penunjuk atribut, lokasi untuk menerima handle ke callback, dan FALSE untuk parameter Create, menunjukkan bahwa ia memerlukan objek callback yang sudah ada.

Pengemudi kemudian dapat memanggil ExRegisterCallback dengan handle yang dikembalikan untuk mendaftarkan rutin callback-nya.

Rutinitas panggilan balik memiliki prototipe berikut:

typedef VOID (*PCALLBACK_FUNCTION ) (
    IN PVOID CallbackContext,
    IN PVOID Argument1,
    IN PVOID Argument2
    );

Parameter CallbackContext adalah penunjuk konteks yang akan diteruskan ke rutinitas panggilan balik setiap kali dipanggil. Biasanya, parameter ini adalah pointer ke sebuah blok data konteks, yang harus dialokasikan oleh pemanggil dari pool non-halaman jika rutinitas dapat dipanggil pada DISPATCH_LEVEL. Dua argumen didefinisikan oleh komponen yang membuat panggilan balik. Biasanya, argumen memberikan informasi tentang kondisi yang memicu panggilan balik.

Ketika pembuat panggilan balik memicu pemberitahuan, sistem memanggil rutinitas terdaftar, meneruskan pointer ke konteks dan dua argumen. Nilai untuk argumen disediakan oleh komponen yang membuat panggilan balik. Rutinitas panggilan balik dipanggil pada IRQL yang sama di mana driver pembuat memicu notifikasi, yang selalu pada IRQL <= DISPATCH_LEVEL.

Dalam rutinitas panggilan baliknya, driver dapat melakukan tugas apa pun yang diperlukan untuk kondisi saat ini.

Ketika driver tidak lagi memerlukan pemberitahuan, driver harus memanggil ExUnregisterCallback untuk menghapus rutinitasnya dari daftar panggilan balik terdaftar dan untuk menghapus referensinya ke objek panggilan balik.