Explorer.EXE進程自動重啓的故事

很早就發現一個奇怪的現象了,若是你使用任務管理器殺死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啓動

相關文章
相關標籤/搜索