Bagikan melalui


C28168

peringatan C28168: Fungsi pengiriman tidak memiliki anotasi _Dispatch_type_ yang cocok dengan entri tabel pengiriman ini

Peringatan ini mendukung Pemverifikasi Driver Statis dengan memeriksa bahwa setiap fungsi yang ditetapkan ke dalam tabel pengiriman diannotasi dengan satu atau beberapa anotasi _Dispatch_type_ yang menunjukkan jenis operasi pengiriman yang dilakukan oleh fungsi tersebut. Alat Analisis Kode melaporkan kesalahan ini ketika anotasi pada fungsi tidak cocok dengan slot entri tabel pengiriman.

Cacat ini dapat diperbaiki baik dengan menambahkan anotasi _Dispatch_type_ ke fungsi atau memperbaiki entri tabel pengiriman yang digunakan.

Contoh

Contoh kode berikut menghasilkan peringatan ini.

DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...

Contoh kode berikut menghindari peringatan ini.

_Dispatch_type_(IRP_MJ_CREATE) DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...

Komentar

Dalam beberapa keadaan, Anda mungkin perlu menekan peringatan ini. Ada beberapa driver, misalnya, driver filter, yang mungkin mendaftarkan rutinitas pengiriman di dalam perulangan, setelah mereka mendaftarkan orang lain secara langsung.

DriverObject->MajorFunction[IRP_MJ_CREATE]         = DispatchCreate;
DriverObject->MajorFunction[IRP_MJ_READ]           = DispatchRead;
for (Index = 0; Index <= IRP_MJ_MAXIMUM_FUNCTION; Index++)
    {
            DriverObject->MajorFunction[Index] = DispatchPassIrp;
    }

Dalam contoh ini, fungsi DispatchPassIrp dinyatakan dengan benar dengan anotasi berikut:

__drv_dispatchType(IRP_MJ_CREATE_NAMED_PIPE)
__drv_dispatchType(IRP_MJ_QUERY_INFORMATION)
// .... 
//  (additional dispatch type annotations) 
// ....
__drv_dispatchType(IRP_MJ_CREATE_NAMED_PIPE)
    DRIVER_DISPATCH DispatchPassIrp;

Dalam situasi ini, alat Analisis Kode melaporkan kesalahan ini:

The function 'DispatchPassIrp' does not have a _Dispatch_type_ annotation matching dispatch table position 'IRP_MJ_CREATE' (0x00):  This can be  corrected either by adding a _Dispatch_type_ annotation to the function declaration or correcting the dispatch table entry being used.

Penggunaan perulangan dalam tabel pengiriman ini umum terjadi di beberapa driver filter. Dalam situasi ini, pesan kesalahan dapat diabaikan, karena ini adalah batasan analisis statis. Alat Analisis Kode melaporkan kesalahan ini ketika anotasi pada fungsi tidak cocok dengan slot entri tabel pengiriman. Dalam hal ini, alat Analisis Kode melaporkan penugasan ilegal (yang dibatalkan nanti). Namun, tidak ada cara bagi alat statis untuk mengetahui bahwa keadaan ilegal akan dibatalkan nantinya. Jika Anda tahu bahwa Anda membuat tugas dengan cara ini, dan memperbaikinya nanti, Anda dapat menekan peringatan.