Especificar el orden de carga del controlador
Para la mayoría de los sistemas, la jerarquía física de los dispositivos de un equipo determina el orden en que Windows y el administrador de PnP cargan controladores. Windows y el administrador de PnP configuran dispositivos a partir del dispositivo raíz del sistema y, a continuación, configuran los dispositivos secundarios del dispositivo raíz (por ejemplo, un adaptador PCI), los elementos secundarios de esos dispositivos, etc. El administrador de PnP carga los controladores para cada dispositivo a medida que se configura el dispositivo, si los controladores no se cargaron previamente para otro dispositivo.
La configuración del archivo INF puede influir en el orden de carga del controlador. En este tema se describen los valores pertinentes que los proveedores deben especificar en la sección service-install-section a la que hace referencia la directiva ADDService de inf de un controlador. En concreto, en este tema se describen las entradas StartType, BootFlags, LoadOrderGroup y Dependencies .
Los controladores deben seguir estas reglas para especificar StartType:
El controlador PnP no es necesario al principio del arranque
Un controlador PnP debe tener un tipo de inicio de SERVICE_DEMAND_START (0x3), especificando que el administrador de PnP puede cargar el controlador cuando el administrador de PnP encuentra un dispositivo que los servicios de controlador.
Controlador para un dispositivo necesario para iniciar el equipo
Si se requiere un dispositivo para iniciar el equipo, los controladores del dispositivo deben tener un tipo de inicio de SERVICE_BOOT_START (0x0).
Controlador que no es de arranque que detecta dispositivos que no son enumerables PnP
Para un dispositivo que no es enumerable PnP, un controlador notifica el dispositivo al administrador de PnP mediante una llamada a IoReportRootDevice o IoReportDetectedDevice. Este controlador debe tener el tipo de inicio SERVICE_SYSTEM_START (0x01) para que Windows cargue el controlador durante la inicialización del sistema.
Solo los controladores que informan de hardware que no sea PnP deben establecer este tipo de inicio. Si un controlador atiende dispositivos PnP y no PnP, debe establecer este tipo de inicio.
Controlador que no es PnP que debe iniciar el administrador de control de servicio
Este controlador debe tener el tipo de inicio SERVICE_AUTO_START (0x02). Los controladores PnP no deben establecer este tipo de inicio.
Se debe escribir un controlador PnP para que se pueda cargar cuando Windows configura un dispositivo que los servicios de controlador. Por el contrario, un controlador debe poder descargarse cada vez que el administrador de PnP determina que ya no hay dispositivos presentes que los servicios del controlador. Los únicos pedidos de carga de controladores de los que deben depender los controladores PnP son los siguientes:
Los controladores de un dispositivo secundario pueden depender del hecho de que se cargan los controladores del dispositivo primario.
Un controlador de la pila de dispositivos puede depender del hecho de que se carguen los controladores debajo de él.
Por ejemplo, el controlador de función puede estar seguro de que se cargan los controladores de filtro inferior.
Sin embargo, tenga en cuenta que un controlador de la pila de dispositivos no puede depender de cargarse secuencialmente después de los controladores inferiores de un dispositivo, ya que es posible que el controlador se haya cargado anteriormente cuando se configuró otro dispositivo.
Los controladores de filtro de un grupo de filtros no pueden predecir su ordenación de carga. Por ejemplo, si un dispositivo tiene tres controladores de filtro superior registrados, esos tres controladores se cargarán después del controlador de función, pero se podrían cargar en cualquier orden dentro de su grupo de filtros superior.
Si un controlador tiene una dependencia de orden de carga explícita en otro controlador, esa dependencia se debe implementar a través de una relación primaria o secundaria. Un controlador para un dispositivo secundario puede depender de los controladores del dispositivo primario que se carga antes de cargar los controladores secundarios.
Para reforzar la importancia de establecer el valor StartType correcto, en la lista siguiente se describe cómo Windows y el administrador de PnP usan las entradas StartType en los archivos INF:
En el inicio del sistema, el cargador del sistema operativo carga controladores de tipo SERVICE_BOOT_START antes de transferir el control al kernel. Estos controladores están en memoria cuando el kernel obtiene el control.
Los controladores de arranque se cargan antes de configurar la mayoría de los dispositivos, por lo que la jerarquía de dispositivos no puede determinar su orden de carga. Los controladores de arranque pueden usar entradas inf LoadOrderGroup para ordenar su carga. El sistema operativo omite las entradas de dependencias inf para los controladores de arranque.
El administrador de PnP llama a las rutinas DriverEntry de los controladores de SERVICE_BOOT_START para que los controladores puedan atender los dispositivos de arranque.
Si un dispositivo de arranque tiene dispositivos secundarios, se enumeran esos dispositivos. Los dispositivos secundarios se configuran e inician si sus controladores también son controladores de arranque. Si los controladores de un dispositivo no son todos los controladores de arranque, el administrador de PnP crea un nodo de dispositivo (devnode) para el dispositivo, pero aún no inicia el dispositivo.
Después de que se hayan cargado todos los controladores de arranque y se inicien los dispositivos de arranque, el administrador de PnP configura el resto de los dispositivos PnP y carga sus controladores.
El administrador de PnP recorre el árbol de dispositivos y carga los controladores de los nodos de desarrollo que aún no se han iniciado (es decir, los nodos de desarrollo no iniciados del paso anterior). A medida que se inicia cada dispositivo, el administrador de PnP enumera los elementos secundarios del dispositivo, si los hay.
A medida que configura estos dispositivos, el administrador de PnP carga los controladores para los dispositivos, independientemente de los valores StartType de los controladores (excepto cuando StartType es SERVICE_DISABLED) antes de continuar con el inicio de los dispositivos. Muchos de estos controladores son controladores SERVICE_DEMAND_START.
El administrador de PnP omite las entradas del Registro que se crearon como resultado de las entradas de dependencias INF y las entradas loadOrderGroup para los controladores que carga en este paso. El orden de carga se basa en la jerarquía de dispositivos físicos.
Al final de este paso, todos los dispositivos están configurados, excepto los dispositivos que no son enumerables PnP y los descendientes de esos dispositivos. (Los descendientes pueden o no ser PnP-enumerable).
El administrador de PnP carga controladores de StartType SERVICE_SYSTEM_START que aún no están cargados.
Estos controladores detectan e informan de sus dispositivos que no son PnP. El administrador de PnP procesa las entradas del Registro que son el resultado de las entradas inf LoadOrderGroup para estos controladores. Omite las entradas del Registro que se crearon debido a las entradas de dependencias inf para estos controladores.
El administrador de control de servicios carga controladores de StartType SERVICE_AUTO_START que aún no están cargados.
El administrador de control de servicios procesa la información de la base de datos del servicio con respecto a DependOnGroup y DependOnServices de los servicios. Esta información procede de las entradas de dependencias en las entradas addService inf. Tenga en cuenta que la información de dependencias solo se procesa para controladores que no son PnP porque los controladores PnP necesarios se cargaron en un paso anterior del inicio del sistema. El administrador de control de servicio omite la información de INF LoadOrderGroup .
Consulte la documentación de Microsoft Windows SDK para obtener más información sobre el administrador de control de servicios.
Uso de BootFlags para promover el startType de un controlador en el arranque en función del escenario de arranque
El sistema operativo puede promover startType de un controlador para que sea un controlador de arranque en función del valor bootFlags especificado en el INF del controlador. Puede especificar uno o varios (ORed) de los siguientes valores numéricos en el archivo INF, expresados como un valor hexadecimal:
- Si se debe promover un controlador para que sea un controlador de inicio de arranque en el arranque de red, especifique 0x1 (CM_SERVICE_NETWORK_BOOT_LOAD).
- Si se debe promover un controlador al arrancar desde un disco duro virtual, especifique 0x2 (CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD)
- Si se debe promover un controlador durante el arranque desde un disco USB, especifique 0x4 (CM_SERVICE_USB_DISK_BOOT_LOAD).
- Si se debe promover un controlador durante el arranque desde el almacenamiento SD, especifique 0x8 (CM_SERVICE_SD_DISK_BOOT_LOAD)
- Si se debe promover un controlador durante el arranque desde un disco en un controlador USB 3.0, especifique 0x10 (CM_SERVICE_USB3_DISK_BOOT_LOAD).
- Si se debe promover un controlador durante el arranque con el arranque medido habilitado, especifique 0x20 (CM_SERVICE_MEASURED_BOOT_LOAD).
- Si se debe promover un controlador durante el arranque con el arranque del comprobador habilitado, especifique 0x40 (CM_SERVICE_VERIFIER_BOOT_LOAD).
- Si se debe promover un controlador en el arranque de WinPE, especifique 0x80 (CM_SERVICE_WINPE_BOOT_LOAD).
Para obtener más información sobre cómo promover startType de un controlador en el arranque, en función del escenario de arranque, vea Inf AddService directiva.