Gerente de control de servicios - Service Control Manager

Service Control Manager ( SCM ) es un proceso de sistema especial de la familia de sistemas operativos Windows NT , que se inicia, detiene e interactúa con los procesos de servicio de Windows . Se encuentra en el ejecutable. Los procesos de servicio interactúan con SCM a través de una API bien definida , y la misma API es utilizada internamente por las herramientas interactivas de administración de servicios de Windows, como el complemento MMC y la utilidad de control de servicio de línea de comandos . La terminación de este archivo se utiliza como método para provocar la pantalla azul de la muerte . %SystemRoot%\System32\services.exeServices.mscsc.exe

Implementación

El ejecutable de SCM Services.exe , se ejecuta como un programa de consola de Windows y el proceso Wininit lo inicia al principio del inicio del sistema . Su función principal SvcCtrlMain() , lanza todos los servicios configurados para inicio automático. Primero, se inicializa una base de datos interna de servicios instalados leyendo las siguientes dos claves de registro:

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List , que contiene los nombres y el orden de los grupos de servicios. La clave de registro de cada servicio contiene un Group valor opcional que rige el orden de inicialización de un servicio respectivo o un controlador de dispositivo , con respecto a otros grupos de servicios.
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services , que contiene la base de datos real de servicios y controladores de dispositivos y se lee en la base de datos interna de SCM. SCM lee el Group valor de cada servicio, así como las dependencias de orden de carga de sus claves de registro DependOnGroup y DependOnService .

En el siguiente paso, la función principal de SCM SvcCtrlMain() llama a la función de ScGetBootAndSystemDriverState() función que verifica si los controladores de dispositivo que deben iniciarse durante el arranque o el inicio del sistema se cargaron correctamente, y los que no lo hicieron se almacenan en una lista llamada ScFailedDrivers . Luego, se crea una tubería con nombre \Pipe\Ntsvcs como una interfaz de llamada de procedimiento remoto entre el SCM y los SCP (Procesos de control de servicios) que interactúan con servicios específicos.

A continuación, llama a la ScAutoStartServices() función que recorre todos los servicios marcados como inicio automático, prestando atención a las dependencias calculadas del orden de carga. En caso de una dependencia circular, se observa un error y se omite el servicio que depende de un servicio que pertenece a un grupo que viene más tarde en la orden de carga. Para los servicios de inicio automático retrasados, la agrupación no tiene ningún efecto y se cargan en una etapa posterior del inicio del sistema.

Para cada servicio que desea iniciar, el SCM llama a la ScStartService() función que verifica el nombre del archivo que ejecuta el proceso del servicio, asegurando que la cuenta especificada para el servicio sea la misma que la cuenta en la que se ejecuta el proceso del servicio. Cada servicio que lo hace no se ejecuta en la System cuenta se inicia la sesión llamando a la función LSASS LogonUserEx() , para lo cual el proceso LSASS busca contraseñas "secretas" almacenadas en la HKLM\SECURITY\Policy\Secrets\ clave de registro, que fueron almacenadas por el SCP usando la LsaStorePrivateData() API, cuando el servicio se configuró originalmente.

A continuación, ScLogonAndStartImage() se llama a la función para cada servicio cuyo proceso de servicio aún no se haya iniciado. Los procesos de servicio se crean en estado suspendido a través de la CreateProcessAsUser() API. Antes de que se reanude la ejecución del proceso de servicio, \Pipe\Net\NtControlPipeX se crea una tubería con nombre (donde X es un número incrementado para cada iteración de servicio) que sirve como canal de comunicación entre el SCM y el proceso de servicio. El proceso de servicio se conecta a la tubería llamando a la StartServiceCtrlDispatcher() función, después de lo cual el SCM envía al servicio un comando de "inicio".

Servicios de inicio automático retrasados

Se han agregado servicios de inicio automático demorado en Windows Vista , para resolver el problema de un inicio prolongado del sistema, así como para acelerar el inicio de servicios críticos que no se pueden demorar. Originalmente, el método de inicio automático de inicialización de servicios se diseñó para servicios esenciales del sistema de los que dependen otras aplicaciones y servicios. El SCM inicializa los servicios retrasados ​​solo después de manejar todos los servicios de inicio automático no retrasados, invocando la ScInitDelayStart() función. Esta función pone en cola un elemento de trabajo retrasado (120 segundos de forma predeterminada) asociado con un hilo de trabajo correspondiente. Aparte de la inicialización después de una demora, no existen otras diferencias entre los servicios demorados y no demorados.

Controladores de dispositivo

Servicios cuyo Type valor de registro es SERVICE_KERNEL_DRIVER o SERVICE_FILE_SYSTEM_DRIVER se manejan especialmente: estos representan controladores de dispositivos para los cuales ScStartService() llama la ScLoadDeviceDriver() función que carga el controlador apropiado (generalmente un archivo con extensión .sys ) que debe estar ubicado en el %SystemRoot%\System32\Drivers\ directorio. Para ello, se invoca la NtLoadDriver llamada al sistema y SeLoadDriverPrivilege se agrega al proceso del SCM.

Letras de unidad de red

SCM proporciona una funcionalidad adicional completamente ajena a los servicios de Windows: notifica a las aplicaciones GUI como el Explorador de Windows cuando se ha creado o eliminado una conexión de letra de unidad de red, mediante la transmisión de mensajes de Windows WM_DEVICECHANGE .

Ver también

Notas

Referencias