Service Control Manager (SCM) is a special system process under the Windows NT family of operating systems, which starts, stops and interacts with Windows service processes. It is located in the %SystemRoot%\System32\services.exe
executable. Service processes interact with SCM through a well-defined API, and the same API is used internally by the interactive Windows service management tools such as the MMC snap-in Services.msc
and the command-line Service Control utility sc.exe
.
The SCM executable, Services.exe
, runs as a Windows console program and is launched by the Wininit process early during the system startup. Its main function, SvcCtrlMain()
, launches all the services configured for automatic startup. First an internal database of installed services is initialized by reading the following two registry keys:
In the next step, SCM's main function SvcCtrlMain()
calls the function ScGetBootAndSystemDriverState()
function which checks whether the device drivers that should be started during the boot or system startup were successfully loaded, and those that have failed to do so are stored in a list called ScFailedDrivers
. Then a named pipe \Pipe\Ntsvcs
is created as a remote procedure call interface between the SCM and the SCPs (Service Control Processes) that interact with specific services.
Next, it calls the ScAutoStartServices()
function which loops through all the services marked as auto-start, paying attention to the calculated load-order dependencies. In case of a circular dependency an error is noted and the service depending on a service that belongs to a group coming later in the load order is skipped. For delayed auto-start services, grouping has no effect, and those are loaded at a later stage of system startup.
For each service it wants to start, the SCM calls the ScStartService()
function which checks the name of the file that runs the service's process, ensuring that the account specified for the service is same as the account that the service process runs in. Every service that does not run in the System
account is logged in by calling the LSASS function LogonUserEx()
, for which LSASS process looks up "secret" passwords stored in the HKLM\SECURITY\Policy\Secrets\
registry key, which were stored by the SCP using the LsaStorePrivateData()
API, when the service was originally configured.