Бөлісу құралы:


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.

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