Compartir a través de


Regla UsbKmdfIrqlExplicit (kmdf)

La regla UsbKmdfIrqlExplicit comprueba que se llama a los DDIS de KMDF en el nivel IRQL correcto. Esta regla se aplica a todas las funciones EvtIoCallback.

Si el controlador llamó a la función WdfIoQueueCreate con la estructura WDF_OBJECT_ATTRIBUTES y el objeto de dispositivo pasado a esta DDI se creó con los atributos predeterminados (WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE o VOID WDF_OBJECT_ATTRIBUTES_INIT), es posible que tenga que modificar el controlador de una de las maneras siguientes para que el Comprobador de controladores estáticos no notifique un defecto relacionado con esta regla:

Establezca explícitamente los atributos de dispositivo en WdfExecutionLevelPassive o WdfExecutionLevelDispatch cambiando el código de controlador para establecer los atributos mediante una llamada a una función que usa la estructura WDF_OBJECT_ATTRIBUTES como parámetro.

Asuma o asafirme explícitamente para analizar que WdfExecutionLevelPassive o WdfExecutionLevelDispatch se establece en los atributos del dispositivo mediante la macro __analysis_assume . Este es un ejemplo: __analysis_assume(deviceAttributes.ExecutionLevel==WdfExecutionLevelPassive)

Si el controlador procesa algunas E/STL en PASSIVE_LEVEL y otras en DISPATCH_LEVEL, es posible que tenga que excluir las ICTL que se procesan en DISPATCH_LEVEL de la comprobación. Puede usar __analysis_assume para hacerlo. Este es un ejemplo: __analysis_assume(IoControlCode != IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE), donde IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE se procesa en DISPATCH_LEVEL en el controlador EvtIoDeviceControlCallback.

Modelo de controlador: KMDF

Cómo probar

En tiempo de compilación

Ejecute el comprobador de controladores estáticos y especifique la regla UsbKmdfIrqlExplicit .

Usa los pasos siguientes para ejecutar un análisis de tu código:
  1. Prepara el código (usa declaraciones de tipos de rol).
  2. Ejecuta el comprobador de controlador estático.
  3. Consulta y analiza los resultados.

Para obtener más información, vea Usar comprobador de controladores estáticos para buscar defectos en controladores.

Se aplica a

WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously