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

在Windows驱动程序的编写中,当我们调用一个返回NTSTATUS值的函数时(比如IoCreateDevice),应当检查返回值是否成功。

有人经常这样写

ntStatus = function(...); if(STATUS_SUCCESS == ntStatus) ...

但是,这并不总是合理的。

 

在ddk头文件”ntdef.h“中,NTSTATUS是这样定义的:

typedef __success(return >= 0) LONG NTSTATUS; // // Status values are 32 bit values layed 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 // 

可见,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成功的宏定义为:

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

而不是我以前想象的测试status == 0(STATUS_SUCCESS = 0)

 

参考我在StackOverflow上发的问题,感谢解答问题的老外^_^

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

你可能感兴趣的:(Windows驱动,测试,ddk,function,windows,c)