I/O 확인
드라이버 검증 도구에는 두 가지 수준의 I/O 확인이 있습니다.
수준 1 I/O 확인은 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 발생합니다. 이 버그 검사의 첫 번째 매개 변수는 발생한 위반을 나타냅니다. 전체 매개 변수 목록은 DRIVER_VERIFIER_IOMANAGER_VIOLATION(Bug Check 0xC9)를 참조하세요.
수준 2 I/O 확인
I/O 확인 수준 2 오류는 파란색 화면, 크래시 덤프 파일 및 커널 디버거와 같은 다양한 방식으로 표시됩니다.
파란색 화면에서 이러한 오류는 메시지 IO SYSTEM VERIFICATION ERROR 및 문자열 WDM DRIVER ERRORXXX로 표시됩니다. 여기서 XXX는 I/O 오류 코드입니다.
크래시 덤프 파일에서 이러한 오류의 대부분은 I/O 오류 코드와 함께 BugCheck 0xC9(DRIVER_VERIFIER_IOMANAGER_VIOLATION) 메시지로 기록됩니다. 이 경우 I/O 오류 코드가 버그 검사 0xC9 첫 번째 매개 변수로 나타납니다. 나머지는 드라이버 검증 도구 오류 코드와 함께 DRIVER_VERIFIER_DETECTED_VIOLATION(Bug Check 0xC4) 메시지로 표시됩니다. 이 경우 드라이버 검증 도구 오류 코드가 버그 검사 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 확인 옵션은 다음 드라이버 오류를 확인합니다.
또한 이 옵션을 사용하여 잠금 제거를 다시 초기화하는 또 다른 일반적인 드라이버 버그를 검색할 수 있습니다. 잠금 제거 데이터 구조는 디바이스 확장 내에서 할당되어야 합니다. 이렇게 하면 I/O 관리자가 디바이스 개체가 삭제될 때만 IO_REMOVE_LOCK 구조를 보유하는 메모리를 해제합니다. 드라이버가 다음 세 단계를 수행하는 경우 2단계 이후에도 애플리케이션 또는 드라이버가 Device1에 대한 참조를 보유할 수 있습니다.
- Device1에 해당하지만 Device1 확장 외부에서 할당을 수행하는 IO_REMOVE_LOCK 구조를 할당합니다.
- 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
이 설정은 즉시 유효하지만 컴퓨터를 종료하거나 다시 부팅하면 손실됩니다. 자세한 내용은 Volatile 설정 사용을 참조 하세요.
I/O 확인 기능도 표준 설정에 포함됩니다. 예시:
verifier /standard /driver MyDriver.sys
드라이버 검증 도구 관리자 사용
- 사용자 지정 설정 만들기(코드 개발자용)를 선택하고 다음을 클릭합니다.
- 전체 목록에서 개별 설정 선택을 선택합니다.
- I/O 확인을 선택합니다(확인).
I/O 확인 기능도 표준 설정에 포함됩니다. 이 기능을 사용하려면 드라이버 검증 도구 관리자에서 표준 설정 만들기를 클릭합니다.