# Svchost.exe

O svchost.exe (Host de Serviço ou SvcHost) é um processo do sistema que pode hospedar de um a vários serviços na família de sistemas operacionais Windows NT. O Svchost é essencial na implementação dos chamados processos de serviços compartilhados, nos quais vários serviços podem compartilhar um processo para reduzir o consumo de recursos. Agrupar vários serviços em um único processo conserva recursos computacionais e isso foi particularmente importante para os projetistas do NT, pois criar processos do Windows leva mais tempo e consome mais memória do que em outros sistemas operacionais, como por exemplo, os da família Unix.. No entanto, se um dos serviços causar uma exceção não tratada, todo o processo poderá falhar. Além disso, a identificação dos serviços componentes pode ser mais difícil para os usuários finais. Problemas com vários serviços hospedados, particularmente com o Windows Update, são reportados por usuários (e divulgados pela imprensa) como envolvendo svchost.
O processo svchost foi introduzido no Windows 2000, embora o suporte subjacente para processos de serviços compartilhados tenha existido desde o Windows NT 3.1.

## Implementação

Sua imagem executável, localizada em %SystemRoot%\System32\Svchost.exe ou %SystemRoot%\SysWOW64\Svchost.exe (para serviços de 32 bits executados em sistemas de 64 bits) é executada em várias instâncias, cada uma hospedando um ou mais serviços.
Serviços executados no SvcHost são implementados como bibliotecas vinculadas dinamicamente (DLLs). As chaves de registro desses serviços devem ter um valor chamado ServiceDll na subchave Parameters, apontando para o arquivo DLL do respectivo serviço. A definição do seu valor de ImagePath ocorre na forma %SystemRoot%\System32\svchost.exe -k (grupo de serviço; ex. netsvcs). Os serviços que compartilham o mesmo processo SvcHost especificam o mesmo parâmetro, tendo uma única entrada no banco de dados do Gerenciador de Controle de Serviços (SCM). A primeira vez que um processo SvcHost é iniciado com um parâmetro específico, ele procura por um valor com o mesmo nome na chave HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost, a qual ele interpreta como uma lista de nomes de serviços. Em seguida, ele notifica o SCM de todos os serviços que ele hospeda. O SCM não inicia um segundo processo SvcHost para qualquer um desses serviços recebidos, em vez disso ele simplesmente envia um comando "start" para o respectivo processo SvcHost contendo o nome do serviço que deve ser lançado em seu contexto e cuja respectiva DLL o SvcHost carrega.
De acordo com uma apresentação MS de 2003, o mínimo conjunto de trabalho de um serviço compartilhado é de aproximadamente 150 KB versus 800 KB para um processo autônomo.

### Tags de serviço

A partir do Windows Vista, a identificação interna de serviços dentro de processos compartilhados (incluindo o svchost) é obtida pelas chamadas tags de serviço. A tag de serviço para cada thread é armazenada no SubProcessTag do seu thread information block (TEB). A tag é propagada em todas as threads que a thread de serviço principal inicia subsequentemente, exceto para threads criadas indiretamente pelas APIs do pool de threads do Windows.
O conjunto de rotinas de gerenciamento de tags de serviço é atualmente uma API não documentada, embora seja usada por alguns utilitários do Windows, como o netstat, para exibir as conexões TCP associadas a cada serviço. Algumas ferramentas de terceiros, como ScTagQuery, também fazem uso dessa API.

### Svchost.exe (netsvcs)

Netsvcs é um subprocesso usado pelo svchost.exe (netsvcs). Se houver um vazamento de memória, o svchost.exe consome e congestiona a CPU. Esse problema ocorre porque ocorre um vazamento de identificador no serviço Winmgmt após a instalação do Windows Management Framework 3.0 no computador. O serviço Winmgmt é o serviço Windows Management Instrumentation (WMI) dentro do processo svchost.exe que está sendo executado na conta LocalSystem.

## Identificação e gerenciamento de serviços hospedados

No Windows XP e em edições posteriores, o comando tasklist /svc inclui uma lista de serviços de componentes em cada processo.
No Windows Vista e Windows 7, uma guia "Serviços" no Gerenciador de Tarefas do Windows inclui uma lista de serviços e seus grupos e IDs de Processo (PIDs); clicar com o botão direito do mouse em uma instância do svchost no Gerenciador de Tarefas e selecionar "Ir para o(s) serviço(s)" também alterna para a lista de serviços e seleciona adicionalmente os serviços executados na instância svchost correspondente.
No Windows 8, a interface do Gerenciador de Tarefas foi simplificada para que cada entrada svchost possa ser expandida com um único clique para uma sub-lista de serviços em execução dentro dela.
O Sysinternals Process Explorer da Microsoft também fornece informações sobre serviços executados em processos svchost.exe quando o usuário passa o mouse sobre a instância svchost.
Nenhum dos métodos acima permite que o usuário identifique qual dos vários serviços em execução dentro de uma instância svchost aloca um recurso específico, por exemplo, processador, disco, rede ou memória; o Monitor de Recursos do Windows apenas contabiliza a maioria desses recursos na granularidade de processos. No entanto, contabiliza pelo uso do processador na granularidade de serviços indo para a guia "CPU". Uma lista de conexões TCP e portas UDP com reconhecimento de serviço pode ser obtida usando o comando netstat -b.
Para solucionar outros tipos de problemas com um serviço em execução dentro de uma instância svchost, o serviço (ou serviços suspeitos de estarem causando o problema) deve ser (todos) reconfigurado para que cada um seja executado dentro de sua própria instância svchost. Por exemplo, sc config foo type=own irá reconfigurar o serviço chamado "foo" para executar sua própria instância de svchost. Alterar o tipo de volta para compartilhado é feito por um comando análogo. O serviço deve ser reiniciado para que esse tipo de alteração entrar em vigor. Este processo de depuração não é infalível no entanto; em alguns casos, um heisenbug pode acontecer, o que faz com que o problema desapareça quando o serviço está sendo executado separadamente.
Um método mais complexo de solução de problemas é criar um grupo de serviços isolado.
No Windows 10, a partir do release 1703, o svchost foi refatorado pela Microsoft para hospedar apenas um serviço por processo, dependendo da especificação do sistema. A configuração padrão faz com que os serviços sejam hospedados independentemente quando o sistema tiver pelo menos 3.5GB de RAM.