Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die UsbKmdfIrqlExplicit-Regel überprüft, ob KMDF-DDIs auf der richtigen IRQL-Ebene aufgerufen werden. Diese Regel gilt für alle EvtIoCallback-Funktionen.
Wenn Ihr Treiber die WdfIoQueueCreate-Funktion mit der WDF_OBJECT_ATTRIBUTES-Struktur aufgerufen hat und das an diesen DDI übergebene Geräteobjekt mithilfe der Standardattribute (WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE oder VOID WDF_OBJECT_ATTRIBUTES_INIT) erstellt wurde, müssen Sie Ihren Treiber möglicherweise auf eine der folgenden Arten ändern, damit Static Driver Verifier keinen Fehler im Zusammenhang mit dieser Regel meldet:
Legen Sie die Geräteattribute explizit auf WdfExecutionLevelPassive oder WdfExecutionLevelDispatch fest, indem Sie den Treibercode ändern, um die Attribute festzulegen, indem Sie eine Funktion aufrufen, die die WDF_OBJECT_ATTRIBUTES-Struktur als Parameter verwendet.
Zur Analyse wird explizit davon ausgegangen/behauptet, dass WdfExecutionLevelPassive oder WdfExecutionLevelDispatch in den Geräteattributen mithilfe des makros __analysis_assume festgelegt ist. Beispiel: __analysis_assume(deviceAttributes.ExecutionLevel ==WdfExecutionLevelPassive)
Wenn Ihr Treiber einige IOCTLs bei PASSIVE_LEVEL und andere bei DISPATCH_LEVEL verarbeitet, müssen Sie möglicherweise die IOCTLs, die bei DISPATCH_LEVEL verarbeitet werden, von der Überprüfung ausschließen. Dazu können Sie __analysis_assume verwenden. Beispiel: __analysis_assume(IoControlCode != IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE), wobei IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE am DISPATCH_LEVEL im Treiber EvtIoDeviceControlCallback verarbeitet wird.
Treibermodell: KMDF
So führen Sie einen Test durch
| Beim Kompilieren: |
|---|
Führen Sie Static Driver Verifier aus, und geben Sie die UsbKmdfIrqlExplicit-Regel an. Gehen Sie folgendermaßen vor, um Ihren Code zu analysieren:
Weitere Informationen finden Sie unter Verwenden der statischen Treiberüberprüfung, um Fehler in Treibern zu finden. |
Gilt für:
WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDevic EFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchroneWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronlyWdfUsbTargetDeviceSendUrbSynchronlyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronlyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronly