C28168

警告 C28168: ディスパッチ関数には、このディスパッチ テーブル エントリに一致する _Dispatch_type_ アノテーションがありません

この警告は、ディスパッチ テーブルに割り当てられた各関数に、その関数によって実行されるディスパッチ操作の種類を示す1つ以上の _Dispatch_type_ 注釈が付けられていることを確認することにより、Static Driver Verifierをサポートします。 コード分析ツールは、関数の注釈がディスパッチ テーブル エントリ スロットと一致しない場合にこのエラーを報告します。

この欠陥は、_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.

ディスパッチ テーブルでのループのこの使用は、一部のフィルター ドライバーで一般的です。 この状況では、これは静的解析の制限であるため、エラー メッセージは無視できます。 コード分析ツールは、関数の注釈がディスパッチ テーブル エントリ スロットと一致しない場合にこのエラーを報告します。 この場合、コード分析ツールは不正な割り当てを報告します (後で元に戻されます)。 ただし、静的ツールでは、不正な状態が後で元に戻されることを知る方法はありません。 この方法で割り当てを行っており、後で修正することがわかっている場合は、警告を抑制できます。