Componentes de servicios.3

Funciones del SCM

SCM se ejecuta dentro de Services.exe. Se inicia automáticamente en cuanto se carga el sistema operativo y se detiene cuando se procede al apagado del sistema. Se ejecuta con privilegios de system, y proporciona un medio unificado y seguro de control de aplicaciones de servicios. Es el responsable de contactar con los varios servicios y les ordena iniciar, parar, pausar, y seguir.

Iniciando servicios

SCM mantiene una base de datos de los servicios instalados y de los controladores de dispositivo en el registro. La BD se usa por SCM y por programas que añaden, modifican, o configuran servicios. La subclave del registro de esta BD es HKLM\SYSTEM\CurrentControlSet\Services.

Esta clave a su vez contiene otra por cada servicio y controlador instalado. El nombre de la subclave es la del nombre que tenía el servicio o controlador cuando SCM lo instaló.

Una copia inicial de la BD se crea durante la instalación de Windows Server 2003. Esta BD incluye todos los parámetros relacionados con los servicios definidos para un servicio, además de los campos que siguen el estado del servicio. Además, la BD contiene registros para los controladores de dispositivo necesarios durante el reinicio de sistema. El tipo de entradas se encuentran en el registro, en las subclaves del servicio bajo HKLM\SYSTEM\CurrentControlSet\Services. Hay cuatro valores que se aplican a los controladores de dispositivo:

  • 1 (SERVICE_KERNEL_DRIVER)
  • 2 (SERVICE_FILE_SYSTEM_DRIVER)
  • 3 (SERVICE_ADAPTER)
  • 8 (SERVICE_RECOGNIZER_DRIVER)

El valor de la entrada start determina sí y cuando se carga el servicio o controlador durante el arranque del sistema.

Iniciando los procesos del servicio

El camino que recorre el inicio de los procesos de un servicio es el siguiente:

  1. De forma inmediata invoca una función de servicio, StartServiceCrtlDispatcher, que acepta una lista de puntos de entrada en Services, con un punto de entrada por cada servicio en el proceso. Cada punto de entrada se identifica por el nombre del servicio al que el punto de entrada corresponde.
  2. StartServiceCtrlDispatcher crea una conexión de comunicación por conducto con nombre(calcado del inglés named pipe) para el SCM, y entonces entra en un bucle esperando la llegada de comandos por el conducto (pipe).
  3. SCM envía un comando de inicio-de-servicio cada vez que inicia un servicio. Por cada comando de inicio que recibe, la función crea un hilo, denominado hilo de servicio, para invocar el inicio del punto de entrada del servicio.
  4. StartServiceCtrlDispatcher espera indefinidamente comandos desde SCM y devuelve el control al proceso principal sólo cuando todos los hilos del proceso del servicio han terminado, permitiendo al proceso del servicio liberar los recursos antes de salir.
  5. La primera acción de un punto de entrada del servicio (rutina ServiceMain) es llamar a la API RegisterServiceCtrlHandler(Ex), con un puntero hacia la función Handler(Ex) del servicio. Esta función está diseñada para recibir y manejar mensajes de control enviados al servicio, que se pasan más adelante desde SCM.
  6. La función StartServiceCtrlDispatcher almacena la tabla en un proceso local de memoria, y el RegisterServiceCtrlHandler finaliza anunciándolo con el puntero HandlerEx del servicio y SERVICE_STATUS_HANDLE. El punto de entrada del servicio continua iniciando el servicio, que puede incluir alojamiento de memoria, puntos de finalización de creación de comunicaciones, y lecturas de datos de configuración privados en el registro. Una convención que la mayoría de servicios siguen es almacenar sus parámetros específicos-de-servicio en la subclave Parameters de su subclave del registro del servicio.
  7. Mientras el punto de entrada inicia el servicio, puede con periodicidad enviar mensajes de estado al SCM para indicar como va el progreso de inicio del servicio. Después de que el punto de entrada finalice el inicio, un hilo de servicio, normalmente, entra en un bucle esperando solicitudes de las aplicaciones cliente.

Un hilo principal de proceso del servicio, que se llama y se ejecuta dentro de StartServiceCtrlDispatcher, recibe comandos SCM dirigidos a servicios en el proceso y usa la tabla de funciones de handler de servicios para ubicar y llamar a la función del servicio responsable de responder al comando. Los comandos SCM incluyen comandos de parada, pausa, retoma, consulta, apaga y los definidos por las aplicaciones.

Published 20/10/2008 9:12 por Juansa
Archivado en:
Comparte este post: