使用 NTSTATUS 值

备注

如果要查找 NTSTATUS 值映射到相应的 Win32 错误代码的表,请参阅 NTSTATUS 到 Win32 错误代码映射

许多内核模式 标准驱动程序例程 和驱动程序支持例程使用 NTSTATUS 类型返回值。 此外,驱动程序在完成 IRP 时,在 IRP 的IO_STATUS_BLOCK结构中提供 NTSTATUS 类型的值。 NTSTATUS 类型在 Ntdef.h 中定义,系统提供的状态代码在 Ntstatus.h 中定义。 (供应商还可以定义专用状态代码,尽管它们很少需要。有关详细信息,请参阅 定义新的 NTSTATUS Values.)

NTSTATUS 值分为四种类型:成功值、信息值、警告和错误值。

为每个类型分配大量值。 测试从例程成功返回时,常见的错误是将例程的返回值与STATUS_SUCCESS进行比较。 此比较仅检查多个成功值之一。

测试返回值时,应使用以下系统提供的宏之一 (在 Ntdef.h 中定义) :

NT_SUCCESS (状态)
如果状态指定的返回值是成功类型 (0 — 0x3FFFFFFF) 或信息类型 (0x40000000 0x7FFFFFFF) ,则计算结果为 TRUE

NT_INFORMATION (状态)
如果状态指定的返回值是信息类型 (0x40000000 0x7FFFFFFF) ,则计算结果为 TRUE

NT_WARNING (状态)
如果 Status 指定的返回值是警告类型 (0x80000000 0xBFFFFFFF) ,则计算结果为 TRUE

NT_ERROR (状态)
如果状态指定的返回值是错误类型 (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错误地测试状态值,则可能无意中删除收到的某些信息。