O Service Control Manager (SCM) é um processo especial dos sistemas operacionais Windows NT, que inicia, encerra e interage com os processos de serviço do Windows.[1] Ele está localizado no executável %SystemRoot%\System32\services.exe
. Os processos de serviço interagem com o SCM por meio de uma API bem definida e a mesma API é usada internamente pelas ferramentas interativas de gerenciamento de serviços do Windows, como o snap-in MMC Services.msc
e o utilitário de controle de linha de comando sc.exe
. Terminar este processo é usado como um método de causar a Tela Azul da Morte .
O executável do SCM, Services.exe
, é executado como um programa de console do Windows e é iniciado pelo processo Wininit no início da inicialização do sistema.[2] Sua função principal, SvcCtrlMain()
, lança todos os serviços configurados para inicialização automática. Primeiro, um banco de dados interno de serviços instalados é inicializado lendo as duas chaves de registro a seguir:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List
, contendo os nomes e a ordem dos grupos de serviços. A chave de registro de cada serviço contém um valor de Group
opcional que controla a ordem de inicialização de um respectivo serviço ou um driver de dispositivo em relação a outros grupos de serviços.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
, que contém o banco de dados de serviços e drivers de dispositivos e é carregado para o banco de dados interno do SCM.[3] O SCM lê o valor de Group
do serviço e a ordem de carregamento das dependências dos valores DependOnGroup
e DependOnService
.[4]Na próxima etapa, a função principal do SCM SvcCtrlMain()
chama a função ScGetBootAndSystemDriverState()
que verifica se os drivers de dispositivo que deveriam ser iniciados foram carregados com sucesso, e aqueles que falharam em fazer isso são armazenados em um lista chamada ScFailedDrivers
. Em seguida, um pipe nomeado \Pipe\Ntsvcs
é criado como uma interface de chamada de procedimento remoto entre o SCM e os SCPs (Processos de Controle de Serviço) que interagem com serviços específicos.
Em seguida, ele chama a função ScAutoStartServices()
que circula através de todos os serviços marcados como auto-start, prestando atenção às dependências de ordem carga calculada. No caso de uma dependência circular, um erro é observado e o serviço que depende de um serviço que pertence a um grupo vindo posteriormente na ordem de carregamento é ignorado. Para serviços de início automático atrasado, o agrupamento não tem efeito e esses são carregados em um estágio posterior da inicialização do sistema.[5]
Para cada serviço que deseja iniciar, o SCM chama a função ScStartService()
que verifica o nome do arquivo que executa o processo do serviço, garantindo que a conta especificada para o serviço seja igual à conta na qual o processo do serviço é executado. Todo serviço que não é executado na conta do System
é conectado chamando a função LSASS LogonUserEx()
, para a qual o processo LSASS procura senhas "secretas" armazenadas na chave de registro HKLM\SECURITY\Policy\Secrets\
, que foram armazenadas pelo SCP usando a API LsaStorePrivateData()
, quando o serviço foi originalmente configurado.[6]
Em seguida, a função ScLogonAndStartImage()
é chamada para cada serviço cujo processo de serviço ainda não foi iniciado. Os processos de serviço são criados em um estado suspenso por meio da API CreateProcessAsUser()
. Antes que a execução do processo de serviço seja retomada, um pipe nomeado \Pipe\Net\NtControlPipeX
(onde X é um número incrementado para cada iteração de serviço) é criado, que serve como um canal de comunicação entre o SCM e o processo de serviço. O processo de serviço se conecta ao pipe chamando a função StartServiceCtrlDispatcher()
, após o qual o SCM envia ao serviço um comando "start".[7]
Os serviços de início automático atrasado foram adicionados ao Windows Vista para resolver o problema de uma inicialização prolongada do sistema, bem como para acelerar o início de serviços críticos que não podem ser atrasados.[8] Originalmente, o método de inicialização automática da inicialização do serviço foi projetado para serviços de sistema essenciais dos quais outros aplicativos e serviços dependem. O SCM inicializa os serviços atrasados somente depois de manipular todos os serviços de início automático sem atraso, invocando a função ScInitDelayStart()
. Esta função enfileira um item de trabalho atrasado (120 segundos por padrão) associado a um segmento de trabalho correspondente. Além de ser inicializado após um atraso, não há outras diferenças entre serviços atrasados e não atrasados.
Os serviços cujo valor de registro Type
é SERVICE_KERNEL_DRIVER
ou SERVICE_FILE_SYSTEM_DRIVER
são tratados especialmente: eles representam os drivers de dispositivo para os quais o ScStartService()
chama a função ScLoadDeviceDriver()
que carrega o driver apropriado (geralmente um arquivo com extensão .sys
) que deve estar localizado no diretório %SystemRoot%\System32\Drivers\
. Para isso, a chamada do sistema NtLoadDriver
é invocada e o SeLoadDriverPrivilege
é adicionado ao processo do SCM.
O SCM fornece uma funcionalidade adicional completamente não relacionada aos serviços do Windows: ele notifica os aplicativos de GUI, como o Windows Explorer, quando uma conexão de letra de unidade de rede foi criada ou excluída, transmitindo mensagens do Windows WM_DEVICECHANGE
.