C28168
Warnung C28168: Die Dispatchfunktion verfügt nicht über eine _Dispatch_type_ Anmerkung, die mit diesem Eintrag in der Verteilertabelle übereinstimmt.
Diese Warnung unterstützt die statische Treiberüberprüfung , indem überprüft wird, ob jede der Verteilertabelle zugewiesene Funktion mit einer oder mehreren _Dispatch_type_ Anmerkungen versehen ist, die die Arten von Verteilvorgängen angeben, die von dieser Funktion ausgeführt werden. Das Codeanalysetool meldet diesen Fehler, wenn die Anmerkungen für die Funktion nicht mit dem Eintragsslot für die Dispatchtabelle übereinstimmen.
Dieser Fehler kann entweder durch Hinzufügen einer _Dispatch_type_ Anmerkung zur Funktion oder durch Korrigieren des verwendeten Eintrags in der Verteilertabelle behoben werden.
Beispiel
Im folgenden Codebeispiel wird diese Warnung generiert.
DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...
Im folgenden Codebeispiel wird diese Warnung vermieden.
_Dispatch_type_(IRP_MJ_CREATE) DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...
Kommentare
Unter bestimmten Umständen müssen Sie diese Warnung möglicherweise unterdrücken. Es gibt einige Treiber, z. B. Filtertreiber, die Verteilungsroutinen innerhalb einer Schleife registrieren können, nachdem sie andere direkt registriert haben.
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;
}
In diesem Beispiel wird die DispatchPassIrp-Funktion mit den folgenden Anmerkungen ordnungsgemäß deklariert:
__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;
In dieser Situation meldet das Codeanalysetool diesen Fehler:
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.
Diese Verwendung einer Schleife in der Verteiltabelle ist in einigen Filtertreibern üblich. In dieser Situation kann die Fehlermeldung ignoriert werden, da dies eine Einschränkung der statischen Analyse ist. Das Codeanalysetool meldet diesen Fehler, wenn die Anmerkungen für die Funktion nicht mit dem Eintragsslot für die Dispatchtabelle übereinstimmen. In diesem Fall meldet das Codeanalysetool eine unzulässige Zuweisung (die später rückgängig wird). Es gibt jedoch keine Möglichkeit für ein statisches Tool zu wissen, dass ein illegaler Zustand später rückgängig machen wird. Wenn Sie wissen, dass Sie auf diese Weise Zuweisungen vornehmen und diese später beheben, können Sie die Warnung unterdrücken.