Agregar un dispositivo PnP a un sistema en ejecución
En esta sección se describe la secuencia de eventos que se producen cuando el sistema configura un dispositivo PnP que un usuario ha agregado a una máquina en ejecución. En esta explicación se resaltan los roles del administrador de PnP, los controladores de autobús y los controladores de función y filtro para enumerar y configurar un nuevo dispositivo.
La mayoría de esta explicación también es relevante para configurar un dispositivo PnP que está presente cuando se arranca la máquina. En concreto, los dispositivos cuyos controladores están marcados SERVICE_DEMAND_START en un archivo INF se configuran básicamente de la misma manera si el dispositivo se agrega dinámicamente o está presente en tiempo de arranque.
En la ilustración siguiente se muestran los primeros pasos para configurar el dispositivo, empezando desde cuando el usuario conecta el hardware a la máquina.
Las notas siguientes corresponden a los números en círculo de la ilustración anterior:
Un usuario conecta un dispositivo PnP a una ranura libre en un bus PnP.
En este ejemplo, el usuario conecta un joystick USB PnP al concentrador en un controlador host USB. El concentrador USB es un dispositivo de bus PnP porque los dispositivos secundarios se pueden conectar a él.
El controlador de función para el dispositivo bus determina que un nuevo dispositivo está en su bus.
La forma en que el controlador determina esto depende de la arquitectura del bus. Para algunos autobuses, el controlador de función del bus recibe una notificación de conexión activa de los nuevos dispositivos. Si el bus no admite la notificación de conexión activa, el usuario debe tomar las medidas adecuadas en Panel de control para que se enumere el bus.
En este ejemplo, el bus USB admite la notificación de conexión activa para que el controlador de función del bus USB reciba una notificación de que sus elementos secundarios han cambiado.
El controlador de función del dispositivo bus notifica al administrador de PnP que su conjunto de dispositivos secundarios ha cambiado.
El controlador de función notifica al administrador de PnP llamando a IoInvalidateDeviceRelations con un tipo de BusRelations.
El administrador de PnP consulta los controladores del autobús para obtener la lista actual de dispositivos en el bus.
El administrador de PnP envía una solicitud de IRP_MN_QUERY_DEVICE_RELATIONS a la pila de dispositivos del bus. El valor Parameters.QueryDeviceRelations.Type es BusRelations, lo que indica que el administrador de PnP solicita la lista actual de dispositivos presentes en el bus (relaciones de bus).
El administrador de PnP envía el IRP al controlador superior de la pila de dispositivos para el bus. Según las reglas de los IRP de PnP, cada controlador de la pila controla el IRP, si procede, y pasa el IRP al siguiente controlador.
El controlador de función del dispositivo bus controla el IRP.
Consulte la página de referencia de IRP_MN_QUERY_DEVICE_RELATIONS para obtener información detallada sobre cómo controlar este IRP.
En este ejemplo, el controlador del concentrador USB controla este IRP para el FDO del concentrador. El controlador del concentrador crea un PDO para el dispositivo de joystick e incluye un puntero al que se hace referencia al PDO del joystick en su lista de dispositivos secundarios devueltos con el IRP.
Cuando el controlador de bus primario del concentrador USB (la clase del controlador del host USB o el par de controladores de miniclase) completa el IRP, el IRP recorre la copia de seguridad de la pila del dispositivo mediante cualquier rutina de IoCompletion registrada por los controladores del concentrador.
Tenga en cuenta que el controlador de función de bus notifica un cambio en su lista de elementos secundarios solicitando que el administrador de PnP consulte su lista de dispositivos secundarios. Todos los controladores del dispositivo de autobús ven la solicitud de IRP_MN_QUERY_DEVICE_RELATIONS resultante. Normalmente, el controlador de función de bus es el único controlador para controlar el IRP y notificar elementos secundarios. En algunas pilas de dispositivos, hay un controlador de filtro de bus presente y participa en la construcción de la lista de relaciones de autobús. Un ejemplo es ACPI, que se conecta como un controlador de filtro de bus para dispositivos ACPI. En algunas pilas de dispositivos, los controladores de filtro que no son de bus controlan la solicitud de IRP_MN_QUERY_DEVICE_RELATIONS , pero esto no es típico.
En este momento, el administrador de PnP tiene la lista actual de dispositivos en el bus. A continuación, el administrador de PnP determina si se han llegado a algún dispositivo o se han quitado. En este ejemplo, hay un nuevo dispositivo. En la ilustración siguiente se muestra el administrador de PnP que crea un devnode para el nuevo dispositivo y comienza a configurar el dispositivo.
Las notas siguientes corresponden a los números en círculo de la ilustración anterior:
El administrador de PnP crea devnodes para los nuevos dispositivos secundarios del bus.
El administrador de PnP compara la lista de relaciones de autobús devueltas en el IRP de IRP_MN_QUERY_DEVICE_RELATIONS con la lista de elementos secundarios del autobús registrado actualmente en el árbol de dispositivos PnP. El administrador de PnP crea un nodo dev para cada dispositivo nuevo e inicia el procesamiento de eliminación de los dispositivos que se han quitado.
En este ejemplo, hay un nuevo dispositivo (un joystick), por lo que el administrador de PnP crea un devnode para el joystick. En este momento, el único controlador configurado para el joystick es el controlador principal del bus del concentrador USB, que creó el PDO del joystick. Los controladores de filtro de bus opcionales también estarían presentes en la pila de dispositivos, pero en el ejemplo se omiten los controladores de filtro de bus para simplificar.
La flecha ancha entre los dos nodos de desarrollo de la ilustración anterior indica que el devnode del joystick es un elemento secundario del nodo devnode del concentrador USB.
El administrador de PnP recopila información sobre el nuevo dispositivo y comienza a configurar el dispositivo.
El administrador de PnP envía una secuencia de IRP a la pila de dispositivos para recopilar información sobre el dispositivo. En este momento, la pila de dispositivos consta de solo el PDO creado por el controlador de bus primario del dispositivo y filtra los DO para los controladores de filtro de bus opcionales. Por lo tanto, el controlador de autobús y los controladores de filtro de autobús son los únicos conductores que responden a estos IRP. En este ejemplo, el único controlador de la pila de dispositivos de joystick es el controlador primario del bus, el controlador del concentrador USB.
El administrador de PnP recopila información sobre un nuevo dispositivo mediante el envío de IRP a la pila de dispositivos. Estos IRP incluyen lo siguiente:
IRP_MN_QUERY_ID, un IRP independiente para cada uno de los siguientes tipos de identificadores de hardware:
BusQueryDeviceID
BusQueryInstanceID
BusQueryHardwareIDs
BusQueryCompatibleIDs
BusQueryContainerID
IRP_MN_QUERY_DEVICE_TEXT, un IRP independiente para cada uno de los siguientes elementos:
DeviceTextDescription
DeviceTextLocationInformation
El administrador de PnP envía los IRP enumerados anteriormente en esta fase de procesamiento de un nuevo dispositivo PnP, pero no necesariamente en el orden indicado, por lo que no debe realizar suposiciones sobre el orden en que se envían los IRP. Además, no debe suponer que el administrador de PnP envía solo los IRP enumerados anteriormente.
El administrador de PnP comprueba el registro para determinar si el dispositivo se ha instalado anteriormente en este equipo. El administrador de PnP comprueba si hay una < subclave enumerador>\<deviceID> para el dispositivo en la rama Enumeración. En este ejemplo, el dispositivo es nuevo y debe configurarse "desde cero".
El administrador de PnP almacena información sobre el dispositivo en el registro.
La rama Enum del Registro está reservada para su uso por parte de los componentes del sistema operativo y su diseño está sujeto a cambios. Los escritores de controladores deben usar rutinas del sistema para extraer información relacionada con los controladores. No acceda a la rama Enum directamente desde un controlador. La siguiente información de enumeración se muestra solo con fines de depuración.
El administrador de PnP crea una subclave para el dispositivo bajo la clave del enumerador del dispositivo.
El administrador de PnP crea una subclave denominada HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceID>. Crea la subclave del <enumerador> si aún no existe.
Un enumerador es un componente que detecta dispositivos PnP basados en un estándar de hardware PnP. Las tareas de un enumerador se llevan a cabo mediante un conductor de autobús PnP en colaboración con el administrador de PnP. Normalmente, un dispositivo se enumera mediante su controlador de bus primario, como PCI o PCMCIA. Algunos dispositivos se enumeran mediante un controlador de filtro de bus, como ACPI.
El administrador de PnP crea una subclave para esta instancia del dispositivo.
Si Capabilities.UniqueID se devuelve como TRUE para IRP_MN_QUERY_CAPABILITIES, el identificador único del dispositivo es único en todo el sistema. Si no es así, el administrador de PnP modifica el identificador para que sea único en todo el sistema.
El administrador de PnP crea una subclave denominada HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceIDinstanceID>>\<.
El administrador de PnP escribe información sobre el dispositivo en la subclave de la instancia del dispositivo.
El administrador de PnP almacena información, incluida la siguiente, si se proporcionó para el dispositivo:
DeviceDesc : desde IRP_MN_QUERY_DEVICE_TEXT
Ubicación : desde IRP_MN_QUERY_DEVICE_TEXT
Funcionalidades : las marcas de IRP_MN_QUERY_CAPABILITIES
UINumber : de IRP_MN_QUERY_CAPABILITIES
HardwareID : de IRP_MN_QUERY_ID
Id. compatibles : de IRP_MN_QUERY_ID
ContainerID : de IRP_MN_QUERY_ID
LogConf\BootConfig : desde IRP_MN_QUERY_RESOURCES
LogConf\BasicConfigVector : desde IRP_MN_QUERY_RESOURCE_REQUIREMENTS
En este momento, el administrador de PnP está listo para localizar el controlador de función y filtrar controladores para el dispositivo, si existe. (Consulte la ilustración siguiente).
Las notas siguientes corresponden a los círculos numerados de la figura anterior:
El administrador de PnP en modo kernel se coordina con los componentes de configuración de modo usuario y administrador de PnP en modo de usuario para buscar la función y filtrar los controladores del dispositivo, si hay alguno.
El administrador PnP en modo kernel pone en cola un evento al administrador PnP en modo de usuario, identificando un dispositivo que debe instalarse. Una vez que un usuario con privilegios inicia sesión, los componentes en modo de usuario continúan con la búsqueda de controladores. Consulte la introducción a la instalación de dispositivos Para obtener información sobre los componentes de instalación y su rol en la instalación de un dispositivo.
Los componentes del programa de instalación en modo de usuario dirigen el administrador de PnP en modo kernel para cargar la función y los controladores de filtro.
Los componentes del modo de usuario vuelven a llamar al modo kernel para que se carguen los controladores, lo que hace que se llame a sus rutinas AddDevice .
En la ilustración siguiente se muestra el administrador de PnP que carga los controladores (si procede), la llamada a sus rutinas AddDevice y la dirección de los controladores para iniciar el dispositivo.
Las notas siguientes corresponden a los círculos numerados de la figura anterior:
Controladores de filtro inferior
Antes de que el controlador de función se conecte a la pila de dispositivos, el administrador de PnP procesa los controladores de filtro inferior. Para cada controlador de filtro inferior, el administrador de PnP llama a la rutina DriverEntry del controlador si el controlador aún no está cargado. A continuación, el administrador de PnP llama a la rutina AddDevice del controlador. En su rutina AddDevice , el controlador de filtro crea un objeto de dispositivo de filtro (DO de filtro) y lo asocia a la pila de dispositivos (IoAttachDeviceToDeviceStack). Una vez que conecta su objeto de dispositivo a la pila de dispositivos, el controlador se activa como controlador para el dispositivo.
En el ejemplo del joystick USB, hay un controlador de filtro inferior para el dispositivo.
Controlador de función
Una vez conectados los filtros inferiores, el administrador de PnP procesa el controlador de función. El administrador de PnP llama a la rutina DriverEntry del controlador de función si el controlador aún no está cargado y llama a la rutina AddDevice del controlador de función. El controlador de función crea un objeto de dispositivo de función (FDO) y lo asocia a la pila de dispositivos.
En este ejemplo, el controlador de función para el joystick USB es realmente un par de controladores: el controlador de clase HID y el controlador de miniclase HID. Los dos controladores funcionan juntos para servir como controlador de función. El par de controladores crea solo un FDO y lo asocia a la pila de dispositivos.
Controladores de filtro superior
Una vez conectado el controlador de función, el administrador de PnP procesa los controladores de filtro superior.
En este ejemplo, hay un controlador de filtro superior para el dispositivo.
Asignación de recursos e inicio del dispositivo
El administrador de PnP asigna recursos al dispositivo, si es necesario, y emite un IRP para iniciar el dispositivo.
Asignar recursos
Anteriormente en el proceso de configuración, el administrador de PnP recopiló los requisitos de recursos de hardware para el dispositivo desde el controlador de bus primario del dispositivo. Una vez cargado el conjunto completo de controladores para el dispositivo, el administrador de PnP envía una solicitud de IRP_MN_FILTER_RESOURCE_REQUIREMENTS a la pila de dispositivos. Todos los controladores de la pila tienen la oportunidad de controlar este IRP y modificar la lista de requisitos de recursos del dispositivo, si es necesario.
El administrador de PnP asigna recursos al dispositivo, si el dispositivo requiere alguno, en función de los requisitos del dispositivo y de los recursos disponibles actualmente.
Es posible que el administrador de PnP tenga que reorganizar las asignaciones de recursos de los dispositivos existentes para satisfacer las necesidades del nuevo dispositivo. Esta reasignación de recursos se denomina "reequilibrio". Los controladores de los dispositivos existentes reciben una secuencia de detención e inicio de IRP durante un reequilibrio, pero el reequilibrio debe ser transparente para los usuarios.
En el ejemplo del joystick USB, los dispositivos USB no requieren recursos de hardware para que el administrador de PnP establezca la lista de recursos en NULL.
Inicio del dispositivo (IRP_MN_START_DEVICE)
Una vez que el administrador de PnP asigna recursos al dispositivo, envía una IRP_MN_START_DEVICE IRP a la pila de dispositivos para dirigir los controladores para que inicien el dispositivo.
Una vez iniciado el dispositivo, el administrador de PnP envía tres IRP más a los controladores del dispositivo:
-
Una vez que el IRP de inicio se complete correctamente, el administrador de PnP envía otro IRP_MN_QUERY_CAPABILITIES IRP a la pila de dispositivos. Todos los controladores del dispositivo tienen la opción de controlar el IRP. El administrador de PnP envía este IRP en este momento, una vez conectados todos los controladores y se inicia el dispositivo, ya que es posible que la función o los controladores de filtro necesiten acceder al dispositivo para recopilar información de funcionalidad.
-
Este IRP ofrece a un controlador la oportunidad de notificar, por ejemplo, que el dispositivo no debe mostrarse en interfaces de usuario como Administrador de dispositivos y el programa Hotplug. Esto es útil para los dispositivos que están presentes en un sistema, pero no se pueden usar en la configuración actual, como un puerto de juego en un portátil que no se puede usar cuando el portátil está desacopado.
IRP_MN_QUERY_DEVICE_RELATIONS para las relaciones de autobús
El administrador de PnP envía este IRP para determinar si el dispositivo tiene algún dispositivo secundario. Si es así, el administrador de PnP configura cada dispositivo secundario.
Uso de GUID_PNP_LOCATION_INTERFACE
La interfaz GUID_PNP_LOCATION_INTERFACE proporciona la propiedad de dispositivo SPDRP_LOCATION_PATHS Plug and Play (PnP) para un dispositivo.
Para implementar esta interfaz en el controlador, controle la IRP_MN_QUERY_INTERFACE IRP con InterfaceType = GUID_PNP_LOCATION_INTERFACE. El controlador proporciona un puntero a una estructura PNP_LOCATION_INTERFACE que contiene punteros a las rutinas individuales de la interfaz. La rutina PnpGetLocationString proporciona la parte específica del dispositivo de la propiedad SPDRP_LOCATION_PATHS del dispositivo.