entercriticalsection md mt(entercriticalsection)
1、边肖在这里给你一些如何处理这个问题的统计数据,让我们一起来了解一下。
(资料图)
2、先抛个结论,再给出分析结果,说明(本文中的dllMIN对应的是DLL入口点,模块入口点的函数名不一定是DLLMIN)
3、结论:
4、Dwm.exe进程初始化LdrInitializeThunk的内部映射dll,并一起调用这些dll的dllmain。当调用用户32的dllmain时,
5、加载NVIDIA的nvinitx.dll的模块使用SHGetShellFolder,它使用了rpcrt4.dll的一些数据。
6、但是,与锁相关的数据在初始化之前就被使用了(因为在调用顺序中它还没有被调用到rpcrt4.dl its dllmain),这会导致异常和死锁。最终导致黑屏或者卡在系统欢迎界面。
7、分析的简要过程:
8、1.从卡时获得的转储可以看出,explorer卡是从ConnectPort到dwm.exe的一个港口。
9、2.查看dwm.exe中的线程,发现其中一个线程在调用SHGetShellFolder函数时卡住了。这张卡导致explorer.exe此后工作不正常,一直卡在链接dwm.exe的端口上。
10、3.检查锁秒主机!SddlSidLookupCritical状态,发现此锁被dwm.exe主线程占用,未被释放。仔细分析后发现,正常情况下主线程应该不会无法释放这个临界段。
11、4.猜猜是什么唯一可能导致这个关键区域不被释放。
12、(上位机调试)调试发现dwm.exe的主线程中英大卫和nvinitx.dll的dllmain会调用SHGetFoldPathW函数。当这个函数被调用时,
13、SddlSidLookupCritical锁已被占用。这时,RPCRT4.dll中的相关函数被调用。
14、但是在调用EnterCriticalSection获取rpcrt4的临界区时,GlobalMutex发生了异常,并跳转到shell32中的异常处理函数function _GSHandlerCheck_EH。
15、此时SddlSidLookupCritical锁没有释放,SHGetFoldPathW返回。看下面的异常,发现rpcrt4中的临界区GlobalMutex没有初始化。
16、dllmain内部很多其他变量值都没有初始化,所以可以确定dllmain没有被调用。
17、5.ida分析表明GlobalMutex的初始化在rpcrt4.dll的dllmain内部。所以我们可以知道问题的原因是rpcrt4.dll的dllmain没有被调用。
18、那么为什么这个dllmain没有被调用呢?
19、6.发现SHGetFoldPathW的调用在nvinitx.dll的dllmain。
20、ntdll!LdrpInitializeProcess函数先映射导入表中的dll在调用这些dll中的dllmain函数。
21、这个出问题环境调试发现rpcr4.dll中dllmain并没有调用到,这个时候gdi32的dllmain函数内部调用loadlibrary加载nvinitx.dll,
22、并调用nvinitx.dll的dllmain函数,但是这个时候调用LdrpLoadDll加载rpcr4.dll的时候,(之前刚映射,这个时候LdrpLoadDll发现rpcr4.dll已经被映射了,
23、所以就不会调用这个rpcr4.dll的dllmain函数)
24、Loadlibrary调用LdrpLoadDll(这个函数先检查模块rpcr4.dll是否映射,发现已经映射就不会调用这个的dllmain,
25、接下来调用其它函数使用临界区GlobalMutex就出现异常崩溃)这个rpcr4.dll的dllmain会在接下来的ntdll!LdrpRunInitalizeroutines函数内部调用。
26、7.更新了英伟达显卡驱动372.54及372.70版本后,开机启动过程中,经过上面一系列的异常调用,最终系统会被卡在欢迎界面或个别电脑出现黑屏的情况。
本文到此结束,希望对大家有所帮助。