當您啟動Windows系統時,許多服務在背後默默運行,它們是操作系統穩定的重要基石。這些服務的啟動和管理大多是由服務控制管理器(Service Control Manager,簡稱SCM)負責的。SCM是一個特殊的系統過程,位於Windows NT系列操作系統之下,負責啟動、停止及與Windows服務過程互動。
SCM的主要功能始於其主函數SvcCtrlMain(),它啟動所有配置為自動啟動的服務。
SCM的可執行檔services.exe位於%SystemRoot%\System32\下,隨著系統啟動早期由Wininit進程啟動。當SCM開始工作時,它首先會初始化已安裝服務的內部數據庫,該過程中會讀取特定的註冊表鍵。
具體而言,它通過讀取以下兩個註冊表鍵來初始化內部數據庫:
SCM根據每個服務的Group值和依賴關係來確定服務的加載順序。在這個過程中,如果發現循環依賴,SCM會記錄錯誤並跳過依賴於後期加載組的服務。
SCM的下個步驟是檢查應在系統啟動期間啟動的設備驅動程序是否成功加載,並將失敗的驅動程序保存在名為ScFailedDrivers的列表中。
SCM接著會呼叫ScAutoStartServices()函數,該函數迴圈檢查所有標記為自動啟動的服務,並依此啟動它們。對於每個服務,SCM調用ScStartService()函數,確保服務的進程在正確的帳戶下運行。如果服務不是在系統帳戶內運行,那麼SCM會調用LSASS函數LogonUserEx()來獲取“秘密”密碼,這些密碼在服務最初配置時被安全儲存。
不僅如此,還有一類特殊的服務——延遲自動啟動服務。這類服務在Windows Vista中被引入,目的是解決系統啟動過慢的問題。SCM會在處理完所有非延遲自動啟動的服務後,才開始初始化延遲自動啟動的服務。
雖然這類服務的啟動會有延遲,但除啟動順序外,它們與其他服務並無太大區別。
值得注意的是,SCM還專門處理設備驅動服務。這些服務的Type註冊值為SERVICE_KERNEL_DRIVER或SERVICE_FILE_SYSTEM_DRIVER。當SCM調用ScStartService()時,它會進一步調用ScLoadDeviceDriver()函數來加載相應的驅動程序。
透過NtLoadDriver系統調用,SCM能夠確保驅動程序正確加載。在初始啟動過程中,SCM甚至還負責通知其他應用程式,如Windows檔案總管,當網絡驅動器的連接狀態發生變化時,藉由廣播Windows消息WM_DEVICECHANGE。
這樣的設計讓用戶能夠更好地管理其系統資源和服務,確保操作系統的良好運行。
然而,儘管SCM在系統起步時扮演著如此關鍵的角色,許多用戶卻並不真正了解它的運作機制。SCM的每一個運作背後,都隱藏著複雜而高效的技術,實際上,它讓用戶可以無障礙使用那些看似平常的應用程式和服務。
在未來的Windows版本中,SCM將如何進化以滿足越來越多樣化的用戶需求呢?