瞭解windows關機過程

來源:互聯網
上載者:User
1、關機原理
   我們執行關機操作後,通常看到的是系統的關機畫面,然後是或短或長的等待,究竟這個關機畫面後隱藏怎麼樣的過程呢?關機其實和開機一樣涉及到多個過程,是多個進程,組件之間一個相互協作的過程,下面我們來細緻瞭解一下:
   1)發起關機指令
    當使用者發起關機指令時,將調起關機程式,windows xp下是shutdowm.exe,win98和win2000是rundll32.exe,該程式會通知windows子系統進程csrss.exe,CSRSS.EXE收到通知以後會和Winlogon.EXE做一個資料交換,做好關機的準備工作,接著由Winlogon.EXE通知CSRSS.EXE開始關閉系統的流程。
    csrss.exe是用戶端服務子系統,用以控制windows圖形相關子系統;
    winlogon.exe則是windows NT使用者登入程式,主要系統管理使用者登入和退出。
   2)通知使用者進程退出
    第一個過程中windows子系統進程csrss.exe收到winlogon.exe的通知後,會依次查詢擁有頂層視窗的使用者進程,如常見的使用者程式,殺毒軟體,防火牆等,讓這些進程退出。如果某一個使用者進程在一個預設的逾時時間5000毫秒(可以通過修改註冊表索引值HKEY_CURRENT_USER\Control Panel\Desktop\ HungAppTimeout設定逾時時間)內沒有退出的話,Windows會顯示一個結束任務對話方塊用於詢問使用者是否結束這個任務。預設情況下將顯示這個對話方塊並一直保持而不會自動關閉。對於控制台程式來說,基本情況類似,只不過Windows使用HKEY_CURRENT_USER\Control Panel\Desktop\ WaitToKillAppTimeout值來設定逾時時間。
   3)關閉系統進程
    在關閉使用者進程後,開始進入到關閉系統進程階段,正常使用狀態下無法結束的系統進程,如smss.exe,lsass.exe等將被終止。終止系統進程和終止使用者進程略有不同,windows在終止系統進程的時候並不像終止使用者進程那樣,如果無法在規定時間內種植提示使用者,則直接跳過這個進程,去執行下一個系統進程的終止操作。其中使用的逾時時間和第2步使用的時間相同。

   以上三點,被成為關機過程中的軟保護,這樣對於作業系統或第三方應用程式都能起到保護作用,如果強行關閉可能導致相關檔案破壞等異常。

   4)核心組件的退出和最後的關機工作
    這一步被成為關機硬保護,winlogon.exe調用系統API函數NtShutdownSystem()或ZwShutdownSystem函數來命令系統執行windows核心組件的退出和最後的關機工作。例如:裝置驅動在這個階段裡面完成一些驅動設定的特殊操作;也是在這個階段,組態管理系統將被修改過的註冊表資料會寫道磁碟裡面。等除了電源管理以後的全部子系統完成退出以後,電源管理完成最後的操作,如重啟、關機等。

2、響應關機事件分析
    不管是直接按機箱上的Power按鈕,還是點擊開始菜單->關閉電腦(登出、關機、重啟),我們的應用程式都可以響應這類事件,那就是視窗訊息WM_QUERYENDSESSION和WM_ENDSESSION。
    系統提供了一個常用的API實現系統的登出、關機和重啟,它的聲明為:
    BOOL ExitWindowsEx(
         UINT uFlags,
        DWORD dwReason
        );
    參數uFlags可分為兩類,之間可以用“|”合并:
    1). 關閉動作,有以下標誌:EWX_LOGOFF(登出)、EWX_SHUTDOWN(關閉系統後不切斷電源,即使主板支援ATX電源管理)、EWX_POWEROFF(關機,關閉系統後切斷電源,需主板支援)、EWX_REBOOT(重啟)。
    2). 關閉強度,有以下標誌:數值0(安全關閉,不使用該類標誌時預設為該項)、EWX_FORCEIFHUNG(應用程式掛起一段時間後強行關閉)、EWX_FORCE(強行關閉,不管應用程式有沒有掛起)。
    如果不使用關閉強度標誌(EWX_FORCE或EWX_FORCEIFHUNG),關機是安全的,也就是說,在關機的軟保護時,系統將給每個以案頭為頂級的視窗進程發送WM_QUERYENDSESSION訊息。如果超過5000毫秒(可以通過修改註冊表索引值HKEY_CURRENT_USER\Cont rol Panel\Desktop\ HungAppTimeout設定逾時時間)仍未有WM_QUERYENDSESSION訊息的返回,則彈出結束任務對話方塊用於詢問使用者是否結束這個任務。預設情況下將顯示這個對話方塊並一直保持而不會自動關閉;如果設定了自動結束任務(HKEY_CURRENT_USER\Cont rol Panel\Desktop\AutoEndTasks索引值改為1),那麼逾時(HungAppTimeout)後仍未有 WM_QUERYENDSESSION訊息的傳回值時,不再顯示結束任務對話方塊而直接結束這個掛起的任務。如果多個進程響應了 WM_QUERYENDSESSION並掛起(如記事本彈出詢問是否儲存的訊息框),那麼系統對於每個進程是串列處理的,即等待第一個掛起的進程響應 WM_QUERYENDSESSION並返回後(立即發送WM_ENDSESSION通知同一視窗使用者的選擇<是否確認關閉>),再給下一個進程發送WM_QUERYENDSESSION並等待掛起逾時。

