安徽趙凱讀者來(lái)信:“我最近下載了一款快速關(guān)機(jī)的軟件,這款軟件非常厲害,幾乎眨眼工夫就將電腦關(guān)閉了。很多人說(shuō)這個(gè)軟件可能會(huì)破壞數(shù)據(jù),但他們又沒(méi)有說(shuō)出相應(yīng)的依據(jù)。我現(xiàn)在很矛盾,有了一個(gè)好東西,卻又不敢用。董師傅,希望你能給一個(gè)權(quán)威的說(shuō)法,以消除我的疑惑。”
不光是趙凱讀者提到的軟件能實(shí)現(xiàn)快速關(guān)機(jī),而且采用一些技巧也可以達(dá)到同樣的目的,但這樣操作究竟會(huì)帶來(lái)什么后果呢?這次被師傅邀請(qǐng)到“話題館”參與討論的是對(duì)Windows系統(tǒng)頗有研究、榮獲2004年微軟最有價(jià)值專家的張康宗先生。
從平常的經(jīng)驗(yàn)可以看出,執(zhí)行了關(guān)機(jī)操作后電腦不會(huì)立即斷電,Windows還會(huì)有一系列的動(dòng)作如關(guān)閉打開(kāi)的程序等,那么從執(zhí)行關(guān)機(jī)命令到最終斷電是一個(gè)什么樣的過(guò)程呢?
Windows的正常關(guān)機(jī)涉及到多個(gè)組件和多個(gè)過(guò)程。我們來(lái)看一下它的基本過(guò)程。
①用戶發(fā)起關(guān)機(jī)指令后,發(fā)起關(guān)機(jī)指令的程序會(huì)通知Windows子系統(tǒng)CSRSS.EXE,CSRSS.EXE收到通知后會(huì)和Winlogon.EXE做一個(gè)數(shù)據(jù)交換,接著由Winlogon.EXE通知CSRSS.EXE開(kāi)始關(guān)閉系統(tǒng)的流程。
②CSRSS.EXE收到Winlogon.EXE的通知后,會(huì)依次查詢擁有頂層窗口的用戶進(jìn)程,讓這些用戶進(jìn)程退出。如果某一個(gè)用戶進(jìn)程在一個(gè)默認(rèn)的超時(shí)時(shí)間5000毫秒(可以通過(guò)修改注冊(cè)表鍵值HKEY_CURRENT_USERControl PanelDesktop HungAppTimeout設(shè)定超時(shí)時(shí)間)內(nèi)沒(méi)有退出的話,Windows會(huì)顯示一個(gè)結(jié)束任務(wù)對(duì)話框用于詢問(wèn)用戶是否結(jié)束這個(gè)任務(wù)。默認(rèn)情況下這個(gè)對(duì)話框會(huì)一直顯示而不會(huì)自動(dòng)關(guān)閉。
對(duì)于控制臺(tái)程序來(lái)說(shuō),基本情況類似,只不過(guò)Windows使用HKEY_CURRENT_USERControl PanelDesktop WaitToKillAppTimeout來(lái)設(shè)置超時(shí)時(shí)間。
③接著是輪到終止系統(tǒng)進(jìn)程了。系統(tǒng)進(jìn)程包括SMSS.EXE、Winlogon.EXE、Lsass.EXE等。Windows在終止系統(tǒng)進(jìn)程的時(shí)候并不像終止用戶進(jìn)程那樣如果無(wú)法在規(guī)定時(shí)間內(nèi)終止則提示用戶,而是跳過(guò)這個(gè)進(jìn)程,去執(zhí)行下一個(gè)系統(tǒng)進(jìn)程的終止操作。使用的超時(shí)時(shí)間和第2步使用的時(shí)間相同。
上述3個(gè)步驟是整個(gè)Windows關(guān)機(jī)過(guò)程中最耗費(fèi)時(shí)間的一段,大多數(shù)關(guān)機(jī)緩慢的原因都是因?yàn)檫@3個(gè)步驟引起的。完成前3個(gè)步驟后,進(jìn)入關(guān)機(jī)操作的第4個(gè)階段,這也是最后一個(gè)階段。
④Winlogon.EXE調(diào)用一個(gè)原生API函數(shù)NtShutdownSystem()來(lái)命令系統(tǒng)執(zhí)行后面的掃尾工作。在這個(gè)階段里,Windows執(zhí)行子系統(tǒng)會(huì)完成最后的關(guān)機(jī)操作,例如:設(shè)備驅(qū)動(dòng)在這個(gè)階段里完成一些驅(qū)動(dòng)設(shè)定的特殊操作;也是在這個(gè)階段,配置管理系統(tǒng)將被修改過(guò)的注冊(cè)表數(shù)據(jù)回寫(xiě)到磁盤(pán)里面。等除了電源管理以外的全部子系統(tǒng)完成退出以后,電源管理完成最后的操作:如重啟、關(guān)機(jī)等。
看來(lái)Windows關(guān)機(jī)過(guò)程還挺復(fù)雜的。我也試用了劉凱讀者所說(shuō)的軟件SuperFast Shutdown(http://www.xp-smoker.com/installations/superfast.zip),確實(shí)會(huì)讓關(guān)機(jī)速度加快。另外我們知道按Ctrl鍵的同時(shí),再單擊任務(wù)管理器窗口中的菜單“關(guān)機(jī)→關(guān)閉”命令時(shí),系統(tǒng)也會(huì)被快速關(guān)閉。它們又是如何實(shí)現(xiàn)快速關(guān)機(jī)的目的呢?
我分析了一下SuperFast Shutdown,它是用Visual Basic編寫(xiě)的。經(jīng)過(guò)分析后得出一個(gè)令人驚訝的結(jié)論:SuperFast Shutdown首先使用RtlAdjustPrivilege()提升自己的權(quán)限,然后直接調(diào)用NtShutdownSystem() 函數(shù)來(lái)完成關(guān)機(jī)過(guò)程。也就是說(shuō)它跳過(guò)了最為耗費(fèi)時(shí)間的前3個(gè)步驟而直接進(jìn)入第4個(gè)步驟,因此能夠很快關(guān)機(jī)。
利用Ctrl鍵配合任務(wù)管理器的快速關(guān)機(jī)技巧類似于SuperFast Shutdown的原理,即通過(guò)省略一些步驟來(lái)加快關(guān)機(jī)的速度。
原來(lái)它們之所以能快速關(guān)機(jī)是因?yàn)橥稒C(jī)取巧,跳過(guò)了一些步驟。我記得當(dāng)初使用Ctrl鍵配合任務(wù)管理器的關(guān)機(jī)技巧時(shí),關(guān)機(jī)速度是快了,不過(guò)卻出現(xiàn)過(guò)Office各組件中的個(gè)性設(shè)置丟失等莫名其妙的問(wèn)題,這些問(wèn)題和快速關(guān)機(jī)有關(guān)嗎?
毫無(wú)疑問(wèn),利用前面的方法快速關(guān)機(jī)很容易導(dǎo)致你所說(shuō)的那些問(wèn)題。這是因?yàn)樵谇?個(gè)步驟中,有一個(gè)讓進(jìn)程正常退出的過(guò)程。大多數(shù)軟件在編寫(xiě)的時(shí)候會(huì)把一些設(shè)置保存在自己私有的內(nèi)存空間里面,當(dāng)軟件關(guān)閉的時(shí)候才把這些設(shè)置回寫(xiě)到特定的地方,如注冊(cè)表或某個(gè)配置文件里。
而關(guān)機(jī)操作的第4步并沒(méi)有提供一種途徑能夠讓這些設(shè)置被記錄下來(lái),因?yàn)檫@個(gè)階段Windows認(rèn)為前面所有必須經(jīng)過(guò)的流程已經(jīng)完成,剩下的就是Windows核心組件的退出問(wèn)題了。在這種情況下,使用快速關(guān)機(jī)導(dǎo)致軟件設(shè)置丟失等現(xiàn)象也就不足為怪了。
實(shí)際上Windows本身的關(guān)機(jī)速度已經(jīng)很快了,關(guān)機(jī)速度變慢的多數(shù)問(wèn)題都出在用戶安裝的程序上,由于一些設(shè)計(jì)不好的應(yīng)用程序或驅(qū)動(dòng)程序的問(wèn)題,造成了關(guān)機(jī)上的延遲。
因此要加快關(guān)機(jī)速度,正確的做法是盡量減少應(yīng)用程序等對(duì)關(guān)機(jī)過(guò)程的影響,如關(guān)閉一些無(wú)用的自啟動(dòng)程序等,而借助SuperFast Shutdown或一些技巧執(zhí)行非常規(guī)的關(guān)機(jī)操作盡量不要使用,畢竟數(shù)據(jù)的安全性比節(jié)省的那幾十秒鐘重要得多。