I/O 확인

드라이버 검증 도구에는 두 가지 수준의 I/O 확인이 있습니다.

  • I/O 확인을 선택할 때마다 수준 1 I/O 확인이 항상 활성화됩니다.

  • 수준 2 I/O 확인 은 Windows XP 이상에서 I/O 확인을 선택할 때마다 항상 활성화됩니다.

또한 Windows 7 이상 버전의 Windows 운영 체제에서 향상된 I/O 확인을 참조하세요. I/O 확인을 선택하면 향상된 I/O 확인이 자동으로 활성화됩니다. 별도의 옵션으로 선택할 수 없거나 선택할 필요가 없습니다.

수준 1 I/O 확인

수준 1 I/O 확인을 사용하도록 설정하면 IoAllocateIrp 를 통해 얻은 모든 IRP가 특수 풀에서 할당되고 해당 사용이 추적됩니다.

또한 드라이버 검증 도구는 다음을 포함하여 잘못된 I/O 호출을 확인합니다.

  • 형식이 IO_TYPE_IRP 않은 IRP를 해제하려고 시도합니다.

  • 잘못된 디바이스 개체를 IoCallDriver에 전달합니다.

  • 잘못된 상태 포함하거나 여전히 취소 루틴 집합이 있는 IRP를 IoCompleteRequest에 전달합니다.

  • 드라이버 디스패치 루틴에 대한 호출에서 IRQL 변경

  • 스레드와 연결된 상태로 유지되는 IRP를 해제하려고 시도합니다.

  • 초기화된 타이머가 이미 포함된 IoInitializeTimer 에 디바이스 개체를 전달합니다.

  • 잘못된 버퍼를 IoBuildAsynchronousFsdRequest 또는 IoBuildDeviceIoControlRequest에 전달합니다.

  • I/O 상태 블록을 IRP에 전달합니다. 이 I/O 상태 블록이 너무 멀리 풀지 않은 스택에 할당됩니다.

  • 이 이벤트 개체가 너무 멀리 해제된 스택에 할당된 경우 이벤트 개체를 IRP에 전달합니다.

특수 IRP 풀의 크기가 제한되어 있기 때문에 I/O 확인은 한 번에 하나의 드라이버에서만 사용될 때 가장 효과적입니다.

I/O 확인 수준 1 오류로 인해 버그 검사 0xC9 발생합니다. 이 버그 검사 첫 번째 매개 변수는 발생한 위반을 나타냅니다. 전체 매개 변수 목록은 버그 검사 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION)을 참조하세요.

수준 2 I/O 확인

I/O 확인 수준 2 오류는 파란색 화면, 크래시 덤프 파일 및 커널 디버거와 같은 다양한 방식으로 표시됩니다.

파란색 화면에서 이러한 오류는 메시지 IO 시스템 확인 오류문자열 WDM DRIVER ERRORXXX로 표시됩니다. 여기서 XXX 는 I/O 오류 코드입니다.

크래시 덤프 파일에서 이러한 오류의 대부분은 I/O 오류 코드와 함께 BugCheck 0xC9(DRIVER_VERIFIER_IOMANAGER_VIOLATION) 메시지로 표시됩니다. 이 경우 I/O 오류 코드가 버그 검사 0xC9 첫 번째 매개 변수로 표시됩니다. 나머지는 드라이버 검증 도구 오류 코드와 함께 버그 검사 0xC4(DRIVER_VERIFIER_DETECTED_VIOLATION) 메시지로 표시됩니다. 이 경우 드라이버 검증 도구 오류 코드는 버그 검사 0xC4 첫 번째 매개 변수로 나타납니다.

커널 디버거(KD 또는 WinDbg)에서 이러한 오류는 WDM DRIVER ERROR 메시지와 설명 텍스트 문자열로 표시됩니다. 커널 디버거가 활성 상태이면 수준 2 오류를 무시하고 시스템 작업을 다시 시작할 수 있습니다. (다른 버그 검사에서는 불가능합니다.)

파란색 화면, 크래시 덤프 파일 및 커널 디버거는 각각 추가 정보도 표시합니다. 대부분의 I/O 확인 수준 2 오류 메시지에 대한 전체 설명은 버그 검사 0xC9 참조하세요. 나머지는 버그 검사 0xC4 참조하세요.