4、如何快速關機
   通過前面關機過程的描述,我們可以知道關機過程是經過一個一個階段逐步完成,某一步出錯都有可能導致關機失敗,前3個步驟時關機過程中最耗時間的一段,常見的關機問題都是由這3個步驟引起。
   經常聽到快速關機,或者是關機最佳化軟體,那麼它們到底怎麼是實現的,有沒有用呢?
   1)在關機原理裡提到兩個註冊表索引值,對應相關程式的逾時回應時間,我們可以修改減小這兩個索引值,HKEY_CURRENT_USER\Control Panel\Desktop\ HungAppTimeout和HKEY_CURRENT_USER\Control Panel\Desktop\ WaitToKillAppTimeout,這確實是有效,如前面所述,原因在於前一索引值設定的是使用者進程自動結束的逾時時間,後一索引值設定的是控制台程式自動結束的逾時時間。減小這兩個索引值會加快使用者和控制台進程的退出速度,從而加快關機速度。
   2)經典的關機技巧
    用ctrl健配合工作管理員快速關機,即可在一兩秒內立即斷電關機,實際上原理是這個關機過程跳過了前三個步驟,直接進入第4步,這樣帶來的風險就是您的應用程式資料可能丟失,作業系統檔案也可能被破壞進不了系統。那些所謂的快速關機軟體,就是這樣直接調用ntdll.dll中的ZwShutdownSystem()實現的。實際上,正常來說,windows關機速度變慢的多數問題在於關機前使用者使用的程式過多,或者是執行關機前沒有退出一些大型的軟體,或者一些軟體自身的退出管理存在問題,從而造成了關機的延遲,因此加快關機速度,正確的做法是減少應用程式對關機過程的影響,如在關機前盡量關閉使用者程式,盡量不要再電腦處於忙的狀態時關機。
    我們來瞭解下實現斷電關機的代碼:
    const int SE_SHUTDOWN_PRIVILEGE = 0x13;
    typedef int (__stdcall *PFN_RtlAdjustPrivilege)( INT, BOOL, BOOL, INT*);
    typedef int (__stdcall *PFN_ZwShutdownSystem)(INT);
    HMODULE hModule = ::LoadLibrary(_T("ntdll.dll"));
    if( hModule != NULL)
    {
        PFN_RtlAdjustPrivilege pfnRtl = (PFN_RtlAdjustPrivilege)GetProcAddress( hModule, "RtlAdjustPrivilege");
        PFN_ZwShutdownSystem pfnShutdown = (PFN_ZwShutdownSystem)GetProcAddress( hModule,"ZwShutdownSystem");
        if( pfnRtl != NULL &pfnShutdown != NULL )
        {
            int en = 0;
            int nRet= pfnRtl( SE_SHUTDOWN_PRIVILEGE, TRUE, TRUE, &en);
            if( nRet == 0x0C000007C )
            nRet = pfnRtl(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &en);
            //SH_SHUTDOWN = 0;
            //SH_RESTART = 1;
            //SH_POWEROFF = 2;
            const int SH_POWEROFF = 2;
            nRet = pfnShutdown(POWEROFF);
        }

    }

3、無法關機調試執行個體

  http://blogs.msdn.com/ntdebugging/archive/2009/11/09/system-won-t-power-down.aspx

  這篇文章詳介紹了關機原理,和一個系統無法關機的調試執行個體,調試過程很值得學習。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.