DRIVER_DISPATCH fungsi panggilan balik (wdm.h)
Layanan rutin panggilan balik berbagai IRP. Untuk daftar kode fungsi, lihat Keterangan.
DRIVER_DISPATCH DriverDispatch;
NTSTATUS DriverDispatch(
[in, out] _DEVICE_OBJECT *DeviceObject,
[in, out] _IRP *Irp
)
{...}
[in, out] DeviceObject
Penunjuk yang disediakan penelepon ke struktur DEVICE_OBJECT . Ini adalah objek perangkat untuk perangkat target, yang sebelumnya dibuat oleh rutinitas AddDevice driver.
[in, out] Irp
Penunjuk yang disediakan penelepon ke struktur IRP yang menjelaskan operasi I/O yang diminta.
Jika rutinitas berhasil, rutinitas harus mengembalikan STATUS_SUCCESS. Jika tidak, itu harus mengembalikan salah satu nilai status kesalahan yang ditentukan dalam Ntstatus.h.
Parameter input untuk semua rutinitas Pengiriman disediakan dalam struktur IRP yang ditujukkan oleh Irp. Parameter tambahan disediakan di lokasi tumpukan I/O terkait driver, yang dijelaskan oleh struktur IO_STACK_LOCATION dan dapat diperoleh dengan memanggil IoGetCurrentIrpStackLocation.
Umumnya, semua rutinitas Pengiriman dijalankan dalam konteks utas arbitrer di IRQL = PASSIVE_LEVEL, tetapi ada pengecualian. Untuk informasi selengkapnya, lihat Mengirimkan Rutinitas dan IRQL.
Untuk informasi selengkapnya tentang rutinitas pengiriman, lihat Menulis Rutinitas Pengiriman. Untuk informasi selengkapnya tentang IRP, lihat Menangani IRP.
IRP | Tentang menerapkan panggilan balik |
---|---|
IRP_MJ_CLEANUP | Rutinitas DispatchCleanup pengemudi harus diberi nama XxxDispatchCleanup, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchCleanup di DriverObject-MajorFunction>[IRP_MJ_CLEANUP]. |
IRP_MJ_CLOSE | Rutinitas DispatchClose driver harus diberi nama XxxDispatchClose, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchClose di DriverObject-MajorFunction>[IRP_MJ_CLOSE]. |
IRP_MJ_CREATE | Rutinitas DispatchCreate driver harus diberi nama XxxDispatchCreate, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchCreate di DriverObject-MajorFunction>[IRP_MJ_CREATE]. |
IRP_MJ_CREATE atau IRP_MJ_CLOSE | Driver dapat menyediakan rutinitas DispatchCreateClose tunggal alih-alih rutinitas DispatchCreate dan DispatchClose terpisah. Rutinitas DispatchCreateClose driver harus diberi nama XxxDispatchCreateClose, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchCreateClose di DriverObject-MajorFunction>[IRP_MJ_CREATE] dan diDriverObject-MajorFunction>[IRP_MJ_CLOSE]. |
IRP_MJ_DEVICE_CONTROL | Rutinitas DispatchDeviceControl driver harus diberi nama XxxDispatchDeviceControl, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchDeviceControl di DriverObject-MajorFunction>[IRP_MJ_DEVICE_CONTROL]. Sistem menggunakan bendera FILE_XXX dalam kode kontrol I/O untuk menentukan apakah pengirim IRP memiliki hak istimewa untuk mengirim IRP ke objek perangkat. Driver untuk Windows Server 2003 dan versi Windows yang lebih baru dapat menggunakan rutinitas IoValidateDeviceIoControlAccess untuk melakukan pemeriksaan akses yang lebih ketat dalam DispatchDeviceControl. |
IRP_MJ_FLUSH_BUFFERS | Rutinitas DispatchFlushBuffers driver harus diberi nama XxxDispatchFlushBuffers, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchFlushBuffers di DriverObject-MajorFunction>[IRP_MJ_FLUSH_BUFFERS]. |
IRP_MJ_INTERNAL_DEVICE_CONTROL | Rutinitas DispatchInternalDeviceControl driver harus diberi nama XxxDispatchInternalDeviceControl, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchInternalDeviceControl di DriverObject-MajorFunction>[IRP_MJ_INTERNAL_DEVICE_CONTROL]. |
IRP_MJ_PNP | Rutinitas DispatchPnP driver harus diberi nama XxxDispatchPnP, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchPnP di DriverObject-MajorFunction>[IRP_MJ_PNP]. |
IRP_MJ_POWER | Rutinitas DispatchPower driver harus diberi nama XxxDispatchPower, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchPower di DriverObject-MajorFunction>[IRP_MJ_POWER]. |
IRP_MJ_QUERY_INFORMATION | Rutinitas DispatchQueryInformation driver harus diberi nama XxxDispatchQueryInformation, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchQueryInformation di DriverObject-MajorFunction>[IRP_MJ_QUERY_INFORMATION]. |
IRP_MJ_READ | Rutinitas DispatchRead driver harus diberi nama XxxDispatchRead, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchRead di DriverObject-MajorFunction>[IRP_MJ_READ]. |
IRP_MJ_READ atau IRP_MJ_WRITE | Driver dapat menyediakan rutinitas DispatchReadWrite tunggal alih-alih rutinitas DispatchRead dan DispatchWrite terpisah. Rutinitas DispatchReadWrite driver harus diberi nama XxxDispatchReadWrite, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchReadWrite di DriverObject-MajorFunction>[IRP_MJ_READ] dan diDriverObject-MajorFunction>[IRP_MJ_WRITE]. |
IRP_MJ_SET_INFORMATION | Rutinitas DispatchSetInformation driver harus diberi nama XxxDispatchSetInformation, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchSetInformation di DriverObject-MajorFunction>[IRP_MJ_SET_INFORMATION]. |
IRP_MJ_SHUTDOWN | Rutinitas DispatchShutdown driver harus diberi nama XxxDispatchShutdown, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchShutdown di DriverObject-MajorFunction>[IRP_MJ_SHUTDOWN]. Selain itu, untuk menerima permintaan IRP_MJ_SHUTDOWN , driver harus memanggil IoRegisterShutdownNotification atau IoRegisterLastChanceShutdownNotification untuk mendaftarkan rutinitas DispatchShutdown-nya dengan sistem. |
IRP_MJ_SYSTEM_CONTROL | Rutinitas DispatchSystemControl driver harus diberi nama XxxDispatchSystemControl, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchSystemControl di DriverObject-MajorFunction>[IRP_MJ_SYSTEM_CONTROL]. |
IRP_MJ_WRITE | Rutinitas DispatchWrite driver harus diberi nama XxxDispatchWrite, di mana Xxx adalah awalan khusus driver. Rutinitas DriverEntry driver harus menyimpan alamat rutin DispatchWrite di DriverObject-MajorFunction>[IRP_MJ_WRITE]. |
Untuk menentukan rutinitas panggilan balik, 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 DispatchCleanup yang diberi nama MyDispatchCleanup
, gunakan jenis DRIVER_DISPATCH seperti yang ditunjukkan dalam contoh kode ini:
DRIVER_DISPATCH MyDispatchCleanup;
Kemudian, terapkan rutinitas panggilan balik Anda sebagai berikut:
_Use_decl_annotations_
NTSTATUS
MyDispatchCleanup(
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp
)
{
// Function body
}
Jenis fungsi DRIVER_DISPATCH ditentukan dalam file header Wdm.h. Untuk mengidentifikasi kesalahan secara lebih akurat saat Anda menjalankan alat analisis kode, pastikan untuk menambahkan the_Use_decl_annotations_annotation ke definisi fungsi Anda. The_Use_decl_annotations_annotation memastikan bahwa anotasi yang diterapkan ke jenis fungsi DRIVER_DISPATCH 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 Perilaku Fungsi Anotasi.
Persyaratan | Nilai |
---|---|
Target Platform | Desktop |
Header | wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Dipanggil di PASSIVE_LEVEL (lihat bagian Keterangan). |