サービス制御マネージャ(SCM )は、 Windows NTファミリーのオペレーティングシステムにおける特別なシステムプロセスであり、Windowsサービスプロセスを開始、停止、および対話します。[ 1 ]これは実行ファイル内にあります。サービスプロセスは、明確に定義されたAPIを介してSCMと対話し、同じAPIは、 MMCスナップインやコマンドラインサービス制御ユーティリティなどの対話型Windowsサービス管理ツールによって内部的に使用されます。%SystemRoot%\System32\services.exeServices.mscsc.exe
SCM実行ファイルはServices.exe、Windowsコンソールプログラムとして実行され、システム起動時にWininitプロセスによって起動されます。[ 2 ]その主な機能は、自動起動用に構成されたすべてのサービスを起動します。まず、次の2つのレジストリキーを読み取って、インストールされているサービスの内部データベースを初期化します。SvcCtrlMain()
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\Listサービスグループの名前と順序が含まれています。各サービスのレジストリキーには、他のサービスグループに対する、それぞれのサービスまたはデバイスドライバGroupの初期化順序を制御するオプションの値が含まれています。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services実際のサービスとデバイスドライバのデータベースが含まれており、SCM の内部データベースに読み込まれます。[ 3 ] SCM は、各サービスのGroup値とロード順序の依存関係を、それらDependOnGroupのDependOnServiceレジストリキーから読み取ります。[ 4 ]次のステップでは、SCM のメイン関数がSvcCtrlMain()関数を呼び出しScGetBootAndSystemDriverState()、ブートまたはシステム起動中に起動されるべきデバイスドライバが正常にロードされたかどうかを確認します。ロードに失敗したドライバは、というリストに格納されますScFailedDrivers。次に、SCM と特定のサービスとやり取りする SCP (サービス制御プロセス) との間のリモートプロシージャコールインターフェイスとして、名前付きパイプ\Pipe\Ntsvcsが作成されます。
次に、自動起動としてマークされたすべてのサービスをループ処理するScAutoStartServices()関数を呼び出し、計算されたロード順序の依存関係に注意を払います。循環依存の場合はエラーが記録され、ロード順序で後から来るグループに属するサービスに依存するサービスはスキップされます。遅延自動起動サービスの場合、グループ化は効果がなく、システム起動の後の段階でロードされます。[ 5 ]
SCM は、起動したい各サービスに対して、ScStartService()サービスのプロセスを実行するファイルの名前をチェックする関数を呼び出し、サービスに指定されたアカウントがサービス プロセスが実行されるアカウントと同じであることを確認します。アカウントで実行されていないすべてのサービスは、 LSASS関数Systemを呼び出すことによってログインされます。LSASS プロセスは、サービスが最初に構成されたときにSCP が API を使用して保存したレジストリ キーに保存されている「秘密の」パスワードを検索します。 [ 6 ]LogonUserEx()HKLM\SECURITY\Policy\Secrets\LsaStorePrivateData()
次に、ScLogonAndStartImage()サービス プロセスがまだ起動されていないすべてのサービスに対して関数が呼び出されます。サービス プロセスは、 APIを介して一時停止状態CreateProcessAsUser()で作成されます。サービス プロセスの実行が再開される前に、SCM とサービス プロセス間の通信チャネルとして機能する名前付きパイプ\Pipe\Net\NtControlPipeX(X はサービス イテレーションごとにインクリメントされる数値) が作成されます。サービス プロセスは関数を呼び出すことでパイプに接続しStartServiceCtrlDispatcher()、その後 SCM はサービスに「開始」コマンドを送信します。[ 7 ]
Windows Vistaでは、システムの起動に時間がかかる問題を解決し、遅延できない重要なサービスの起動を高速化するために、遅延自動起動サービスが追加されました。 [ 8 ]元々、サービスの初期化の自動起動方法は、他のアプリケーションやサービスが依存する重要なシステム サービス向けに設計されていました。SCM は、関数を呼び出すことで、遅延しない自動起動サービスをすべて処理した後でのみ、遅延サービスを初期化します。ScInitDelayStart()この関数は、対応するワーカー スレッドに関連付けられた遅延 (デフォルトでは 120 秒) の作業項目をキューに追加します。遅延後に初期化されること以外に、遅延サービスと遅延しないサービスに違いはありません。
Typeレジストリ値がSERVICE_KERNEL_DRIVERまたは であるサービスはSERVICE_FILE_SYSTEM_DRIVER特別に処理されます。これらはデバイスドライバを表し、適切なドライバ (通常は拡張子 のファイル)をロードする関数をScStartService()呼び出します。このドライバはディレクトリ内に配置されている必要があります。そのために、システムコールが呼び出され、 がSCM のプロセスに追加されます。ScLoadDeviceDriver().sys%SystemRoot%\System32\Drivers\NtLoadDriverSeLoadDriverPrivilege
SCMは、Windowsサービスとは全く関係のない追加機能を提供します。それは、 Windowsメッセージを ブロードキャストすることで、ネットワークドライブレター接続が作成または削除されたときに、WindowsエクスプローラなどのGUIアプリケーションに通知することです。WM_DEVICECHANGE