Window Vista부터 I/O 확인 옵션은 다음 드라이버 오류를 확인합니다.

  • 사용자 모드 애플리케이션에서 시작된 IRP를 완료하고 취소하는 데 너무 오래 걸립니다.

  • 아직 획득되지 않은 제거 잠금 해제

  • 해당 IoAcquireRemoveLock 호출에 사용되는 태그 매개 변수와 다른 태그 매개 변수를 사용하여 IoReleaseRemoveLock 또는 IoReleaseRemoveLockAndWait를 호출합니다.

  • 인터럽트 사용 안 함으로 IoCallDriver 를 호출합니다.

  • DISPATCH_LEVEL보다 큰 IRQL에서 IoCallDriver 를 호출합니다.

  • 인터럽트 사용 안 함으로 드라이버 디스패치 루틴에서 반환합니다.

  • 변경된 IRQL을 사용하여 드라이버 디스패치 루틴에서 반환합니다.

  • APC를 사용하지 않도록 설정된 드라이버 디스패치 루틴에서 반환합니다. 이 경우 드라이버는 KeLeaveCriticalRegion보다 KeEnterCriticalRegion을 더 많이 호출했을 수 있습니다. 이는 버그 검사 0x20(KERNEL_APC_PENDING_DURING_EXIT) 및 버그 검사 0x1(APC_INDEX_MISMATCH)의 주요 원인입니다.

Windows 7부터 I/O 확인 옵션은 다음 드라이버 오류를 확인합니다.

  • ExFreePool을 호출하여 IRP를 해제하려고 시도합니다. IRP는 IoFreeIrp을 사용하여 해제해야 합니다.

또한 이 옵션을 사용하여 잠금 제거를 다시 초기화하는 또 다른 일반적인 드라이버 버그를 검색할 수 있습니다. 잠금 제거 데이터 구조는 디바이스 확장 내에서 할당되어야 합니다. 이렇게 하면 I/O 관리자가 디바이스 개체가 삭제될 때만 IO_REMOVE_LOCK 구조를 보유하는 메모리를 해제합니다. 드라이버가 다음 세 단계를 수행하는 경우 2단계 이후에도 애플리케이션 또는 드라이버가 Device1에 대한 참조를 보유할 수 있습니다.

  • Device1에 해당하는 IO_REMOVE_LOCK 구조를 할당하지만 Device1 확장 외부에서 할당을 수행합니다.
  • Device1이 제거될 때 IoReleaseRemoveLockAndWait 을 호출합니다.
  • 동일한 잠금에 대해 IoInitializeRemoveLock 을 호출하여 Device2에 대한 제거 잠금으로 다시 사용합니다.

2단계 후에도 애플리케이션 또는 드라이버가 Device1에 대한 참조를 계속 보유할 수 있습니다. 이 디바이스가 제거되었더라도 애플리케이션 또는 드라이버는 Device1에 요청을 보낼 수 있습니다. 따라서 I/O 관리자가 Device1을 삭제할 때까지 새 제거 잠금과 동일한 메모리를 다시 사용하는 것은 안전하지 않습니다. 다른 스레드가 잠금을 획득하려고 하는 동안 동일한 잠금을 다시 초기화하면 잠금이 손상될 수 있으며 드라이버와 전체 시스템에 대해 예측할 수 없는 결과가 발생할 수 있습니다.

Windows 7 이상 버전의 Windows 운영 체제에서 I /O 확인을 선택하면 향상된 I/O 확인 이 자동으로 활성화됩니다.

이 옵션 활성화

드라이버 검증 도구 관리자 또는 Verifier.exe 명령줄을 사용하여 하나 이상의 드라이버에 대한 I/O 확인 기능을 활성화할 수 있습니다. 자세한 내용은 드라이버 검증 도구 옵션 선택을 참조하세요.

  • 명령줄에 있습니다.

    명령줄에서 I/O 확인 옵션은 비트 4(0x10)로 표시됩니다. I/O 확인을 활성화하려면 플래그 값 0x10 사용하거나 플래그 값에 0x10 추가합니다. 예:

    verifier /flags 0x10 /driver MyDriver.sys
    

    이 기능은 다음 부팅 후에 활성화됩니다.

    명령에 /volatile 매개 변수를 추가하여 컴퓨터를 다시 부팅하지 않고 I/O 확인을 활성화하고 비활성화할 수도 있습니다. 예:

    verifier /volatile /flags 0x10 /adddriver MyDriver.sys
    

    이 설정은 즉시 적용되지만 컴퓨터를 종료하거나 다시 부팅하면 손실됩니다. 자세한 내용은 휘발성 설정 사용을 참조하세요.

    I/O 확인 기능은 표준 설정에도 포함됩니다. 예:

    verifier /standard /driver MyDriver.sys
    
  • 드라이버 검증 도구 관리자 사용

    1. 사용자 지정 설정 만들기(코드 개발자용)를 선택한 다음, 다음을 클릭합니다.
    2. 전체 목록에서 개별 설정 선택을 선택합니다.
    3. (검사) I/O 확인을 선택합니다.

    I/O 확인 기능은 표준 설정에도 포함됩니다. 이 기능을 사용하려면 드라이버 검증 도구 관리자에서 표준 설정 만들기를 클릭합니다.