现在的位置: 首页 > 综合 > 正文

为什么要用NT_SUCCESS()宏测试返回的NTSTATUS值

2013年09月15日 ⁄ 综合 ⁄ 共 1160字 ⁄ 字号 评论关闭

在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上发的问题,感谢解答问题的老外^_^

http://stackoverflow.com/questions/3378622/how-to-understand-the-ntstatus-nt-success-typedef-in-windows-ddk/3378675

抱歉!评论已关闭.