使用NT_SUCCESS()巨集判斷驅動返回NTSTATUS值的原因
阿新 • • 發佈:2019-01-25
根據大佬的部落格,首先
// // 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時候成功