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

[editar | editar código-fonte]

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]

Serviços de início automático atrasado

[editar | editar código-fonte]

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

[editar | editar código-fonte]

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

[editar | editar código-fonte]

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 .

Referências