zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    LeetCode_35.搜索插入位置
    LeetCode_349.两个数组的交集
    LeetCode_344.反转字符串
    LeetCode_34.在排序数组中查找元素的第一个和最后一个位置
    LeetCode_303.区域和检索
    LeetCode_3.无重复字符的最长子串
    LeetCode_292.Nim 游戏
    LeetCode_283.移动零
    LeetCode_27.移除元素
    LeetCode_268.丢失的数字
  • 原文地址:https://www.cnblogs.com/yilang/p/11163521.html
Copyright © 2011-2022 走看看