次の方法で共有


C28168

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

この警告では、ディスパッチ テーブル 割り当てられた各関数に、その関数によって実行されるディスパッチ操作の種類を示す 1 つ以上の _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.

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