Mendeklarasikan Fungsi Menggunakan Jenis Peran Fungsi untuk Driver WDM
Catatan
Mulai Windows 10 Versi 2004, Static Driver Verifier (SDV) tidak lagi memerlukan anotasi untuk mengidentifikasi jenis peran rutinitas pengiriman untuk driver WDM. Ikuti panduan di bagian Inisialisasi Dasar dan Tingkat Lanjut di halaman ini.
Untuk menginformasikan SDV tentang titik masuk driver saat menganalisis driver WDM, Anda harus mendeklarasikan fungsi menggunakan deklarasi jenis peran fungsi. Jenis peran fungsi didefinisikan dalam Wdm.h. Setiap titik masuk dalam rutinitas DriverEntry di driver WDM Anda harus dideklarasikan dengan menentukan jenis peran yang sesuai. Jenis peran adalah typedef yang telah ditentukan sebelumnya yang sesuai dengan titik masuk yang dikenali dalam driver WDM.
Misalnya, untuk membuat deklarasi jenis peran fungsi untuk rutinitas Unload driver yang disebut CsampUnload, gunakan typedef yang telah ditentukan sebelumnya DRIVER_UNLOAD deklarasi jenis peran. Deklarasi jenis peran fungsi harus muncul sebelum definisi fungsi.
DRIVER_UNLOAD CsampUnload;
Definisi fungsi CsampUnload tetap tidak berubah:
VOID
CsampUnload(
IN PDRIVER_OBJECT DriverObject
)
{
...
}
SDV mengenali jenis titik masuk yang diperlihatkan dalam tabel berikut.
Jenis peran fungsi WDM | Rutinitas WDM |
---|---|
DRIVER_INITIALIZE |
|
DRIVER_STARTIO |
|
DRIVER_UNLOAD |
|
DRIVER_ADD_DEVICE |
|
DRIVER_DISPATCH Dispatch_type( jenis ) | Rutinitas pengiriman yang digunakan oleh driver. Lihat Menulis Rutinitas Pengiriman. |
IO_COMPLETION_ROUTINE |
Rutinitas IoCompletion diatur dengan memanggil IoSetCompletionRoutine atau IoSetCompletionRoutineEx dan meneruskan penunjuk fungsi ke rutinitas IoCompletion sebagai parameter kedua. |
DRIVER_CANCEL |
Rutinitas Batal diatur dengan memanggil IoSetCancelRoutine dan meneruskan penunjuk fungsi ke rutinitas pembatalan untuk IRP sebagai parameter kedua ke fungsi. |
IO_DPC_ROUTINE |
Rutinitas DpcForIsr didaftarkan dengan memanggil IoInitializeDpcRequest dan meneruskan penunjuk fungsi ke rutinitas DpcForIsr sebagai parameter kedua. Untuk mengantre DPC, panggil IoQueueDpc dari rutinitas ISR dengan menggunakan objek DPC yang sama. |
KDEFERRED_ROUTINE |
Rutinitas CustomDpc diatur dengan memanggil KeInitializeDpc dan meneruskan penunjuk fungsi ke CustomDpc sebagai parameter kedua. Untuk mengantre CustomDpc untuk driver, panggil KeInsertQueueDpc dari rutinitas ISR dengan menggunakan objek DPC yang sama. |
KSERVICE_ROUTINE |
Layanan rutinitas InterruptService (ISR) mengganggu perangkat dan menjadwalkan pemrosesan data yang diterima pasca-interupsi, jika perlu. |
REQUEST_POWER_COMPLETE |
Rutinitas panggilan balik PowerCompletion menyelesaikan pemrosesan IRP daya. Jika driver perlu melakukan tugas tambahan setelah semua driver lain menyelesaikan IRP, driver mendaftarkan rutinitas panggilan balik PowerCompletion selama panggilan ke rutinitas PoRequestPowerIrp yang mengalokasikan IRP. |
WORKER_THREAD_ROUTINE |
Rutin Rutinitas adalah rutinitas panggilan balik yang ditentukan dalam parameter kedua untuk fungsi ExInitializeWorkItem . Rutinitas hanya boleh dinyatakan dengan cara ini jika driver memanggil ExQueueWorkItem untuk menambahkan item kerja ke antrean sistem. |
Mendeklarasikan Rutinitas Pengiriman Driver
Mulai Windows 10 Versi 2004, deklarasi jenis peran fungsi untuk rutinitas pengiriman disempurnakan dengan kategori IRP mereka secara otomatis berdasarkan inisialisasi tabel DriverObject-MajorFunction> dalam rutinitas DriverEntry driver WDM.
Driver Foo harus menyelesaikan deklarasi peran dengan menggunakan gaya deklarasi dasar atau lanjutan agar sesuai dengan SDV.
Inisialisasi Dasar dan Tingkat Lanjut
Gaya dasar dapat dilihat dalam contoh di bawah ini (perhatikan nama rutin pengiriman FooCreate dan FooCleanup hanyalah contoh, nama yang sesuai dapat digunakan):
DriverObject->MajorFunction[IRP_MJ_CREATE] = FooCreate; //Basic style
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCleanup;
Pendekatan yang lebih canggih dapat diambil untuk mempersingkat daftar yang diperlukan. Meskipun rutinitas pengiriman yang sama digunakan untuk lebih dari satu kategori IRP, driver dapat mengodekan dua inisialisasi dengan cara ini:
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCreateCleanup; // Advanced style for a multi-role dispatch routine
Agar driver dapat menjalankan SDV dengan benar, driver hanya boleh menggunakan gaya dasar atau tingkat lanjut yang ditunjukkan di atas. Verifikasi SDV pada driver tidak akan berfungsi seperti yang diharapkan jika salah satu dari dua metode ini tidak digunakan.
Parameter Fungsi dan Jenis Peran Fungsi
Seperti yang diperlukan dalam bahasa pemrograman C, jenis parameter yang Anda gunakan dalam definisi fungsi harus cocok dengan jenis parameter prototipe fungsi, atau dalam hal ini, jenis peran fungsi. SDV bergantung pada tanda tangan fungsi untuk analisis dan mengabaikan fungsi yang tanda tangannya tidak cocok.
Misalnya, Anda harus mendeklarasikan rutinitas IoCompletion menggunakan jenis peran fungsi IO_COMPLETION_ROUTINE:
IO_COMPLETION_ROUTINE myCompletionRoutine;
Saat Anda menerapkan myCompletionRoutine, jenis parameter harus cocok dengan yang digunakan oleh IO_COMPLETION_ROUTINE, yaitu, PDEVICE_OBJECT, PIRP, dan PVOID (lihat rutinitas IoCompletion untuk sintaks).
NTSTATUS
myCompletionRoutine(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
)
{
}
Menjalankan Analisis Kode untuk Driver untuk memverifikasi deklarasi fungsi
Untuk membantu Anda menentukan apakah kode sumber disiapkan, jalankan Analisis Kode untuk Driver. Analisis Kode untuk Driver memeriksa deklarasi jenis peran fungsi dan dapat membantu mengidentifikasi deklarasi fungsi yang mungkin terlewatkan atau memperingatkan Anda ketika parameter definisi fungsi tidak cocok dengan yang ada di jenis peran fungsi.