다음을 통해 공유


UsbKmdfIrqlExplicit 규칙(kmdf)

UsbKmdfIrqlExplicit 규칙은 KMDF DDI가 올바른 IRQL 수준에서 호출되는지 확인합니다. 이 규칙은 모든 EvtIoCallback 함수에 적용됩니다.

드라이버가 WDF_OBJECT_ATTRIBUTES 구조체를 사용하여 WdfIoQueueCreate 함수를 호출하고 이 DDI에 전달된 디바이스 개체가 기본 특성(WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE 또는 VOID WDF_OBJECT_ATTRIBUTES_INIT)을 사용하여 만든 경우 정적 드라이버 검증 도구가 이 규칙과 관련된 결함을 보고하지 않도록 다음 방법 중 하나로 드라이버를 수정해야 할 수 있습니다.

WDF_OBJECT_ATTRIBUTES 구조체 를 매개 변수로 사용하는 함수를 호출하여 특성을 설정하도록 드라이버 코드를 변경하여 디바이스 특성을 WdfExecutionLevelPassive 또는 WdfExecutionLevelDispatch로 명시적으로 설정합니다.

WdfExecutionLevelPassive 또는 WdfExecutionLevelDispatch가 __analysis_assume 매크로를 사용하여 디바이스 특성에서 설정되었다는 분석을 위해 명시적으로 가정/어설션합니다. 다음은 __analysis_assume(deviceAttributes.ExecutionLevel==WdfExecutionLevelPassive)입니다.

드라이버가 PASSIVE_LEVEL 일부 IOCTL과 DISPATCH_LEVEL 다른 IOCTL을 처리하는 경우 DISPATCH_LEVEL 처리되는 IOCTL을 확인에서 제외해야 할 수 있습니다. __analysis_assume 사용하여 이 작업을 수행할 수 있습니다. 다음은 __analysis_assume(IoControlCode != IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE)입니다. 여기서 IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE 드라이버 EvtIoDeviceControlCallback의 DISPATCH_LEVEL 처리됩니다.

드라이버 모델: KMDF

테스트 방법

컴파일 시

정적 드라이버 검증 도구를 실행하고 UsbKmdfIrqlExplicit 규칙을 지정합니다.

다음 단계를 사용하여 코드 분석을 실행합니다.
  1. 코드를 준비합니다(역할 형식 선언 사용).
  2. 정적 드라이버 검증 도구 실행
  3. 결과를 보고 분석합니다.

자세한 내용은 정적 드라이버 검증 도구로 드라이버에서 결함 찾기를 참조하세요.

적용 대상

WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceDeviceDeviceDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously