上次说到当使用TerminateProcess()函数并将参数uExitCode设置为非时去结束ExplorerEXE进程Windows会自动唤醒ExplorerEXE进程今天将继续讨论这个问题 上次讨论到系统启动的时候ExplorerEXE进程是由UserInitEXE进程启动的然后UserInitEXE进程退出(关于这一点可以参考《Windows Internals th》一书关于启动过程上的介绍)但是对于当我们使用TerminateProcess()函数并将参数uExitCode设置为非时去结束ExplorerEXE进程这种情况被唤醒的ExplorerEXE进程的父进程并不是UserInitEXE跟蹤发现这个时候UserInitEXE进程并没有出现那么是谁唤醒了ExplorerEXE进程呢?为什么会唤醒这个进程呢? 进一步的探索发现Windows是否唤醒ExplorerEXE进程需要确定个条件 TerminateProcess()函数的uExitCode的值 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoRestartShell的值 上次说到当uExitCode的值是非的时候Windows 将自动重启ExplorerEXE但是进一步的研究可以得知如果AutoRestartShell的值是的话无论uExitCode的值是多少Windows均不会自动唤醒ExplorerEXE 关于AutoRestartShell值的介绍我查阅了一些资料得到了下面的一些信息 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoRestartShell类型REG_DWORD 默认值 值含义 如果Windows用户界面或他的某个组建以外的终止运行则用户界面会自动重新启动 如果Windows用户界面或他的某个组建以外的终止运行则用户界面不会自动重新启动 *注这里说的Windows用户界面通常指ExplorerEXE *注这个策略适用于Windows /XP/Server 知道了ExplorerEXE自动重启原因以后就要说说是谁重新启动了ExplorerEXE 是WinLogonEXEWindows登录/注销等一系列操作的关键进程在侦测到ExplorerEXE停止以后自动重新启动了ExplorerEXE 整个大致的流程是这样的当使用TerminateProcess()函数且uExitCode不为时去结束ExplorerEXE进程会有一个消息给SAS(Secure Attention Sequence关于SAS的解释请看 MSDN Magazine 年月号《Customizing GINA Part 》)在这个消息处理函数里面会检查uExitCode的值和AutoRestartShell的值如果发现uExitCode的值是的话则不进行后面的操作否则会检查AutoRestartShell的值如果是的话会自动重新启动ExplorerEXE表现为由WinlogonEXE启动 如果TerminateProcess()函数的参数uExitCode为的话那么Windows会认为这个进程结束是graceful的则不会检查AutoRestartShell的值 自动唤醒的时间是毫秒
至此关于ExplorerEXE自动重启的解释就告一个段落了在研究过程中得到了众多朋友的帮助向他们表示由衷的感谢希望本文能够帮助大家对Windows的一些行为有更多的理解 |