一、NTSTATUS介绍
NTSTATUS是Windows操作系统内核自身使用的一组状态码,它主要用于标示系统内部发生的各种错误和警告信息,以及判断一些操作的执行情况等。NTSTATUS由四个字节组成,每个字节表示一个不同的信息,包括消息等级、消息源、消息类型和消息代码。
NTSTATUS定义在winnt.h头文件中,定义格式为0x12345678,其中每个数字代表状态码不同的部分。Windows内核使用NTSTATUS值将错误和状态信息传递给应用程序和其他内核组件,华丽大气、上档次,因此NTSTATUS不仅仅是开发人员面对的问题,对系统管理员和维护工程师来说也是非常重要的。
二、NTSTATUS查询
在进行系统调试和日志分析时,NTSTATUS查询非常有用。Windows SDK内附带了一个工具Err.exe,可以根据错误代码返回对应的错误信息。只需要在命令行窗口中输入“Err 错误代码”即可显示错误信息。对于经常使用的错误代码,可以将其添加到自定义批处理文件中,方便快捷地进行查询。
Err c0000005
该命令将会返回如下信息:
# for hex 0xc0000005 / decimal -1073741819 : STATUS_ACCESS_VIOLATION ntstatus.h # Access violation. <==是我们能从返回值判断到的异常名称 # 1 matches found for <00000005>
除此之外,大量的开发文档也会提供NTSTATUS码列表,例如MSDN网站提供的NTSTATUS文档,这些资料对于开发人员能够做到事半功倍,非常有价值。
三、NTSTATUS错误码
NTSTATUS错误码是非常常见的系统错误码,包含了系统的大多数错误信息。下面选取一些常见的NTSTATUS错误码做简单介绍:
1、0xc0000005 ACCESS_VIOLATION
ACCESS_VIOLATION指的是程序试图读取或者写入一个没有权限的地址,当程序访问内存地址错误时,系统将会返回该错误码。通常出现在访问非法内存地址的情况下,例如空指针处理等。
2、0xC00000FD STACK_OVERFLOW
STACK_OVERFLOW表示程序的调用栈已经超过了设定的栈大小,当栈空间被耗尽时,系统将会返回该错误码。栈溢出通常是由于递归或者线程创建等问题引发的。
3、0xC0000139 ENTRY_POINT_NOT_FOUND
ENTRY_POINT_NOT_FOUND表示程序试图调用一个不存在的函数或者DLL,当动态链接库导出的函数名错误或丢失时,系统将会返回该错误码。
四、NTSTATUS error
在使用NTSTATUS进行开发时,常常遇到由NTSTATUS error引起的错误,通常需要进行一些解决方法的查找和分析。
1、错误分析
发生NTSTATUS error的原因非常多样化,可能是程序代码错误、系统配置错误、环境错误等。由于Windows内核使用增量式更新的方式进行更新,因此某些标准API在不同版本的Windows下表现可能不尽相同,也容易造成NTSTATUS error出现。
2、解决方法
解决NTSTATUS error可以采用如下方式:
1)调整API参数
看看错误信息是否指向了API调用的问题,如果确实是API提供的问题,需要重新编码并根据Windows版本调整API参数。
2)更新驱动程序
若是驱动程序相关问题,需要查找并安装最新版本的驱动程序。
3)使用其他API或库
如果发现某API或库很难解决NTSTATUS error问题,可以考虑使用其他API或库代替。
五、NTSTATUS Login Failure怎么解决
NTSTATUS Login Failure(登录失败)通常是由于账户密码错误、权限设置不正确或者域控制器故障等因素引起的。下面提供一些常见的解决方法:
1、检查账户和密码
首先需要检查用户名和密码是否正确,检查账户是否受到了锁定控制。如果账户密码被锁定需要等待一段时间后再进行登录。
2、检查权限设置
确保有关用户的组和权限设置正确。必要时可以尝试更改用户组和权限等操作.
3、检查域控制器
如果是与域相关的登录问题,需要检查域控制器是否正常运行、网络连接是否畅通等原因,可以尝试重新设置域控制器或者更改域的设置等操作。
代码示例
下面是一个NTSystem调用中的例子,该函数使用ZwClose()搭配NTSTATUS返回值来实现对象的关闭。
NTSTATUS
NTAPI
NtClose(
IN HANDLE Handle
)
{
return ZwClose(Handle);
}
NTSTATUS
NTAPI
ZwClose(
IN HANDLE Handle
)
{
OBJECT_ATTRIBUTES ObjectAttributes;
InitializeObjectAttributes(
&ObjectAttributes,
NULL,
OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
NULL,
NULL);
return ObCloseHandle(
Handle,
&ObjectAttributes
);
}
总结
NTSTATUS状态码在Windows内核开发中非常重要,对于开发人员、系统管理员和维护工程师都有着重要的意义。通过了解NTSTATUS码的定义、查询方式以及一些常见的错误和解决方法,可以帮助我们更好地理解和解决系统问题。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/295728.html
微信扫一扫
支付宝扫一扫