DDK大部分函数的返回值类型是NTSTATUS类型。查看DDK.h文件,可以看到
typedef LONG NTSTATUS;
NTSTATUS的定义和LONG等价。为了函数的形式统一,所有函数的返回值都是NTSTATUS类型。NTSTATUS就是一个32位的整数,其每位有着不同的含义,如下图:
在执行完内核函数后,应该查看该函数的返回状态。如果状态码高位为0,无论其他位置是否设置,该状态代码代表成功。绝对不能用状态码与0比较来判断操作是否成功,而应该用NT_SUCCESS宏,其用法如下:
status = FOO(...)
IF(NT_SUCCESS(status))
{
// 该函数执行成功
}
DDK定义了大量的状态的返回值,都是形如STATUS_XX定义的宏,如表1所示:
表1常用NTSTATUS状态返回值 | |
分类 | 描述 |
NTSTATUS_SUCCESS | 函数执行成功 |
NTSTATUS_UNSUCCESSFUL | 函数执行不成功 |
NTSTATUS_NOT_IMPLEMENTED | 函数未被实现 |
NTSTATUS_INVALID_INFO_CLASS | 输入参数是无效的类别 |
NTSTATUS_INFO_LENGTH_MISMATCH | 输入参数长度不匹配 |
NTSTATUS_ACCESS_VIOLATION | 不允许访问 |
NTSTATUS_IN_PAGE_ERROR | 发生页故障 |
NTSTATUS_INVALID_HANDLE | 输入是无效的句柄 |
NTSTATUS_INVALID_PARAMETER | 输入是无效的参数 |
NTSTATUS_NO_SUCH_DEVICE | 指定的设备不存在 |
NTSTATUS_NO_SUCH_FILE | 指定的文件不存在 |
NTSTATUS_INVALID_DEVICE_REQUEST | 无效的设备请求 |
NTSTATUS_END_OF_FILE | 文件已到结尾 |
NTSTATUS_INVALID_SYSTEM_SERVICE | 无效的系统调用 |
NTSTATUS_ACCESS_DENIED | 访问被拒绝 |
NTSTATUS_BUFFER_TOO_SMALL | 输入的缓冲区过小 |
NTSTATUS_OBJECT_TYPE_MISMATCH | 输入的对象类型不匹配 |
NTSTATUS_OBJECT_NAME_INVALID | 输入的对象名无效 |
NTSTATUS_OBJECT_NAME_NOT_FOUND | 输入的对象没有找到 |
NTSTATUS_PORT_DISCONNECTED | 需要链接的端口没有被连接 |
NTSTATUS_OBJECT_PATH_INVALID | 输入的对象路径无效 |