警告 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.
调度表中的循环用法在某些筛选器驱动程序中很常见。 在这种情况下,可以忽略错误消息,因为这是静态分析的限制。 当函数上的批注与调度表条目槽不匹配时,代码分析工具将报告此错误。 在这种情况下,代码分析工具报告非法分配(稍后撤消)。 但是,静态工具无法知道以后将撤消非法状态。 如果你知道你以这种方式进行分配,并稍后对其进行修复,则可以禁止显示该警告。