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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM