使用 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 (状态)
如果 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,该 IRP 导致较低级别的驱动程序从设备读取信息。 如果请求驱动程序指定的缓冲区太小而无法接收任何信息,则较低级别的驱动程序可能会通过返回STATUS_BUFFER_TOO_SMALL(错误代码)做出响应。 如果第一个驱动程序指定的缓冲区可以接收部分(但不是全部)请求的信息,则较低级别的驱动程序可能会通过以下方式做出响应:提供尽可能多的数据,然后返回STATUS_BUFFER_OVERFLOW,这是一个警告代码。 请注意,如果第一个驱动程序使用 NT_SUCCESS 测试状态值或错误NT_ERROR,它可能会无意中删除收到的一些信息。