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 typedefs yang telah ditentukan sebelumnya yang sesuai dengan titik masuk yang dikenali dalam driver WDM.

Misalnya, untuk membuat deklarasi jenis peran fungsi untuk rutinitas Bongkar muat 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 ditunjukkan dalam tabel berikut.

Jenis peran fungsi WDM Rutinitas WDM

DRIVER_INITIALIZE

DriverEntry

DRIVER_STARTIO

StartIO

DRIVER_UNLOAD

Membongkar

DRIVER_ADD_DEVICE

TambahkanDevice

DRIVER_DISPATCH Dispatch_type(jenis)

Rutinitas pengiriman yang digunakan oleh pengemudi. Lihat Menulis Rutinitas Pengiriman.

IO_COMPLETION_ROUTINE

IoCompletion

Rutinitas IoCompletion diatur dengan memanggil IoSetCompletionRoutine atau IoSetCompletionRoutineEx dan meneruskan penunjuk fungsi ke rutinitas IoCompletion sebagai parameter kedua.

DRIVER_CANCEL

Batalkan

Rutinitas Batal diatur dengan memanggil IoSetCancelRoutine dan meneruskan penunjuk fungsi ke rutinitas pembatalan untuk IRP sebagai parameter kedua ke fungsi.

IO_DPC_ROUTINE

DpcForIsr

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

CustomDpc

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

InterruptService

Layanan rutinitas InterruptService (ISR) mengganggu perangkat dan menjadwalkan pemrosesan pasca-interupsi data yang diterima, 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 lanjutan 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 tergantung 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.