1. 程式人生 > >使用NT_SUCCESS()巨集判斷驅動返回NTSTATUS值的原因

使用NT_SUCCESS()巨集判斷驅動返回NTSTATUS值的原因

根據大佬的部落格,首先

//
//  Status values are 32 bit values laid out as follows:
//
//   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
//   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
//  +---+-+-------------------------+-------------------------------+
//  |Sev|C|       Facility          |               Code            |
//  +---+-+-------------------------+-------------------------------+
//
//  where
//
//      Sev - is the severity code
//
//          00 - Success
//          01 - Informational
//          10 - Warning
//          11 - Error
//
//      C - is the Customer code flag
//
//      Facility - is the facility code
//
//      Code - is the facility's status code
//

//
// Generic test for success on any status value (non-negative numbers
// indicate success).
//

#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)

//
// Generic test for information on any status value.
//

所以可見NTSTATUS是個有符號的長整數,在Sev域中,是安全碼,正的代表成功,負的代表失敗,所以00和01表示成功的狀態,10和11表示錯誤狀態。即對於這樣的有符號長整數的最高位(也就是符號位) ,0成功,1錯誤。,如果NTSTATUS>=0為成功,NTSTATUS<0為錯誤。所以定義

#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)

大於1時候成功