Share via


자동 검사

드라이버 검증 도구는 하나 이상의 드라이버를 확인할 때마다 다음 검사를 수행합니다. 이러한 검사를 활성화하거나 비활성화할 수 없습니다. Windows 10 버전 1709부터 이러한 자동 검사가 관련 표준 플래그로 이동되었습니다. 따라서 표준 플래그를 사용하여 드라이버 검증 도구를 사용하도록 설정하는 사용자는 검사 감소가 적용되지 않아야 합니다.

IRQL 및 메모리 루틴 모니터링

드라이버 검증 도구는 선택한 드라이버에서 다음과 같은 금지된 작업을 모니터링합니다.

  • KeLowerIrql을 호출하여 IRQL 발생

  • KeRaiseIrql을 호출하여 IRQL 낮추기

  • 크기 0 메모리 할당 요청

  • IRQL > APC_LEVEL 사용하여 페이징 풀 할당 또는 해제

  • IRQL > DISPATCH_LEVEL 사용하여 비페이지 풀 할당 또는 해제

  • 이전 할당에서 반환되지 않은 주소를 해제하려고 시도

  • 이미 해제된 주소를 해제하려고 합니다.

  • IRQL > APC_LEVEL 사용하여 빠른 뮤텍스 획득 또는 해제

  • IRQL이 DISPATCH_LEVEL 없는 스핀 잠금 획득 또는 해제

  • 스핀 잠금을 두 번 해제합니다.

  • 할당 요청 MUST_SUCCEED 표시합니다. 이러한 요청은 허용되지 않습니다.

드라이버 검증 도구가 활성 상태가 아닌 경우 이러한 위반으로 인해 모든 경우에 즉각적인 시스템 크래시가 발생하지 않을 수 있습니다. 드라이버 검증 도구는 드라이버의 동작을 모니터링하고 이러한 위반이 발생하는 경우 버그 검사 0xC4 문제를 발생합니다. 버그 검사 매개 변수 목록은 버그 검사 0xC4(DRIVER_VERIFIER_DETECTED_VIOLATION)을 참조하세요.

모니터링 스택 전환

드라이버 검증 도구는 확인 중인 드라이버의 스택 사용량을 모니터링합니다. 드라이버가 스택을 전환하고 새 스택이 스레드 스택이나 DPC 스택이 아닌 경우 버그 검사 발생합니다. 첫 번째 매개 변수가 0x90 동일한 버그 검사 0xC4. KB 디버거 명령으로 표시되는 스택은 일반적으로 이 작업을 수행한 드라이버를 표시합니다.

드라이버 언로드 확인

확인 중인 드라이버가 언로드되면 드라이버 검증 도구는 드라이버가 정리되었는지 확인하기 위해 여러 검사를 수행합니다.

특히 드라이버 검증 도구는 다음을 찾습니다.

  • 삭제되지 않은 타이머

  • 보류 중인 DPC(지연 프로시저 호출)

  • 삭제되지 않은 lookaside 목록

  • 삭제되지 않은 작업자 스레드

  • 삭제되지 않은 큐

  • 기타 유사한 리소스

이와 같은 문제로 인해 드라이버가 언로드된 후 시스템 버그 검사가 얼마 동안 실행될 수 있으며 이러한 버그 검사의 원인을 파악하기 어려울 수 있습니다. 드라이버 검증 도구가 활성 상태이면 이러한 위반으로 인해 드라이버가 언로드된 직후 버그 검사 0xC7 발생합니다. 버그 검사 매개 변수 목록은 버그 검사 0xC7(TIMER_OR_DPC_INVALID)을 참조하세요.

MDL(메모리 설명자 목록) 사용 모니터링

Windows Vista에서 드라이버 검증 도구는 선택한 드라이버에서 다음과 같은 금지된 작업을 모니터링합니다.

  • 적절한 플래그가 없는 MDL에서 MmProbeAndLockPages 또는 MmProbeAndLockProcessPages를 호출합니다. 예를 들어 MmBuildMdlForNonPagedPool을 사용하여 만든 MDL에 대해 MmProbeAndLockPages를 호출하는 것은 올바르지 않습니다.

  • 적절한 플래그가 없는 MDL에서 MmMapLockedPages 를 호출합니다. 예를 들어 시스템 주소 또는 잠겨 있지 않은 MDL에 이미 매핑된 MDL에 대해 MmMapLockedPages 를 호출하는 것은 올바르지 않습니다.

  • 부분 MDL, 즉 IoBuildPartialMdl을 사용하여 만든 MDL에서 MmUnlockPages 또는 MmUnmapLockedPages를 호출합니다.

  • 시스템 주소에 매핑되지 않은 MDL에서 MmUnmapLockedPages 를 호출합니다.

