Gerente de controle de serviço

Gerente de controle de serviço

Em formação
Desenvolvido por Microsoft
Arquivo executável services.exe
Meio Ambiente janelas
Modelo controlador de demônio
Política de distribuição embutido no Windows

O componente Windows Service Control Manager (abrev. SCM ) é um servidor RPC que gerencia não apenas o início e a interrupção dos serviços do Windows, mas também a criação e exclusão desses serviços.

Ele é iniciado na inicialização do sistema operacional ( SO ) e é baseado em RPCs para que os serviços em questão possam estar em outro computador

As diferentes ações realizadas por services.exe são

services.exe mantém um banco de dados de serviços instalados no registro em HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services (campo de exemplo: startService ). O banco de dados é usado por services.exe e por programas que adicionam, modificam ou configuram serviços. Em particular, ele contém informações sobre as dependências entre os serviços.

Quando um serviço é iniciado, services.exe executa as seguintes etapas:

A execução de services.exe é tratada pelo processo wininit.exe

Implementação

O executável 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 (), inicia todos os serviços configurados para início automático. Primeiro, um banco de dados interno de serviços instalados é inicializado lendo as seguintes duas chaves de registro:

Na próxima etapa, a função principal do SCM, SvcCtrlMain () chama a função ScGetBootAndSystemDriverState () que verifica se os drivers de dispositivo a serem iniciados durante a inicialização ou inicialização do sistema foram carregados e aqueles que falharam são armazenados. Em uma lista chamada ScFailedDrivers . Em seguida, um pipe denominado \ Pipe \ Ntsvcs é criado como uma chamada de procedimento remoto \ Pipe \ Ntsvcs 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 itera por meio de todos os serviços marcados como inicialização automática, prestando atenção às dependências calculadas da ordem de carregamento. No caso de dependência circular, um erro é observado e o serviço dependente de um serviço pertencente a um grupo que vem posteriormente na ordem de carregamento é ignorado. Para serviços de início automático atrasado, o agrupamento não tem efeito e 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 está executando o processo do serviço, certificando-se de que a conta especificada para o serviço é a mesma conta na qual o processo do serviço está em execução. o serviço está em execução. serviço que não está sendo executado na conta do sistema é conectado chamando a função LogonUserEx (), para a qual o processo LSASS procura por senhas "secretas" armazenadas na chave de registro HKLM \ SECURITY \ Policy \ Secrets \, que foram armazenadas pelo SCP usando a API LsaStorePrivateData () durante a configuração inicial do serviço.

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 de retomar a execução do processo do serviço, um canal denominado \ Pipe \ Net \ NtControlPipeX (onde X é um número incrementado para cada iteração do serviço) é criado e serve como um canal de comunicação entre o SCM e o processo do serviço. O processo do serviço se conecta ao canal chamando a função StartServiceCtrlDispatcher (), após o qual o SCM emite um comando "iniciar" para o serviço.

Serviços de inicialização automática atrasados

Os serviços de início automático atrasado foram adicionados ao Windows Vista para resolver o problema de inicialização prolongada do sistema e para acelerar a inicialização de serviços críticos que não podem ser atrasados. [8] O método de inicialização do serviço autostart foi originalmente projetado para serviços de sistema críticos dos quais outros aplicativos e serviços dependem. O SCM inicializa serviços adiados somente depois de processar todos os serviços de inicialização automática não adiados, pela função ScInitDelayStart () ScInitDelayStart (). Esta função enfileira um item de trabalho atrasado (120 segundos por padrão) associado a um thread de trabalho correspondente. Além de ser inicializado após um atraso, não há outras diferenças entre os serviços atrasados ​​e não atrasados.

Drivers de dispositivo

Serviços cujo valor de registro Type é SERVICE_KERNEL_DRIVER ou SERVICE_FILE_SYSTEM_DRIVER são tratados especificamente: eles representam os drivers de dispositivo para os quais ScStartService () chama a função ScLoadDeviceDriver () que carrega o driver apropriado (geralmente um arquivo com uma extensão .sys)% SystemRoot% \ System32 \ Drivers \. Para isso, é feita a chamada de sistema NtLoadDriver e adicionado o SeLoadDriverPrivilege ao processo SCM.

Letras de unidade de rede

O SCM fornece funcionalidade adicional não relacionada aos serviços do Windows: ele notifica os aplicativos GUI, como o Windows Explorer, sobre a criação ou exclusão de uma conexão de letra de unidade de rede, transmitindo-os. Mensagens do Windows WM_DEVICECHANGE.

Referências

  1. Service Control Manager no MSDN
  2. wininit

Artigos relacionados