Regola UsbKmdfIrqlExplicit (kmdf)
La regola UsbKmdfIrqlExplicit verifica che le DDI kmDF vengano chiamate a livello di IRQL corrette. Questa regola si applica a tutte le funzioni EvtIoCallback.
Se il driver ha chiamato la funzione WdfIoQueueCreate con lo struct WDF_OBJECT_ATTRIBUTES e l'oggetto dispositivo passato a questo DDI è stato creato usando gli attributi predefiniti ( WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE o VOID WDF_OBJECT_ATTRIBUTES_INIT), potrebbe essere necessario modificare il driver in uno dei modi seguenti in modo che il verifica driver statico non segnala un difetto correlato a questa regola:
Impostare gli attributi del dispositivo in modo esplicito su WdfExecutionLevelPassive o WdfExecutionLevelDispatch modificando il codice driver per impostare gli attributi chiamando una funzione che usa lo struct WDF_OBJECT_ATTRIBUTES come parametro.
Presupporre in modo esplicito/asserzione per l'analisi che la macro WdfExecutionLevelPassive o WdfExecutionLevelDispatch è impostata negli attributi del dispositivo usando la macro __analysis_assume . Ecco un esempio: __analysis_assume(deviceAttributes.ExecutionLevel==WdfExecutionLevelPassive)
Se il driver elabora alcuni IOCTLs in PASSIVE_LEVEL e altri in DISPATCH_LEVEL, potrebbe essere necessario escludere gli IOCTLs elaborati in DISPATCH_LEVEL dalla verifica. È possibile usare __analysis_assume per eseguire questa operazione. Ecco un esempio: __analysis_assume(IoControlCode != IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE), dove IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE viene elaborato in DISPATCH_LEVEL nel driver EvtIoDeviceControlCallback.
Modello di driver: KMDF
Come eseguire il test
In fase di compilazione |
---|
Eseguire il verifica driver statico e specificare la regola UsbKmdfIrqlExplicit . Usa i passaggi descritti di seguito per eseguire un'analisi del codice:
Per altre informazioni, vedere Uso del verificatore driver statico per trovare i difetti nei driver. |
Si applica a
WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndfaceInformation WdfUsbInterfaceGetInterfaceNumber WdfdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDevice WdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetGetInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTarTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously