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.[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 .
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.[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 deGroupopcional 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 deGroupdo serviço e a ordem de carregamento das dependências dos valoresDependOnGroupeDependOnService.[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]
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.[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.
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 .
Ver também
- Serviço do Windows
- Lista de serviços do Windows
- Gerenciamento de serviços do sistema operacional
- svchost.exe
Referências
- Russinovich, Solomon & Ionescu 2009, p. 79
- Russinovich, Solomon & Ionescu 2009, p. 291
- «Database of Installed Services». Microsoft Developer Network
- Russinovich, Solomon & Ionescu 2009, p. 292
- Russinovich, Solomon & Ionescu 2009, p. 294
- Russinovich, Solomon & Ionescu 2009, p. 295
- Russinovich, Solomon & Ionescu 2009, p. 296
- Russinovich, Solomon & Ionescu 2009, p. 297
- Russinovich, Mark; Solomon, David; Ionescu, Alex (2009), Windows® Internals, ISBN 0-7356-2530-1 5th ed. , Microsoft Press