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

最新文章

  1. 简单了解.net
  2. Hash中的一些概率计算
  3. angularJS学习1
  4. OLAP、OLTP的介绍和比较 via csdn
  5. 如何给windows窗体程序打包成一个安装包
  6. iOS集成支付宝
  7. Oracle 11g+oracle客户端(32位)+PL/SQL develepment的安装配置
  8. dotTrace 学习笔记
  9. 计算机学院大学生程序设计竞赛(2015’12) 1004 Happy Value
  10. HDU 5621 KK&#39;s Point
  11. JavaScript一些常用方法一
  12. Python机器学习笔记 K-近邻算法
  13. hibernate框架学习之数据类型
  14. fatal: refusing to merge unrelated histories
  15. 个人技术博客(a)
  16. Jquery 的ajax里边不能识别$(this)
  17. Tomcat数据源配置方法总结
  18. Java NIO系列教程(三) Buffer
  19. 局域网内web地图的简单实现
  20. HTTP相关知识点

热门文章

  1. jmeter_图形监控
  2. idea多级目录不展开的问题
  3. .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  4. java之struts2的action优化配置
  5. CORS讲解
  6. glfw内存泄露测试
  7. 【洛谷 P1659】 [国家集训队]拉拉队排练(manacher)
  8. iOS - 静态库的导入和头文件路径的设置
  9. 【转载】C#中List集合使用Reverse方法对集合中的元素进行倒序反转
  10. 一张图弄懂js原型和原型链