C++程序启动时报“0xc0000022”无法启动的错误

360安全卫士怀疑C++程序依赖的某个dll包含病毒行为,将该dll库隔离了、锁定住了,禁止其他程序访问该文件,导致C++程序启动时报错,启动失败。本文简单地讲述整个问题的排查过程,给大家提供一些借鉴或参考。       

1、问题描述

       某天要使用VS调试C++代码,结果调试运行Debug版本的C++程序时,弹出如下的报错提示框:

图片[1]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

很是奇怪。最开始以为是不是程序依赖的库有问题,于是将相关的库代码重新都编译了一下,但问还是无法启动程序,这是啥情况?其实当时应该用windbg挂一下的,可能是直接能找打原因的,但当时忘记了,等问题解决后就没有现象了。

2、查找到异常值0xc0000022对应的标识STATUS_ACCESS_DENIED

       这段时间经常遇到这样那样程序启动报错的问题,所以想深入研究一下到底是怎么回事。于是到百度中以“0xc0000022 msdn”为关键字搜索了一下,搜到了msdn上关于该错误码的相关说明:

[MS-CIFS]: Response | Microsoft Docs

网页相关截图如下:

图片[2]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

图片[3]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

从图中可以看出,0xc0000022值对应的是STATUS_ACCESS_DENIED,从字面上看应该是拒绝访问了。

估计是C++程序启动时,在将其依赖的库加载的库加载到进程空间中时出现了访问被拒绝的问题,所以导致程序启动失败了。

       将上面截图中的字符串“STATUS_ACCESS_DENIED”拷贝到VS2017中,然后go到所在的头文件中,头文件路径如下:
C:\Program Files\Windows Kits\10\Include\10.0.17763.0\shared\ntstatus.h
在该头文件中看到了0xC0000022值的定义及含义:(在有些电脑上可能找不到STATUS_ACCESS_DENIED的定义,可以到上述类似的路径中去找ntstatus.h头文件,如果找不到,可以尝试先安装一下WIndbg10,然后就会有上述目录了

图片[4]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

所以后面在遇到类似的错误弹窗,可以到上述头文件中找到错误码数组对应的含义是什么了!

3、使用Process Monitor定位到哪个dll库被隔离了

       这个问题还要进一步研究,到底是访问哪个文件时被拒绝了呢?于是尝试使用Process Monitor工具监测一下文件活动,看看是否有ACCESS_DENIED的记录。

Process Monitor工具可以监测目标进程的文件与注册表活动,使用该工具可以辅助排查一些软件运行过程中的问题。

        启动Process Monitor后,点击工具栏的漏斗图标,将testdemo.exe设置为进程过滤对象:

 

图片[5]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

 然后点击工具栏中的按钮,将对注册表活动等的监控都取消掉,只监控文件活动:

图片[6]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

然后双击启动testdemo.exe程序,Process Monitor中立即监测到testdemo.exe进程所有的文件操作记录。

       在监测到的记录中以Denied关键字搜索,搜索到了一条Denied记录,右键点击属性,查看详细信息如下:

图片[7]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

从上图可以看出,应该是访问到mtpbstructdll.dll文件时被拒绝了。

       难道是360觉得该文件可能包含病毒,将该文件隔离了,禁止访问了?于是到360安全卫士按照下面的操作步骤查看拦截记录。先点击主页面上方的“木马查杀”按钮,进入如下页面:

图片[8]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

点击恢复区按钮,进入如下的页面:

图片[9]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

上面的截图是事后查看的历史记录,应该是点击可恢复区界面,将被隔离的文件恢复回去就好了,如下所示:

图片[10]-C++程序启动时报“0xc0000022”无法启动的错误-卡核

 记得将恢复确认窗口下方的“恢复后新人此文件,不再查杀”的选项勾选上,下次可能就不会查杀了。将文件恢复之后,就能正常C++程序了。

4、在360安全卫士中将被隔离的文件恢复了,但360并没有释放对文件的锁定

        后来有一次,又出现了0xc0000022启动报错的问题。使用上述这个方法,定位出是在加载mtdispatchdll.dll库时访问被拒绝,估计mtdispatchdll.dll库又被360安全卫士锁住了,导致目标程序无法访问了。

       到360拦截记录中并没有找到关于mtdispatchdll.dll的条目,应该是之前弹出拦截提示框时,我们取消对该文件的拦截,我们将该文件恢复了。估计是360安全卫士的bug,文件被恢复后并没有释放对文件的锁定,导致还是无法启动目标程序。后来重启电脑才可以启动程序。

© 版权声明
THE END
喜欢就支持一下吧
点赞1.4W+赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容