# Gerenciador de Controle de Serviços

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. 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 .

## Implementação

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. 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. O SCM lê o valor de Group do serviço e a ordem de carregamento das dependências dos valores DependOnGroup e DependOnService.
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.
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.
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".

### Serviços de início automático atrasado

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. 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.

### Drivers de dispositivos

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.

### Letras de unidade de rede

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 .