Поделиться через


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.

Такое использование цикла в таблице диспетчеризации распространено в некоторых драйверах фильтров. В этом случае сообщение об ошибке можно игнорировать, так как это ограничение статического анализа. Средство анализа кода сообщает об этой ошибке, если заметки в функции не соответствуют слоту ввода таблицы диспетчеризации. В этом случае средство анализа кода сообщает о незаконном назначении (которое будет отменено позже). Тем не менее, статический инструмент не может знать, что незаконное состояние будет отменено позже. Если вы знаете, что выполняете задания таким образом и исправляете их позже, вы можете отключить предупреждение.