很早就发现一个奇怪的现象了,若是你使用任务管理器杀死Explorer.EXE,Windows不会将Explorer.EXE自动唤起,可是若是你本身使用TerminateProcess() 函数结束Explorer.EXE进程,你会发现一个奇怪的现象:被杀死的Explorer.EXE又被Windows自动唤醒了。 函数
在描述具体缘由以前,简单介绍一下Explorer.EXE。Explorer.EXE做为Windows Shell的组件之一,主要的用途包括有: 命令行
z 显示桌面、任务栏 orm
z 提供图形化的文件操做方式(例如你们熟知的资源管理器) z …… 进程
总而言之,没有Explorer.EXE的Windows不是不能运做,而是操做很不方便。 资源
做为Windows Shell重要的一环,Explorer.EXE的启动由注册表键值(Windows 2000/XP/Server 2003): 键:HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon 键名:Shell cmd
默认键值:Explorer.EXE it
或配置文件system.ini决定(Windows 98/ME): [Boot] io
Shell=Explorer.EXE form
须要注意的是,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启动