Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
предупреждение 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.
Это использование цикла в таблице отправки часто используется в некоторых драйверах фильтров. В этой ситуации сообщение об ошибке можно игнорировать, так как это ограничение статического анализа. Средство анализа кода сообщает об этой ошибке, если заметки в функции не соответствуют слоту записи таблицы отправки. В этом случае средство анализа кода сообщает о незаконном назначении (которое будет отменено позже). Тем не менее, нет способа статическое средство знать, что незаконное состояние будет отменено позже. Если вы знаете, что вы делаете назначения таким образом и исправляете их позже, вы можете отключить предупреждение.