Windows システムを起動すると、オペレーティング システムの安定性の重要な基礎となる多くのサービスがバックグラウンドで静かに実行されます。これらのサービスの起動と管理は、主にサービス コントロール マネージャー (SCM) の責任です。 SCM は、Windows NT シリーズのオペレーティング システムの下にある特別なシステム プロセスであり、Windows サービス プロセスの開始、停止、および対話を担当します。
SCM の主な機能は、自動的に開始するように構成されたすべてのサービスを開始するメイン関数 SvcCtrlMain() から始まります。
SCM 実行可能ファイル services.exe は %SystemRoot%\System32\ にあり、システム起動の初期段階で Wininit プロセスによって起動されます。 SCM が動作を開始すると、まずインストールされたサービスの内部データベースが初期化され、特定のレジストリ キーが読み取られます。
具体的には、次の 2 つのレジストリ キーを読み取って内部データベースを初期化します。
SCM は、グループ値と各サービスの依存関係に基づいて、サービスの読み込み順序を決定します。このプロセス中に循環依存関係が見つかった場合、SCM はエラーをログに記録し、遅れて読み込まれたグループに依存するサービスをスキップします。
SCM の次のステップは、システムの起動時に起動する必要があるデバイス ドライバーが正常に読み込まれたかどうかを確認し、失敗したドライバーを ScFailedDrivers というリストに保存することです。
次に、SCM は ScAutoStartServices() 関数を呼び出し、自動開始としてマークされたすべてのサービスをループし、それに応じて開始します。 SCM は各サービスに対して ScStartService() 関数を呼び出して、サービスのプロセスが正しいアカウントで実行されるようにします。サービスがシステム アカウントで実行されていない場合、SCM は LSASS 関数 LogonUserEx() を呼び出して、サービスが最初に構成されたときに安全に保存された「秘密」パスワードを取得します。
それだけでなく、遅延自動起動サービスという特別なタイプのサービスもあります。このタイプのサービスは、システムの起動が遅い問題を解決するために Windows Vista で導入されました。 SCM は、遅延のない自動開始サービスがすべて処理されるまで、遅延された自動開始サービスの初期化を開始しません。
これらのサービスは開始に遅延がありますが、開始順序を除けば他のサービスと大きな違いはありません。
SCM はデバイス ドライバー サービスも具体的に処理することに注意してください。これらのサービスのタイプ登録値は、SERVICE_KERNEL_DRIVER または SERVICE_FILE_SYSTEM_DRIVER です。 SCM が ScStartService() を呼び出すと、さらに ScLoadDeviceDriver() 関数を呼び出して対応するドライバーをロードします。
NtLoadDriver システム コールを通じて、SCM はドライバーが正しくロードされていることを確認します。初期起動プロセス中に、SCM は、Windows メッセージ WM_DEVICECHANGE をブロードキャストして、ネットワーク ドライブの接続状態が変更されたときに、Windows エクスプローラーなどの他のアプリケーションに通知する役割も担います。
この設計により、ユーザーはシステム リソースとサービスをより適切に管理できるようになり、オペレーティング システムのスムーズな動作が保証されます。
しかし、SCM はシステムの起動に重要な役割を果たしますが、多くのユーザーは SCM がどのように機能するかを実際には理解していません。 SCM のあらゆる操作の背後には、複雑で効率的なテクノロジーが存在します。実際、このテクノロジーにより、ユーザーは一見普通のアプリケーションやサービスを何の障害もなく使用できます。
Windows の将来のバージョンでは、ますます多様化するユーザーのニーズを満たすために SCM はどのように進化するのでしょうか?