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