DDI 규정 준수 버그 디버깅 - DRIVER_VERIFIER_DETECTED_VIOLATION(C4): 0x20002 - 0x20022

DDI 준수 검사 옵션을 선택하고 드라이버 검증 도구가 드라이버가 DDI 준수 규칙 중 하나를 위반하는 것을 감지하면 드라이버 검증 도구버그 검사 0xC4 생성합니다. DRIVER_VERIFIER_DETECTED_VIOLATION(매개 변수 1은 특정 준수 규칙의 식별자와 동일).

DDI 규정 준수 규칙은 드라이버가 Windows 운영 체제 커널과 올바르게 상호 작용하도록 합니다. 예를 들어 규칙은 드라이버가 함수에 필요한 IRQL에서 함수를 호출하거나 드라이버가 스핀 잠금을 올바르게 획득하고 해제했는지 확인합니다. 이 섹션에서는 이러한 위반을 디버깅하기 위한 몇 가지 예제 전략을 설명합니다.

DDI 규정 준수 검사 위반 디버깅

!analyze를 사용하여 버그 검사 대한 정보를 표시합니다.

발생하는 버그 검사 마찬가지로 디버거를 제어할 수 있으면 가장 좋은 첫 번째 단계는 !analyze -v 명령을 실행하는 것입니다.

*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
A device driver attempting to corrupt the system has been caught.  This is
because the driver was specified in the registry as being suspect (by the
administrator) and the kernel has enabled substantial checking of this driver.
If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will
be among the most commonly seen crashes.
Arguments:
Arg1: 00020004, ID of the 'IrqlExAllocatePool' rule that was violated.
Arg2: 8481c118, A pointer to the string describing the violated rule condition.
Arg3: 00000000, Reserved (unused).
Arg4: 00000000, Reserved (unused).

## Debugging Details:


DV_VIOLATED_CONDITION:  ExAllocatePoolWithTagPriority should only be called at IRQL <= DISPATCH_LEVEL.

DV_MSDN_LINK: https://go.microsoft.com/fwlink/p/?linkid=216021

DV_RULE_INFO: 0x20004

드라이버 검증 도구DDI 규정 준수 검사 위반을 catch할 때마다 위반에 대한 정보가 !analyze 출력에 제공됩니다.

이 예제에서 버그 검사 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION 0x20004 매개 변수 1(Arg1) 값이 있습니다. 이는 드라이버가 IrqlExAllocatePool 규정 준수 규칙을 위반했음을 나타냅니다.

!analyze 출력에는 다음 정보가 포함됩니다.

DV_VIOLATED_CONDITION: 이 필드는 규칙 위반의 원인에 대한 설명을 제공합니다. 이 예제에서 위반된 조건은 드라이버가 매우 높은 IRQL 수준에서 메모리를 할당하려고 시도하거나 DISPATCH_LEVEL 페이징 풀 메모리를 할당하려고 했다는 것입니다. 예를 들어 ISR(인터럽트 서비스 루틴)에서 ExAllocatePoolWithTagPriority 를 호출하려는 드라이버 또는 스핀 잠금을 보유하는 동안 페이징된 풀 메모리를 할당하려고 시도한 드라이버일 수 있습니다.

DV_MSDN_LINK: WinDBG에서 이 링크는 디버거가 IrqlExAllocatePool 규칙에 대한 자세한 정보를 보여 주는 MSDN 페이지를 열게 하는 라이브 링크입니다.

DV_RULE_INFO: WinDBG에서 이 링크는 디버거에서 사용할 수 있는 도움말에서 이 규칙에 대한 정보를 표시하는 라이브 링크입니다.

!ruleinfo 확장 명령 사용

DV_RULE_INFO:!analyze 출력 필드에는 이 규칙 위반에 대한 자세한 정보를 찾는 데 사용할 수 있는 명령이 표시됩니다. 이 예제에서는 !ruleinfo 0x20004 명령을 사용할 수 있습니다.

kd> !ruleinfo 0x20004

RULE_ID: 0x20004

RULE_NAME: IrqlExAllocatePool

RULE_DESCRIPTION:
The IrqlExAllocatePool rule specifies that the driver calls:
ExAllocatePool,
ExAllocatePoolWithTag,
ExAllocatePoolWithQuota,
ExAllocatePoolWithQuotaTag and
ExAllocatePoolWithTagPriority
only when it is executing at IRQL <= DISPATCH_LEVEL. A caller
executing at DISPATCH_LEVEL must specify a NonPagedXxx value
for PoolType. A caller executing at IRQL <= APC_LEVEL can
specify any POOL_TYPE value.

