NTSTATUS
一、NTSTATUS
直译就是NT状态,也就是内核状态。主要是内核开发/驱动开发用到的API返回的状态。许多内核模式的标准驱动程序例程和驱动程序支持例程使用ntstatus类型作为返回值。此外,当完成IRP时,驱动程序在IRP的IO状态块结构中提供一个ntstatus类型的值。 ntstatus值分为四种类型:成功值、信息值、警告和错误值.
二、NTSTATUS Code
同样是一个32bit的值,大多数的值也是定义了默认的错误消息。它的构成如下:

Sev (2 bits): 严重性.
- 
Value
Meaning
STATUS_SEVERITY_SUCCESS
0x0
Success
STATUS_SEVERITY_INFORMATIONAL
0x1
Informational
STATUS_SEVERITY_WARNING
0x2
Warning
STATUS_SEVERITY_ERROR
0x3
Error
 
C (1 bit): 1为客户定义的
N (1 bit): 必须设置为0,以便可以将ntstatus值映射到等效的hresult值
Facility (12 bits): 来源设备
| 
 Name  | 
 Value  | 
|---|---|
| 
 FACILITY_DEBUGGER  | 
 0x001  | 
| 
 FACILITY_RPC_RUNTIME  | 
 0x002  | 
| 
 FACILITY_RPC_STUBS  | 
 0x003  | 
| 
 FACILITY_IO_ERROR_CODE  | 
 0x004  | 
| 
 FACILITY_NTWIN32  | 
 0x007  | 
| 
 FACILITY_NTSSPI  | 
 0x009  | 
| 
 FACILITY_TERMINAL_SERVER  | 
 0x00A  | 
| 
 FACILTIY_MUI_ERROR_CODE  | 
 0x00B  | 
| 
 FACILITY_USB_ERROR_CODE  | 
 0x010  | 
| 
 FACILITY_HID_ERROR_CODE  | 
 0x011  | 
| 
 FACILITY_FIREWIRE_ERROR_CODE  | 
 0x012  | 
| 
 FACILITY_CLUSTER_ERROR_CODE  | 
 0x013  | 
| 
 FACILITY_ACPI_ERROR_CODE  | 
 0x014  | 
| 
 FACILITY_SXS_ERROR_CODE  | 
 0x015  | 
| 
 FACILITY_TRANSACTION  | 
 0x019  | 
| 
 FACILITY_COMMONLOG  | 
 0x01A  | 
| 
 FACILITY_VIDEO  | 
 0x01B  | 
| 
 FACILITY_FILTER_MANAGER  | 
 0x01C  | 
| 
 FACILITY_MONITOR  | 
 0x01D  | 
| 
 FACILITY_GRAPHICS_KERNEL  | 
 0x01E  | 
| 
 FACILITY_DRIVER_FRAMEWORK  | 
 0x020  | 
| 
 FACILITY_FVE_ERROR_CODE  | 
 0x021  | 
| 
 FACILITY_FWP_ERROR_CODE  | 
 0x022  | 
| 
 FACILITY_NDIS_ERROR_CODE  | 
 0x023  | 
| 
 FACILITY_HYPERVISOR  | 
 0x035  | 
| 
 FACILITY_IPSEC  | 
 0x036  | 
| 
 FACILITY_MAXIMUM_VALUE  | 
 0x037  | 
Code (2 bytes): 状态码
三、NTSTATUS的使用
在ntdef.h文件里,NTSTATUS类型定义如下
/
// NTSTATUS
//
typedef _Return_type_success_(return >= 0) LONG NTSTATUS;
/*lint -save -e624 */  // Don't complain about different typedefs.
typedef NTSTATUS *PNTSTATUS;
/*lint -restore */  // Resume checking for different typedefs.
#if _WIN32_WINNT >= 0x0600
typedef CONST NTSTATUS *PCNTSTATUS;
#endif // _WIN32_WINNT >= 0x0600
从定义可以看到 NTSTATUS被定义为了LONG型,也就是把NTSTATUS当成一个4字节的有符号数来处理,这样一来就可以把NTSTATUS的最高位S当成符号位,0时是正数,1时是负数。
我们可以用下面的宏来检测判断是否成功
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
用下面的宏来判断是否是信息、警告或错误
#ifdef _PREFAST_
#define NT_INFORMATION(Status) (((NTSTATUS)(Status)) >= (long)0x40000000)
#else
#define NT_INFORMATION(Status) ((((ULONG)(Status)) >> 30) == 1)
#endif
#ifdef _PREFAST_
#define NT_WARNING(Status) (((NTSTATUS)(Status) < (long)0xc0000000))
#else
#define NT_WARNING(Status) ((((ULONG)(Status)) >> 30) == 2)
#endif
#ifdef _PREFAST_
#define NT_ERROR(Status) (((NTSTATUS)(Status)) >= (unsigned long)0xc0000000)
#else
#define NT_ERROR(Status) ((((ULONG)(Status)) >> 30) == 3)
#endif
                    
                
                
            
        
浙公网安备 33010602011771号