Condividi tramite


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:
  1. Prepara il codice (usa dichiarazioni di tipo ruolo).
  2. Esegui Driver Verifier statico.
  3. Visualizza e analizza i risultati.

Per altre informazioni, vedere Uso del verificatore driver statico per trovare i difetti nei driver.

Si applica a

WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndfaceInformation WdfUsbInterfaceGetInterfaceNumber WdfdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDevice WdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetGetInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTarTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously