NDIS/WiFi 시간 제한 오류 디버깅 - DRIVER_VERIFIER_DETECTED_VIOLATION(C4)
NDIS/WIFI 확인 옵션을 선택하고 드라이버 검증 도구가 드라이버가 NDIS/WiFi 시간 제한 규칙 중 하나를 위반하는 것을 감지하면 드라이버 검증 도구는 버그 검사 0xC4 생성합니다. DRIVER_VERIFIER_DETECTED_VIOLATION(매개 변수 1은 특정 NDIS/WiFi 시간 제한 규칙의 식별자와 같음).
드라이버 검증 도구가 NdisTimedOidComplete와 같은 NDIS/WIFI 시간 제한 규칙을 테스트하는 경우 드라이버 검증 도구의 폴링 메커니즘은 여러 주기 내에 미니포트 드라이버의 응답을 예상합니다. 각 시간 제한 규칙은 허용되는 자체 최대 주기를 정의했습니다. 최대값을 초과하면 드라이버 검증 도구는 버그 검사 생성합니다. 이 섹션에서는 이러한 위반을 디버깅하기 위한 몇 가지 예제 전략을 설명합니다.
NDIS/WIFI 시간 제한 오류 디버깅
- !analyze를 사용하여 버그 검사 대한 정보를 표시합니다.
- !ruleinfo 확장 명령 사용
- LAST_CALL_STACK 링크를 클릭하여 위반 위치를 식별합니다.
- NDIS/WIFI 시간 제한 위반의 원인 수정
!analyze를 사용하여 버그 검사 대한 정보를 표시합니다.
발생하는 버그 검사 마찬가지로 디버거를 제어할 수 있으면 가장 좋은 첫 번째 단계는 !analyze -v 명령을 실행하는 것입니다.
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: 00092003, ID of the 'NdisTimedOidComplete' rule that was violated.
Arg2: 8521dd34, A pointer to the string describing the violated rule condition.
Arg3: 9c17b860, Address of internal rule state (second argument to !ruleinfo).
Arg4: 9c1f3480, Address of supplemental states (third argument to !ruleinfo).
!analyze -v 출력의 다음 섹션에서 규칙이 위반된 이유는 DV_VIOLATED_CONDITION 필드에 표시됩니다. DV_MSDN_LINK 섹션은 이 규칙에 대한 설명서 링크를 가져오는 데도 유용합니다.
디버깅 세부 정보:
*** ERROR: Module load completed but symbols could not be loaded for NdisTimedOidComplete.sys
DV_VIOLATED_CONDITION: Timeout on completing an NDIS OID request.
DV_MSDN_LINK: https://zcusa.951200.xyz/windows-hardware/drivers/devtest/ndis-ndistimedoidcomplete
DRIVER_OBJECT: 98a87980
IMAGE_NAME: NdisTimedOidComplete.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 5229c857
MODULE_NAME: NdisTimedOidComplete
FAULTING_MODULE: 9fee1000 NdisTimedOidComplete
이 분석 출력을 더 자세히 알아보려면 DV_RULE_INFO 섹션 아래의 링크를 클릭하여 추가 규칙 설명을 확인할 수 있습니다. 제한 시간 규칙 유형의 경우 현재 스택에 관련 정보가 포함되지 않을 수 있습니다.
DV_RULE_INFO: 0x92003
BUGCHECK_STR: 0xc4_NdisTimedOidComplete_XDV
DEFAULT_BUCKET_ID: WIN8_DRIVER_FAULT
PROCESS_NAME: System
CURRENT_IRQL: 2
ANALYSIS_VERSION: 6.13.0016.1929 (debuggers(dbg).130725-1857) amd64fre
LAST_CONTROL_TRANSFER: from 80f87fd3 to 80f0ed14
STACK_TEXT:
8912380c 80f87fd3 00000003 e6c3476e 00000065 nt!RtlpBreakWithStatusInstruction
89123860 80f87aed 825a6138 89123c5c 89123cac nt!KiBugCheckDebugBreak+0x1f
89123c30 80f0d8d6 000000c4 00092003 8521dd34 nt!KeBugCheck2+0x676
89123c54 80f0d80d 000000c4 00092003 8521dd34 nt!KiBugCheck2+0xc6
89123c74 85211584 000000c4 00092003 8521dd34 nt!KeBugCheckEx+0x19
89123cac 85216d54 9c17b860 9c1f3480 9c17b8dc VerifierExt!SLIC_StatefulAbort+0x1a4
89123cd0 85216ffe 85220000 85215f5b 00000000 VerifierExt!Ndis_OnTimerExpire+0x234
89123cd8 85215f5b 00000000 80ecd56a 843d0c38 VerifierExt!CheckOnTimerExpire+0x26
89123ce0 80ecd56a 843d0c38 00000000 80ecd502 VerifierExt!XdvPassiveTimerRoutine+0x1d
89123d24 80eec133 882befd0 00000000 887debc0 nt!IopProcessWorkItem+0x68
89123d70 80ec1162 00000000 e6c342be 00000000 nt!ExpWorkerThread+0x14f
89123db0 80f23201 80eebfe4 00000000 00000000 nt!PspSystemThreadStartup+0x58
89123dbc 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x15
!ruleinfo 확장 명령 사용
DV_RULE_INFO:!analyze 출력의 필드에는 이 규칙 위반에 대한 자세한 정보를 찾는 데 사용할 수 있는 명령에 대한 링크가 표시됩니다. 이 예제에서는 링크를 클릭하면 Arg3 및 Arg 4 버그 검사 값이 RULE_ID(0x92003)와 함께 !ruleinfo 명령을 실행합니다.
kd> !ruleinfo 0x92003 0xffffffff9c17b860 0xffffffff9c1f3480
RULE_ID: 0x92003
RULE_NAME: NdisTimedOidComplete
RULE_DESCRIPTION:
This rule verifies if an NDIS miniport driver completes an OID in time.
The OID is tracked (a.k.a., TRACKED_OBJECT). Use !ndiskd.oid .
MSDN_LINK: https://zcusa.951200.xyz/windows-hardware/drivers/devtest/ndis-ndistimedoidcomplete
CONTEXT: Miniport 0x86BD10E8
CURRENT_TIME (Timed Rules): 168 seconds
TRACKED_OBJECT: 0x86633804
LAST_CALL_STACK: 0x9C1F3480 + 0x10
RULE_STATE: 0x9C1F3480
위반 위치 식별
여기서 사용하는 예제에서 미니포트 드라이버인 NdisTimedOidComplete.sys MPOidRequest 함수에 주입된 절전 모드 주기가 있습니다. !ruleinfo 출력의 LAST_CALL_STACK 링크를 클릭하여 검사 수 있습니다. 이 호출 스택은 드라이버 검증 도구에서 볼 수 있는 마지막 호출 스택으로, 시간 초과가 발생하기 전에 NDIS가 ndisMInvokeOidRequest 라고 하는 것을 볼 수 있습니다.
kd> dps 0x9C1F3480 + 0x10
9c1f3490 850e1e37 ndis!ndisMInvokeOidRequest+0x16641
9c1f3494 850765c8 ndis!ndisMDoOidRequest+0x24a
9c1f3498 8507552a ndis!ndisQueueOidRequest+0x2fa
9c1f349c 8507372b ndis!ndisQuerySetMiniportEx+0xd9
9c1f34a0 85073646 ndis!ndisQuerySetMiniport+0x18
9c1f34a4 850dd9c8 ndis!ndisMDoMiniportOp+0x8c
9c1f34a8 850dd916 ndis!ndisMNotifyMachineName+0xe4
9c1f34ac 85104005 ndis!ndisMInitializeAdapter+0xad7
NDIS WIFI 시간 제한 위반의 원인 수정
시간 제한 규칙에 대해 크래시 덤프가 생성되면 크래시 덤프 시 근본 원인을 찾을 수 있습니다. 추가로 디버그하려면 NdisKd 디버거 확장 명령으로 시작하는 것이 좋습니다. NDIS 확장(Ndiskd.dll) 및 NDISKD 시작을 참조하세요. 드라이버가 ETW를 구현한 경우 ETW(Windows용 이벤트 추적) 로그를 확인해야 할 수도 있습니다. 이 규칙을 사용하도록 설정하지 않은 경우 이 오류는 사용자 애플리케이션이 최상으로 중단되거나 버그 검사 0x9F( 최악의 경우 DRIVER_POWER_STATE_FAILURE )로 나타납니다.