知識ベース

サービスコントロールマネージャー

サービスコントロールマネージャーSCM )は、Windows NTファミリーのオペレーティングシステムの下にある特別なシステムプロセスであり、Windowsサービスプロセスを開始、停止、および対話します。 %SystemRoot%\ System32 \ services.exe実行可能ファイルにあります。サービスプロセスは、明確に定義されたAPIを介してSCMと対話し、MMCスナップインServices.mscやコマンドラインサービスコントロールユーティリティsc.exeなどの対話型Windowsサービス管理ツールによって同じAPIが内部的に使用されます。このファイルを終了することは、死のブルースクリーンを引き起こす方法として使用されます。

実装

SCM実行可能ファイル、Services.exeは、Windowsコンソールプログラムとして実行され、システムの起動中の早い段階でWininitプロセスによって起動されます。その主な機能であるSvcCtrlMain()は、自動起動用に設定されたすべてのサービスを起動します。最初に、インストールされたサービスの内部データベースは、次の2つのレジストリキーを読み取ることによって初期化されます。

  • HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ ServiceGroupOrder \ List。サービスグル​​ープの名前と順序が含まれています。各サービスのレジストリキーには、他のサービスグル​​ープに関して、各サービスまたはデバイスドライバーの初期化の順序を管理するオプションのGroup値が含まれています。
  • HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services。サービスとデバイスドライバーの実際のデータベースが含まれ、SCMの内部データベースに読み込まれます。 SCMは、DependOnGroupおよびDependOnServiceレジストリキーからすべてのサービスのグループ値と読み込み順序の依存関係を読み取ります。

次のステップで、SCMのメイン関数SvcCtrlMain()は、ScGetBootAndSystemDriverState()関数を呼び出します。この関数は、起動中またはシステム起動中に起動するデバイスドライバーが正常にロードされたかどうかを確認し、そうしなかったドライバーがScFailedDriversと呼ばれるリスト。次に、名前付きパイプ\ Pipe \ Ntsvcsが、特定のサービスと対話するSCMとSCP(サービスコントロールプロセス)間のリモートプロシージャコールインターフェイスとして作成されます。

次に、自動起動としてマークされたすべてのサービスをループ処理するScAutoStartServices()関数を呼び出し、計算された負荷順序の依存関係に注意を払います。循環依存の場合、エラーが記録され、ロード順で後から来るグループに属するサービスに依存するサービスはスキップされます。遅延自動開始サービスの場合、グループ化は効果がなく、それらはシステム起動の後の段階でロードされます。

開始するサービスごとに、SCMはScStartService()関数を呼び出し、サービスのプロセスを実行するファイルの名前を確認し、サービスに指定されたアカウントがサービスプロセスが実行されるアカウントと同じであることを確認します。システムアカウントで実行されないサービスは、LSASSプロセスLogonUserEx()を呼び出すことでログインします。LSASSプロセスは、サービスが最初に構成されたときに、LsaStorePrivateData()APIを使用するSCP。

次に、サービスプロセスがまだ起動されていないすべてのサービスに対してScLogonAndStartImage()関数が呼び出されます。サービスプロセスは、CreateProcessAsUser()APIを介して一時停止状態で作成されます。サービスプロセスの実行が再開される前に、SCMとサービスプロセス間の通信チャネルとして機能する名前付きパイプ\ Pipe \ Net \ NtControlPipeX(Xはサービスの反復ごとにインクリメントされる番号)が作成されます。サービスプロセスは、StartServiceCtrlDispatcher()関数を呼び出してパイプに接続します。その後、SCMはサービスに「開始」コマンドを送信します。

遅延自動開始サービス

遅延した自動開始サービスがWindows Vistaに追加され、システムの長時間にわたる起動の問題を解決し、遅延できない重要なサービスの開始を高速化しました。もともと、サービスの初期化の自動開始方法は、他のアプリケーションやサービスが依存する重要なシステムサービス用に設計されました。 SCMは、ScInitDelayStart()関数を呼び出して、すべての非遅延自動開始サービスを処理した後にのみ、遅延サービスを初期化します。この関数は、対応するワーカースレッドに関連付けられた遅延(デフォルトでは120秒)作業項目をキューに入れます。遅延後に初期化される以外、遅延サービスと非遅延サービスには違いはありません。

デバイスドライバ

Typeレジストリ値がSERVICE_KERNEL_DRIVERまたはSERVICE_FILE_SYSTEM_DRIVERであるサービスは特別に処理されます。これらは、ScStartService()が適切なドライバー(通常は拡張子.sysのファイル)をロードするScLoadDeviceDriver()関数を呼び出すデバイスドライバーを表します。 SystemRoot%\ System32 \ Drivers \ディレクトリ。そのために、NtLoadDriverシステムコールが呼び出され、SeLoadDriverPrivilegeがSCMのプロセスに追加されます。

ネットワークドライブ文字

SCMは、Windowsサービスとはまったく関係のない追加機能を提供します。WindowsドライブWM_DEVICECHANGEをブロードキャストすることにより、ネットワークドライブと文字の接続が作成または削除されたときに、WindowsエクスプローラーなどのGUIアプリケーションに通知します。