NTSTATUS 값 사용

참고

해당 Win32 오류 코드에 대한 NTSTATUS 값 매핑 테이블을 찾고 있는 경우 NTSTATUS에서 Win32 오류 코드 매핑을 참조하세요.

많은 커널 모드 표준 드라이버 루틴 및 드라이버 지원 루틴은 반환 값에 NTSTATUS 형식을 사용합니다. 또한 드라이버는 IRP를 완료할 때 IRP의 IO_STATUS_BLOCK 구조에 NTSTATUS 형식 값을 제공합니다. NTSTATUS 형식은 Ntdef.h에 정의되고 시스템 제공 상태 코드는 Ntstatus.h에 정의됩니다. (공급업체는 프라이빗 상태 코드를 정의할 수도 있지만 거의 필요하지 않습니다. 자세한 내용은 새 NTSTATUS 값 정의를 참조하세요.)

NTSTATUS 값은 성공 값, 정보 값, 경고 및 오류 값의 네 가지 유형으로 나뉩니다.

각 형식에 수많은 값이 할당됩니다. 루틴에서 성공적인 반환을 테스트할 때 일반적인 실수는 루틴의 반환 값을 STATUS_SUCCESS 비교하는 것입니다. 이 비교는 몇 가지 성공 값 중 하나만 확인합니다.

반환 값을 테스트할 때 다음 시스템 제공 매크로(Ntdef.h에 정의됨) 중 하나를 사용해야 합니다.

NT_SUCCESS(상태)
Status에 지정된 반환 값이 성공 유형(0 ~ 0x3FFFFFFF) 또는 정보 유형(0x40000000 - 0x7FFFFFFF)이면 TRUE로 평가됩니다.

NT_INFORMATION(상태)
Status에 지정된 반환 값이 정보 형식(0x40000000 - 0x7FFFFFFF)이면 TRUE로 평가됩니다.

NT_WARNING(상태)
Status에 지정된 반환 값이 경고 유형(0x80000000 - 0xBFFFFFFF)이면 TRUE로 평가됩니다.

NT_ERROR(상태)
Status에 지정된 반환 값이 오류 유형(0xC0000000 - 0xFFFFFFFF)이면 TRUE로 평가됩니다.

예를 들어 드라이버가 IoRegisterDeviceInterface 를 호출하여 디바이스 인터페이스를 등록한다고 가정합니다. 드라이버가 NT_SUCCESS 매크로를 사용하여 반환 값을 확인하는 경우 루틴이 오류를 나타내지 않는 STATUS_SUCCESS 반환하거나 디바이스 인터페이스가 이미 등록되어 있음을 나타내는 정보 상태 STATUS_OBJECT_NAME_EXISTS 반환하는 경우 매크로는 TRUE 로 평가됩니다.

또 다른 예로, 드라이버가 ZwEnumerateKey 를 호출하여 지정된 레지스트리 키의 하위 키를 열거한다고 가정합니다. NT_SUCCESS 매크로가 FALSE로 평가되는 경우 루틴이 STATUS_INVALID_PARAMETER 반환되었거나, 이는 오류 코드이거나, 루틴이 STATUS_NO_MORE_ENTRIES 반환했기 때문일 수 있습니다. 이는 경고 코드입니다.

마지막 예로, 드라이버가 하위 수준 드라이버가 디바이스에서 정보를 읽도록 하는 IRP를 전송한다고 가정합니다. 요청 드라이버가 정보를 수신하기에는 너무 작은 버퍼를 지정하는 경우 하위 수준 드라이버는 오류 코드인 STATUS_BUFFER_TOO_SMALL 반환하여 응답할 수 있습니다. 첫 번째 드라이버가 요청된 정보의 일부만 수신할 수 있는 버퍼를 지정하는 경우 하위 수준 드라이버는 가능한 한 많은 데이터를 제공한 다음 경고 코드인 STATUS_BUFFER_OVERFLOW 반환하여 응답할 수 있습니다. 첫 번째 드라이버가 NT_SUCCESS 사용하여 상태 값을 테스트하거나 잘못 NT_ERROR 경우 수신된 일부 정보를 실수로 삭제할 수 있습니다.