Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse 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