드라이버 검증 도구가 활성화되지 않은 경우 이러한 위반으로 인해 시스템이 모든 경우에 즉시 응답하지 않을 수 있습니다. 드라이버 검증 도구는 드라이버의 동작을 모니터링하고 이러한 위반이 발생하는 경우 버그 검사 0xC4 문제를 발생합니다. 버그 검사 매개 변수 목록은 버그 검사 0xC4(DRIVER_VERIFIER_DETECTED_VIOLATION)을 참조하세요.

NonPagedPoolSession 메모리에서 동기화 개체 할당

Windows 7부터 드라이버 검증 도구는 세션 메모리에서 동기화 개체를 확인합니다.

동기화 개체는 페이지를 매기지 않아야 합니다. 또한 전역, 시스템 차원의 가상 주소 공간에 있어야 합니다.

그래픽 드라이버는 EngAllocMem과 같은 API를 호출하여 세션 메모리를 할당할 수 있습니다. 전역 주소 공간과 달리 세션 주소 공간은 각 터미널 서버 세션에 대해 가상화됩니다. 즉, 서로 다른 두 세션의 컨텍스트에서 사용되는 동일한 가상 주소는 두 개의 서로 다른 개체를 참조합니다. Windows 커널은 모든 터미널 서버 세션에서 동기화 개체에 액세스할 수 있어야 합니다. 다른 세션에서 세션 메모리 주소를 참조하려고 하면 시스템 크래시 또는 다른 세션 데이터의 자동 손상과 같은 예측할 수 없는 결과가 발생합니다.

Windows 7부터 확인된 드라이버가 KeInitializeEvent 또는 KeInitializeMutex와 같은 API를 호출하여 동기화 개체를 초기화할 때 드라이버 검증 도구는 개체의 주소가 세션 가상 주소 공간 내에 있는지 여부를 확인합니다. 드라이버 검증 도구가 이러한 종류의 잘못된 주소를 감지하면 매개 변수 1 값 이 0xDF 버그 검사 0xC4 DRIVER_VERIFIER_DETECTED_VIOLATION 발급됩니다.

개체 참조 카운터가 0에서 1로 변경되었습니다.

Windows 7부터 드라이버 검증 도구는 잘못된 개체 참조의 추가 클래스를 확인합니다.

Windows 커널 개체 관리자가 File 개체 또는 Thread 개체와 같은 개체를 만들면 새 개체의 참조 카운터가 1로 설정됩니다. 참조 카운터는 ObReferenceObjectByPointer 또는 ObReferenceObjectByHandle과 같은 API에 대한 호출로 증가합니다. 참조 카운터는 동일한 개체에 대한 모든 ObDereferenceObject 호출에 의해 감소됩니다.

참조 카운터가 0 값에 도달하면 개체를 해제할 수 있습니다. 개체 관리자가 즉시 해제하거나 나중에 해제할 수 있습니다. ObReferenceObjectByPointer 또는 ObDereferenceObject를 호출하고 참조 카운터를 0에서 1로 변경하면 이미 해제된 개체의 참조 카운터가 증가합니다. 다른 사람의 메모리 할당이 손상될 수 있으므로 항상 올바르지 않습니다.

시스템 종료 블록 또는 지연

Windows 7부터 드라이버 검증 도구는 시스템 종료가 시작된 후 20분 후에 완료되지 않으면 커널 디버거에 중단을 적용합니다. 드라이버 검증 도구는 Windows 커널이 레지스트리, 플러그 앤 플레이 또는 I/O 관리자 하위 시스템과 같은 다양한 하위 시스템을 종료하기 시작하는 시간으로 시스템 종료 시작을 할당합니다.

커널 디버거가 시스템에 연결되지 않은 경우 드라이버 검증 도구는 이 중단점 대신 매개 변수 1 값 이 0x115 DRIVER_VERIFIER_DETECTED_VIOLATION 버그 검사 0xC4 발급합니다.

종종 20분 이내에 완료할 수 없는 시스템 종료는 해당 시스템에서 실행되는 드라이버 중 하나가 오작동하고 있음을 나타냅니다. 커널 디버거에서 !analyze -v 를 실행하면 종료를 담당하는 시스템 작업자 스레드의 스택 추적이 표시됩니다. 해당 스택 추적을 검사하고 테스트 중인 드라이버 중 하나에 의해 종료 스레드가 차단되는지 확인해야 합니다.

모든 드라이버가 올바르게 작동하더라도 시스템이 과도한 스트레스 테스트의 대상이 되므로 시스템을 종료할 수 없는 경우가 있습니다. 사용자는 이 드라이버 검증 도구 중단점 이후에 실행을 계속하도록 선택하고 시스템이 결국 종료되는지 여부를 검사 수 있습니다.