前一天电脑还是可以正常工作,但是隔一天电脑开机后发现命令行CMD启动报错-----应用程序无法正常启动(0xc0000142)
猜测是不是出现杀毒软件误杀的可能,于是排查%windir%\system32\cmd.exe,发现无异常,于是上网狂搜,看了N多个帖子,无非说是dll文件未注册,需要重新注册,有的说软件冲突,还有的说要更改Unicode语言,有的说检查磁盘损坏,还有的说跟屏幕分辨率有关,反正说啥的都有,一个个尝试吧。
首先想到安全模式下尝试打开cmd,结果报错。
然后按照网上的教程,将Windows进程隐藏,禁用其余所有服务,reboot,结果依旧报错。
有说卸载flash player,显卡driver的,尝试都卸了之后 运行依旧报错。
改Unicode语言的话本机已经是中文简体了。
网上还有说修改注册表LoadAppInit_DLLs值为0的(其本质为注册dll)打开位置发现默认值就是0。
分辨率调了又调,貌似没啥作用。
磁盘损坏么?检测工具一上,无异常,甚至内存我都顺便检测了下,无异常。
看来只剩下注册dll了,要注册dll,就要打开cmd,关键是没办法使用cmd,连powershell一样都不可用,用就给你报0xc0000142,实在没办法了只能上win PE了
诡异的是Win PE里面居然能正确打开C盘的cmd.exe(不是win PE自己的),于是按照网上的教程
首先尝试 SFC /SCANNOW
然后反手就给我报一个Windows 资源保护无法启动修复服务。
那就只能尝试使用注册命令了(注意,命令里面必须把盘符加上,否则默认执行的是WIN PE的regsvr32.exe)
for %i in (C:\Windows\system32\*.dll) do C:\Windows\System32\regsvr32.exe /s %i
for %i in (C:\Windows\system32\*.ocx) do C:\Windows\System32\regsvr32.exe /s %i
前面顺利,最后报错
感觉注册很顺利啊,除了这个看不懂的报错,后来百度了下,百度查出来的结果是 “0x00007ff指令中引用的0x000007ff内存,该内存不能为READ是因为计算机的应用程序出错。”
应用程序出错的解决方法是使用for语句重新注册,wtf,这不又绕回来了么,不管了,reboot
进系统,毫无意外的依旧报错,到目前为止,能尝试的都已经尝试了,这个时候又突然发现system32里面很多的exe陆续开始报错,无法打开。
主要这是我的工作机器,重装系统的代价很大,已经走投无路了。
最后抱着死马当活马医的心态,最后放手一搏,打开虚机(纯净版win7),关掉杀软(不关掉杀软复制的时候杀软会频繁弹出警示框),直接暴力复制虚机的system32文件夹到主机,结果由于权限问题报错,于是尝试system32下除子文件夹外的文件都复制,没有报错,复制完成后,小心翼翼的点开cmd,居然开了????
居然没报错!
好嘛,万幸啊万幸,这要是真走到重装系统那一步,那损失可就有点大了。这时候有个虚机备份就体现出重要性了。
所以赶紧记录下来,虽然操作是很简单,但是提供了一条除了普通方法以外的思路。
(PS:如果电脑上没有虚机,那么可行的替代方法是找另外一台正常的机器,然后再复制其system32文件夹到本机进行替换)
其实回过来溯源的话,感觉应该是杀软误杀然后更改了系统某些文件,线索是杀软记录的log
rundll32.exe 也检查没问题,可能一些原因误杀导致某些应用或者配置不可用,而cmd又依赖这些配置或者服务,导致报错。其实在Win PE上CMD可用就说明程序本身没问题,但是如果要具体追溯哪个底层配置出问题可就有点工作量了,索性暴力复制吧。