上次說到當使用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的一些行為有更多的理解
From:http://tw.wingwit.com/Article/Fault/201311/10508.html