Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
upozornění C28168: Funkce dispatch nemá _Dispatch_type_ poznámku odpovídající této položce tabulky dispatch.
Toto upozornění podporuje ověřitel statického ovladače tím, že zkontrolujete, že každá funkce přiřazená do tabulky dispatch je opatřena poznámkami jednoho nebo více _Dispatch_type_ poznámek, které označují druhy operací odeslání prováděné touto funkcí. Nástroj Analýza kódu hlásí tuto chybu, pokud poznámky funkce neodpovídají vstupnímu slotu tabulky dispatch.
Tuto vadu lze opravit přidáním _Dispatch_type_ poznámky do funkce nebo opravou použité položky tabulky dispatch.
Příklad
Následující příklad kódu vygeneruje toto upozornění.
DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...
Následující příklad kódu zabrání tomuto upozornění.
_Dispatch_type_(IRP_MJ_CREATE) DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...
Komentáře
V některých případech může být nutné toto upozornění potlačit. Existují například některé ovladače, které můžou registrovat rutiny odesílání ve smyčce poté, co zaregistrují jiné přímo.
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;
}
V tomto příkladu je funkce DispatchPassIrp správně deklarována s následujícími poznámkami:
__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;
V takovém případě nástroj pro analýzu kódu hlásí tuto chybu:
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.
Toto použití smyčky v tabulce dispečera je běžné v některých ovladačích filtru. V této situaci je možné chybovou zprávu ignorovat, protože jde o omezení statické analýzy. Nástroj Analýza kódu hlásí tuto chybu, pokud poznámky funkce neodpovídají vstupnímu slotu tabulky dispatch. V tomto případě nástroj analýza kódu hlásí neplatné přiřazení (které je později vráceno zpět). Statický nástroj však neexistuje způsob, jak zjistit, že se později vrátí neplatný stav. Pokud víte, že tímto způsobem vytváříte přiřazení a později je opravíte, můžete upozornění potlačit.