共用方式為


C28168

警告 C28168:分派函式沒有符合此分派數據表專案的 _Dispatch_type_ 批注

此警告支援 靜態驅動程序驗證器 ,方法是檢查指派給分派數據表的每個函式是否都以一或多個 _Dispatch_type_ 批註標註,指出該函式所執行的分派作業種類。 當函式上的註釋不符合分派數據表專案位置時,程式代碼分析工具會報告此錯誤。

您可以將 _Dispatch_type_ 批注新增至函式或更正所使用的分派數據表專案,來更正此瑕疵。

範例

下列程式代碼範例會產生這個警告。

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

下列程式代碼範例會避免這個警告。

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

評論

在某些情況下,您可能需要隱藏此警告。 例如,篩選驅動程式有一些驅動程式可能會在迴圈內註冊分派例程,之後直接註冊其他驅動程式。

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;
    }

在此範例中, DispatchPassIrp 函式會以下列批注正確宣告:

__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;

在這裡情況下,程式代碼分析工具會報告此錯誤:

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.

在分派數據表中使用迴圈在某些篩選驅動程式中很常見。 在此情況下,可以忽略錯誤訊息,因為這是靜態分析的限制。 當函式上的註釋不符合分派數據表專案位置時,程式代碼分析工具會報告此錯誤。 在此情況下,程式代碼分析工具會報告稍後) 復原的不合法指派 (。 不過,靜態工具無法知道稍後會復原不合法的狀態。 如果您知道以這種方式進行指派,並在稍後加以修正,您可以隱藏警告。