一、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