MSDN_LINK: https://go.microsoft.com/fwlink/p/?linkid=216021

!analyze-v 명령을 사용하여 소스 코드에서 위반 위치를 식별합니다.

이 위반이 발견되면 드라이버 검증 도구는 즉시 시스템에 검사 버그가 발생합니다. !analyze 출력은 현재 IRQL, 현재 스택, 메모리 할당 호출이 수행된 지점을 표시하고, 소스 코드가 사용하도록 설정된 경우 !analyze –v(자세한 정보) 출력에는 할당 요청이 수행된 원본 파일 및 줄 번호도 표시됩니다.

CURRENT_IRQL:  10

ANALYSIS_VERSION: 6.13.0016.1929 (debuggers(dbg).130725-1857) amd64fre

LAST_CONTROL_TRANSFER:  from 80ff159d to 80f751f4

STACK_TEXT:  
82f9eaa4 81dda59d 00000003 86fab4b0 00000065 nt!RtlpBreakWithStatusInstruction
82f9eaf8 81dda0b7 82fa0138 82f9eef8 82f9ef40 nt!KiBugCheckDebugBreak+0x1f
82f9eecc 81d5cdc6 000000c4 00020004 85435118 nt!KeBugCheck2+0x676
82f9eef0 81d5ccfd 000000c4 00020004 85435118 nt!KiBugCheck2+0xc6
82f9ef10 8542cb4e 000000c4 00020004 85435118 nt!KeBugCheckEx+0x19
82f9ef30 85425ded ffffffff 85425e0d 82f9ef60 VerifierExt!SLIC_abort+0x40
82f9ef38 85425e0d 82f9ef60 8210c19e 00000080 VerifierExt!SLIC_ExAllocatePoolWithTagPriority_internal_entry_IrqlExAllocatePool+0x6f
82f9ef40 8210c19e 00000080 00000000 00000000 VerifierExt!ExAllocatePoolWithTagPriority_internal_wrapper+0x19
82f9ef60 826c9e16 00000000 00000000 00000000 nt!VerifierExAllocatePoolWithTag+0x24
82f9efa8 81d0726c 833cba80 8a4b9480 00000000 MyDriver!HandleISR+0x146
82f9efbc 81d071c1 833cba80 8a4b9480 000000b8 nt!KiInterruptMessageDispatch+0x12
82f9efe4 81d71f29 00000001 525b61ea 00000224 nt!KiCallInterruptServiceRoutine+0x6d
82f9efe8 00000000 525b61ea 00000224 00000000 nt!KiInterruptDispatch+0x49

STACK_COMMAND:  kb

FOLLOWUP_IP: 
MyDriver!HandleISR+0x140
826c9e10 ff154440699b    call    dword ptr [IrqlExAllocatePool_ExAllocatePoolWithTag!_imp__ExAllocatePoolWithTag (9b694044)]

FAULTING_SOURCE_LINE:  d:\drvsrc\mydriver\isrhandler.c

FAULTING_SOURCE_FILE:  d:\drvsrc\mydriver\isrhandler.c

FAULTING_SOURCE_LINE_NUMBER:  206

DDI 규정 준수 위반의 원인 수정

0x00020022 0x00020000 범위에 Arg1 값이 있는 이러한 버그 검사를 수정하는 것은 일반적으로 드라이버가 해당 설명서에 설명된 API 및 DDI 사용 조건을 충족하는지 확인하는 것으로 구성됩니다.

여기서 사용한 예제(0x20004)에서는 ISR에서 모든 종류의 메모리 할당이 ExAllocatePoolWithTagPriority 루틴에 설정된 IRQL 규칙을 위반합니다.

일반적으로 IRQL 및 적절한 사용에 대한 정보는 루틴에 대한 설명서를 검토해야 합니다. 함수를 테스트하는 특정 DDI 규정 준수 규칙을 검토합니다. 이 경우 규칙은 IrqlExAllocatePool입니다.

정적 드라이버 검증 도구 를 사용하여 동일한 규칙을 사용하여 드라이버 소스 코드를 분석합니다. 정적 드라이버 검증 도구는 Windows 드라이버 소스 코드를 검사하고 다양한 코드 경로의 실행을 시뮬레이션하여 가능한 문제를 보고하는 도구입니다. 정적 드라이버 검증 도구는 이러한 종류의 문제를 식별하는 데 도움이 되는 뛰어난 개발 시간 유틸리티입니다.

DDI 규정 준수 검사

DDI 규정 준수 규칙

정적 드라이버 검증 도구

버그 검사 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION