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
NTSTATUS的更多相关文章
- NTSTATUS Values
By combining the NTSTATUS into a single 32-bit numbering space, the following NTSTATUS values are de ...
- 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 ...
- Win32 Error Code COM Error Code NTSTATUS的区别、转换
这三种码其实都是Windows系统错误码,只是对应不同API和使用场景.它们既有区别,又相互有联系. 一.区别和联系 都是32位值 Win32 Error Code和NTSTATUS位域组成相同,但W ...
- NTSTATUS code 和 Windows 系统错误码 的对应关系
出处:https://github.com/dokan-dev/dokany/blob/master/dokan/ntstatus.i case EPT_S_CANT_CREATE: return E ...
- NTSTATUS代码摘录
00000000 STATUS_SUCCESS00000000 STATUS_WAIT_000000001 STATUS_WAIT_100000002 STATUS_WAIT_200000003 ST ...
- API Monitor简介(API监控工具)
API Monitor是一个免费软件,可以让你监视和控制应用程序和服务,取得了API调用. 它是一个强大的工具,看到的应用程序和服务是如何工作的,或跟踪,你在自己的应用程序的问题. 64位支持 API ...
- 通过FileHandle获取FileObject对象
<div id="wrap"> <!-- google_ad_section_start --> NTSTATUS MyNtReadFile(<br& ...
- 使用ZwMapViewOfSection创建内存映射文件总结
标 题: [原创]使用ZwMapViewOfSection创建内存映射文件总结 作 者: 小覃 时 间: 2012-06-15,02:28:36 链 接: http://bbs.pediy.com/s ...
- 【原创】内核ShellCode注入的一种方法
标 题: [原创]内核ShellCode注入的一种方法 作 者: organic 时 间: 2013-05-04,04:34:08 链 接: http://bbs.pediy.com/showthre ...
随机推荐
- 手把手带你写一个minishell
先解释一下Shell : Shell是一个功能为命令行解释器的应用程序,连接了用户和Linux内核,让我们能高效和安全地使用Linux内核. 要写一个minishell,我们要先理解它的过程: 读取输 ...
- FIFO形成3x3矩阵
Verilog生成矩阵一般是使用shift_ip核,但其实用两个FIFO也行.最近刚好学到这种方法,把原理总结一下. 要求 现在有10x5的数据和对应数据有效指示信号,数据为0~49,要用FPGA对其 ...
- C#特性的学习(一)
1.预定定义特性之一:AttributeUsage AttributeUsage有三个属性: 第一个属性:ValidOn 规定特性可被放置的语言元素,默认是AttributeTargets.All.
- Spring Boot + RabbitMQ 配置参数解释
最近生产RabbitMQ出了几次问题,所以抽时间整理了一份关于Spring Boot 整合RabbitMQ环境下的配置参数解释,通过官网文档和网上其他朋友一些文章参考归纳整理而得,有错误之处还请指正~ ...
- Java 日期时间与unix时间戳之间转换
日期时间 <--> 时间戳 java.time 包提供的新的日期和时间API LocalDateTime: 本地日期时间类 ZoneId: 时区类 ZonedDateTime: 带时区 ...
- 【转载】C#中可使用string.Empty代表空字符
在C#中,如果赋值一个字符串为空白字符串,我们一般会用“”的形式对字符串进行赋值操作,其实在C#的字符串类String类中,有个专门的常量string.Empty来代表空字符串,可直接在赋值的时候使用 ...
- python 解析命令行选项
问题: 程序如何能够解析命令行选项 解决方案 argparse 模块可被用来解析命令行选项 argparse 模块 argparse 模块是标准库中最大的模块之一,拥有大量的配置选项 dest 参数指 ...
- 过滤器实现Token验证(登录验证+过期验证)---简单的实现
功能:登录验证+过期验证+注销清除cookie+未注销下关闭或刷新浏览器仍可直接访问action概述:token只存在客户端cookie,后端AES加密+解密+验证,每一次成功访问action都会刷新 ...
- Random Forest(sklearn参数详解)
2016年08月17日 10:32:42 铭霏 阅读数:36874 版权声明:本文为博主原创文章,博主转载请附加原文链接并声明. https://blog.csdn.net/u012102306/ ...
- nginx 配置文件详解(转)
#运行用户 #user nobody; #启动进程,通常设置成和cpu的数量相等或者2倍于cpu的个数(具体结合cpu和内存).默认为1 worker_processes 1; #全局的错误日志和日志 ...