Eventos de gatilho de serviço
Um serviço pode se registrar para ser iniciado ou interrompido quando ocorre um evento de gatilho. Isso elimina a necessidade de os serviços serem iniciados quando o sistema for iniciado ou que os serviços pesquisem ou aguardem ativamente por um evento; um serviço pode começar quando necessário, em vez de iniciar automaticamente se há ou não trabalho a ser feito. Exemplos de eventos de gatilho predefinidos incluem a chegada de um dispositivo de uma classe de interface do dispositivo especificada ou a disponibilidade de uma porta de firewall específica. Um serviço também pode se registrar para um evento de gatilho personalizado gerado por um provedor ETW (Rastreamento de Eventos para Windows).
Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: não há suporte para eventos de gatilho do Serviço até o Windows Server 2008 R2 e o Windows 7.
Um gatilho consiste em um tipo de evento de gatilho, um subtipo de evento de gatilho, a ação a ser tomada em resposta ao evento de gatilho e (para determinados tipos de evento de gatilho) um ou mais itens de dados específicos do gatilho. O subtipo e os itens de dados específicos do gatilho juntos especificam as condições para notificar o serviço do evento. O formato de um item de dados depende do tipo de evento de gatilho; um item de dados pode ser dados binários, uma cadeia de caracteres ou uma multicadeia de caracteres. As cadeias de caracteres devem ser Unicode; Não há suporte para cadeias de caracteres ANSI.
Para se registrar em eventos de gatilho, o serviço chama ChangeServiceConfig2 com SERVICE_CONFIG_TRIGGER_INFO e fornece uma estrutura SERVICE_TRIGGER_INFO. A estrutura SERVICE_TRIGGER_INFO aponta para uma matriz de estruturas SERVICE_TRIGGER, cada uma especificando um gatilho.
A ação de gatilho especificada será executada se a condição de gatilho for verdadeira quando o sistema for iniciado ou se a condição de gatilho se tornar verdadeira enquanto o sistema estiver em execução. Por exemplo, se um serviço se registrar para ser iniciado quando um determinado dispositivo estiver disponível, o serviço será iniciado quando o sistema for iniciado se o dispositivo já estiver conectado ao computador; o serviço é iniciado quando o dispositivo chega se o usuário conecta o dispositivo enquanto o sistema está em execução.
Se um gatilho tiver itens de dados específicos do gatilho, a ação de gatilho será executada somente se o item de dados que acompanha o evento de gatilho corresponder a um dos itens de dados especificados pelo serviço com o gatilho. A correspondência de dados binários é feita por comparação bit a bit. A correspondência de cadeia de caracteres não diferencia maiúsculas de minúsculas. Se o item de dados for uma multicadeia de caracteres, todas as cadeias de caracteres na multistring deverão corresponder.
Quando um serviço é iniciado em resposta a um evento de gatilho, o serviço recebe SERVICE_TRIGGER_STARTED_ARGUMENT como argv[1] em sua função de retorno de chamada ServiceMain. Argv[0] é sempre o nome curto do serviço.
Um serviço que se registra para ser iniciado em resposta a um evento de gatilho pode parar após um tempo limite ocioso quando o serviço não tem trabalho a fazer. Um serviço que para por si só deve estar preparado para lidar com solicitações de controle SERVICE_CONTROL_TRIGGEREVENT que chegam enquanto o serviço está parando sozinho. O SCM envia uma solicitação de controle SERVICE_CONTROL_TRIGGEREVENT sempre que um novo evento de gatilho ocorre enquanto o serviço está no estado em execução. Para evitar a perda de eventos de gatilho, o serviço deve retornar ERROR_SHUTDOWN_IN_PROGRESS para qualquer solicitação de controle de SERVICE_CONTROL_TRIGGEREVENT que chegue enquanto o serviço está fazendo a transição de execução para interrompido. Isso instrui o SCM a enfileirar eventos de gatilho e aguardar o serviço entrar no estado parado. Em seguida, o SCM executa a ação associada ao evento de gatilho na fila, como iniciar o serviço.
Quando o serviço estiver pronto para lidar com eventos de gatilho novamente, ele define SERVICE_ACCEPT_TRIGGEREVENT em sua máscara aceita por controles em uma chamada para SetServiceStatus. Isso geralmente é feito quando o serviço chama SetServiceStatus com SERVICE_RUNNING. O SCM emite uma solicitação SERVICE_CONTROL_TRIGGEREVENT para cada evento de gatilho na fila até que a fila esteja vazia.
Um serviço que tem serviços dependentes em execução não pode ser interrompido em resposta a um evento de gatilho.
As solicitações de inicialização e de gatilho não são garantidas em condições de memória baixas.
Use a funçãoQueryServiceConfig2 para recuperar a configuração de evento de gatilho de um serviço.
A ferramenta SC (sc.exe) pode ser usada para configurar ou consultar eventos de gatilho de um serviço no prompt de comando. Use a opção triggerinfo para configurar um serviço para iniciar ou parar em resposta a um evento de gatilho. Use a opção qtriggerinfo para consultar a configuração de gatilho de um serviço.
O exemplo a seguir consulta a configuração de gatilho do serviço W32time, que é configurado para iniciar quando o computador é ingressado em um domínio e para quando o computador sai do domínio.
C:\>sc qtriggerinfo w32time
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: w32time
START SERVICE
DOMAIN JOINED STATUS : 1ce20aba-9851-4421-9430-1ddeb766e809 [DOMAIN JOINED]
STOP SERVICE
DOMAIN JOINED STATUS : ddaf516e-58c2-4866-9574-c3b615d42ea1 [NOT DOMAIN JOINED]
O exemplo a seguir consulta a configuração de gatilho do serviço de entrada do tablet, que está configurado para iniciar quando um dispositivo HID com o GUID {4d1e55b2-f16f-11cf-88cb-001111000030} e qualquer uma das IDs de dispositivo HID especificadas chega.
C:\>sc qtriggerinfo tabletinputservice
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: tabletinputservice
START SERVICE
DEVICE INTERFACE ARRIVAL : 4d1e55b2-f16f-11cf-88cb-001111000030 [INTERFACE CLASS GUID]
DATA : HID_DEVICE_UP:000D_U:0001
DATA : HID_DEVICE_UP:000D_U:0002
DATA : HID_DEVICE_UP:000D_U:0003
DATA : HID_DEVICE_UP:000D_U:0004