Explorer.EXE进程自动重启的故事

很早就发现一个奇怪的现象了,如果你使用任务管理器杀死Explorer.EXE,Windows不会将Explorer.EXE自动唤起,但是如果你自己使用TerminateProcess() 函数结束Explorer.EXE进程,你会发现一个奇怪的现象:被杀死的Explorer.EXE又被Windows自动唤醒了。 

 

在描述具体原因之前,简单介绍一下Explorer.EXE。Explorer.EXE作为Windows Shell的组件之一,主要的用途包括有: 

z 显示桌面、任务栏  

z 提供图形化的文件操作方式(例如大家熟知的资源管理器)  z ……  

总而言之,没有Explorer.EXE的Windows不是不能运作,而是操作很不方便。  

作为Windows Shell重要的一环,Explorer.EXE的启动由注册表键值(Windows 2000/XP/Server 2003): 键:HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon 键名:Shell 

默认键值:Explorer.EXE  

或配置文件system.ini决定(Windows 98/ME): [Boot] 

Shell=Explorer.EXE  

需要注意的是,Windows提供了更换Shell的功能,如果上述的配置点不同,那么Windows会使用其它的Shell,例如把注册表键值更换为cmd.exe,那么启动以后你看到的不是图形化的操作界面而是命令行提示符(很多软件更换Shell就是这样变出来的)。如果上述的配置点出现问题,那么登陆以后你只能看到一个桌面,而桌面上没有任何的图标显示(有部分计算机病毒会这样操作)。  

在回顾了Explorer.EXE的功能以后,下面进入正题,说说Explorer.EXE进程杀死的问题。 由于某些特殊原因,我们需要在某些时候杀死Explorer.EXE进程以达到某些效果,但是在使用中发现,很多程序,包括著名的IceSword在杀死Explorer.EXE以后,Explorer.EXE都会被Windows自动唤醒。但是如果使用任务管理器(Taskmgr.EXE)或Process Explorer(http://www.sysinternals.com),则没有这样的现象,为什么呢? 

对这2个程序的导入表进行分析和动态跟踪以后,发现这2个程序在结束进程的时候并没有使用 Undocumented API,使用的还是已经公开的API函数TerminateProcess(),这就很奇怪了,为什么我们使用TerminateProcess()去结束Explorer.EXE会出现Explorer.EXE在结束以后被Windows自动唤醒的问题而任务管理器和Process Explorer不会呢? 

先研究一下 TerminateProcess() 的调用方式: 

1. 以 PROCESS_TERMINATE 方式使用 OpenProcess() API或其他等同方法打开进程句柄  2. 调用 TerminateProcess() API对被打开的句柄执行终止操作  3. 使用 CloseHandel() API关闭句柄。  

整个流程非常简单,但是问题到底出在哪里呢?仔细研究所涉及的API的参数,发现在Platform SDK里面并没有对TerminateProcess() API的参数有很相信的解释,特别是第2个参数说的非常模糊。Platform SDK对TerminateProcess() API是这样解释的:  

BOOL TerminateProcess(   HANDLE hProcess,   UINT uExitCode

uExitCode为1 则不再启动

检查注册表,如果uExitCode为0,注册表AutoRestartShell为1,则有winlogon启动


转载于:https://my.oschina.net/u/1777508/blog/607309

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值