使用 NTSTATUS 值
重要
如果要查找 NTSTATUS 值到相应 Win32 错误代码的映射表,请参阅 NTSTATUS 到 Win32 错误代码映射。
许多内核模式 标准驱动程序例程 和驱动程序支持例程使用 NTSTATUS 类型返回值。 此外,驱动程序在完成 IRP 时在 IRP 的IO_STATUS_BLOCK结构中提供 NTSTATUS 类型的值。 NTSTATUS 类型在 Ntdef.h 中定义,系统提供的状态代码在 Ntstatus.h 中定义。 (供应商也可以定义专用状态代码,尽管它们很少需要。有关详细信息,请参阅 定义新的 NTSTATUS 值。
NTSTATUS 值分为四种类型:成功值、信息值、警告和错误值。
将大量值分配给每种类型。 测试从例程成功返回时,常见的错误是将例程的返回值与STATUS_SUCCESS进行比较。 此比较仅检查多个成功值之一。
测试返回值时,应使用以下系统提供的宏之一(在 Ntdef.h 中定义):
宏 | 说明 |
---|---|
NT_SUCCESS(状态) | 如果状态指定的返回值为成功类型(0 ~ 0x3FFFFFFF)或信息类型(0x40000000 ~ 0x7FFFFFFF),则计算结果为 TRUE。 |
NT_INFORMATION(状态) | 如果状态指定的返回值是信息类型(0x40000000 • 0x7FFFFFFF),则计算结果为 TRUE。 |
NT_WARNING(状态) | 如果状态指定的返回值为警告类型(0x80000000 • 0xBFFFFFFF),则计算结果为 TRUE。 |
NT_ERROR(状态) | 如果状态指定的返回值是错误类型(0xC0000000 - 0xFFFFFFFF),则计算结果为 TRUE。 |
例如,假设驱动程序调用 IoRegisterDeviceInterface 来注册设备接口。 如果驱动程序使用 NT_SUCCESS 宏检查返回值,则宏的计算结果为 TRUE (如果例程返回STATUS_SUCCESS),这表示没有错误,或者如果它返回信息状态STATUS_OBJECT_NAME_EXISTS,则表示设备接口已注册。
例如,假设驱动程序调用 ZwEnumerateKey 来枚举指定注册表项的子项。 如果NT_SUCCESS宏的计算结果为 FALSE,则可能是因为例程返回STATUS_INVALID_PARAMETER(错误代码),或者因为例程返回STATUS_NO_MORE_ENTRIES,这是警告代码。
作为最后一个示例,假设驱动程序发送一个 IRP,该 IRP 导致较低级别的驱动程序从设备读取信息。 如果请求驱动程序指定缓冲区太小而无法接收任何信息,则较低级别的驱动程序可能会通过返回STATUS_BUFFER_TOO_SMALL(错误代码)做出响应。 如果第一个驱动程序指定一个缓冲区,该缓冲区可以接收所请求的一些(但不是全部)信息,则较低级别的驱动程序可以通过尽可能多的数据来响应,然后返回STATUS_BUFFER_OVERFLOW,这是一个警告代码。 如果第一个驱动程序使用NT_SUCCESS或NT_ERROR错误地测试状态值,则它可能会无意中删除收到的某些信息。