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

NTSTATUS的更多相关文章

  1. NTSTATUS Values

    By combining the NTSTATUS into a single 32-bit numbering space, the following NTSTATUS values are de ...

  2. LDR: LdrpWalkImportDescriptor() failed to probe C:\WINDOWS\system32\opencv_core243d.dll for its manifest, ntstatus 0xc0150002

    LDR: LdrpWalkImportDescriptor() failed to probe C:\WINDOWS\system32\opencv_core243d.dll for its mani ...

  3. Win32 Error Code COM Error Code NTSTATUS的区别、转换

    这三种码其实都是Windows系统错误码,只是对应不同API和使用场景.它们既有区别,又相互有联系. 一.区别和联系 都是32位值 Win32 Error Code和NTSTATUS位域组成相同,但W ...

  4. NTSTATUS code 和 Windows 系统错误码 的对应关系

    出处:https://github.com/dokan-dev/dokany/blob/master/dokan/ntstatus.i case EPT_S_CANT_CREATE: return E ...

  5. NTSTATUS代码摘录

    00000000 STATUS_SUCCESS00000000 STATUS_WAIT_000000001 STATUS_WAIT_100000002 STATUS_WAIT_200000003 ST ...

  6. API Monitor简介(API监控工具)

    API Monitor是一个免费软件,可以让你监视和控制应用程序和服务,取得了API调用. 它是一个强大的工具,看到的应用程序和服务是如何工作的,或跟踪,你在自己的应用程序的问题. 64位支持 API ...

  7. 通过FileHandle获取FileObject对象

    <div id="wrap"> <!-- google_ad_section_start --> NTSTATUS MyNtReadFile(<br& ...

  8. 使用ZwMapViewOfSection创建内存映射文件总结

    标 题: [原创]使用ZwMapViewOfSection创建内存映射文件总结 作 者: 小覃 时 间: 2012-06-15,02:28:36 链 接: http://bbs.pediy.com/s ...

  9. 【原创】内核ShellCode注入的一种方法

    标 题: [原创]内核ShellCode注入的一种方法 作 者: organic 时 间: 2013-05-04,04:34:08 链 接: http://bbs.pediy.com/showthre ...

随机推荐

  1. 中国大学MOOC-翁恺-C语言程序设计习题集(一)

    练习 02-0. 整数四则运算(10) 本题要求编写程序,计算2个正整数的和.差.积.商并输出.题目保证输入和输出全部在整型范围内. 输入格式: 输入在一行中给出2个正整数A和B. 输出格式: 在4行 ...

  2. SpringCloudConfig相关配置简介、使用、整合Eureka

    目的: 1.SpringCloud Config简介 2.Config Server基本使用 3.Config Client基本使用 4.Config整合Eureka 5.Config配置搜索路径 S ...

  3. golang --iota 用法

    package main import "fmt" func main() { const ( a = iota //0 b //1 c //2 d = "ha" ...

  4. Spark 系列(十二)—— Spark SQL JOIN 操作

    一. 数据准备 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据.分别创建员工和部门的 Datafame,并注册为临时视图,代码如下: val spark = SparkSessio ...

  5. Winform 使用热键功能实现Ctrl+C和Ctrl+V复制粘贴功能

    当我们使用winform控件的时候,会发现这些控件(比如Label)不支持Ctrl+c 复制和Ctrl+v 快捷键复制粘贴功能,如果我们需要实现这个功能改怎么做呢? 1. 首先我们创建一个winfor ...

  6. Windows10如何卸载OneDrive

    Windows10如何卸载OneDrive 来源 https://zhuanlan.zhihu.com/p/23985905 1) 禁止onedrive自启动简单的就是在任务管理器的启动中禁用oned ...

  7. TweenMax—ScrambleText插件 实现类似电脑破译密码的特效

    首先贴一下TweenMax的中文网:https://www.tweenmax.com.cn/ 首先先展示一下最后的效果,需要的就继续看下去: 那团乱码是会一直变的 那么如何实现上图的效果呢??? 其实 ...

  8. Java 之 web服务器—Tomcat

    一.服务器 1.服务器 服务器:安装了服务器软件的计算机 2.服务器软件 服务器软件:接收用户的请求,处理请求,做出响应 3.Web 服务器软件 web 服务器软件:接收用户的请求,处理请求,做出响应 ...

  9. Nginx的proxy buffer参数总结

    1. proxy_buffering 语法:proxy_buffering on|off 默认值:proxy_buffering on 上下文:http,server,location 作用:该指令开 ...

  10. HashMap的put()与扩容

    1. put() final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { HashMap.Nod ...