1. 程式人生 > >為什麼要用NT_SUCCESS()巨集測試返回的NTSTATUS值

為什麼要用NT_SUCCESS()巨集測試返回的NTSTATUS值

在Windows驅動程式的編寫中,當我們呼叫一個返回NTSTATUS值的函式時(比如IoCreateDevice),應當檢查返回值是否成功。

有人經常這樣寫

但是,這並不總是合理的。

在ddk標頭檔案”ntdef.h“中,NTSTATUS是這樣定義的:

可見,NTSTATUS是一個有符號 的長整數。並且分為四個域。最高2位Sev域,描述的是這個NTSTATUS的嚴重性(Severity):

00 成功(Success)

01 資訊(Informational)

10 警告(Warning)

11 錯誤(Error)

00和01應該都表示成功的狀態,10和11都表示錯誤狀態。即對於這樣的有符號長整數的最高位(也就是符號位) ,0成功,1錯誤。那麼,如果NTSTATUS>=0為成功,NTSTATUS<0為錯誤。

因此,在標頭檔案”ntdef.h“中,測試NTSTATUS成功的巨集定義為:

而不是我以前想象的測試status == 0(STATUS_SUCCESS = 0)

參考我在StackOverflow上發的問題,感謝解答問題的老外^_^