上QQ阅读APP看书,第一时间看更新
3.4 函数和错误代码
多数内核API函数会返回一个状态,用来指示操作成功或者失败。这个状态被定义为类型NTSTATUS
,它是一个32位的整数。值STATUS_SUCCESS
(0)表示成功。负数值则表示某种错误。在文件ntstatus.h中可以找到所有定义的NTSTATUS
值。
多数代码并不关心确切的错误值,因此它们只要测试最高位就行。这能用NT_SUCCESS
宏来完成。下面就是一个测试是否失败并在失败时记录错误值的例子:
在某些情况下,从函数返回的NTSTATUS
值最终会返回到用户模式。这时候STATUS_xxx值会被转换成ERROR_yyy值,在用户模式中可以通过GetLastError
函数得到这些值。注意转换前后的值是不一样的。首先,用户模式的错误值是正的。其次,值的对应关系并不是一对一的。不过无论如何,这些都不是内核驱动程序应该关心的。
系统内部的内核驱动程序里的函数基本上也都会返回NTSTATUS
来表明它们的成功/失败状态。这通常是一个便捷的方法。这是因为这些函数会调用内核API,所以能够通过简单地返回从某个特定的API返回的状态来传递任何可能的错误。这也隐含了驱动程序函数“真正的”返回值通常是指针或者引用形式的参数。