Compartir a través de


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 bus y los controladores de función y filtro en la enumeración y configuración de 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 por cuando el usuario conecta el hardware a la máquina.

diagrama que ilustra la enumeración y generación de informes de un dispositivo plug and play.

Las notas siguientes corresponden a los números en círculo de la ilustración anterior:

  1. 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 de host USB. El concentrador USB es un dispositivo de bus PnP porque los dispositivos secundarios se pueden conectar a él.

  2. El controlador de función para el dispositivo de bus determina que un nuevo dispositivo está en su bus.

    El modo en que el controlador determina esto depende de la arquitectura del bus. Para algunos buses, el controlador de función de bus recibe una notificación de conexión en caliente de los nuevos dispositivos. Si el bus no admite la notificación de conexión en caliente, el usuario debe tomar las medidas adecuadas en el Panel de control para que el bus se enumere.

    En este ejemplo, el bus USB admite notificaciones de conexión en caliente para que el controlador de función del bus USB reciba una notificación de que sus elementos secundarios han cambiado.

  3. El controlador de función del dispositivo de 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.

  4. El administrador de PnP consulta los controladores del bus para obtener la lista actual de dispositivos en el bus.

    El administrador de PnP envía una solicitud 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 está solicitando 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 maneja el IRP, si procede, y a continuación, pasa el IRP al siguiente controlador.

  5. 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 concentrador FDO. El controlador del concentrador crea un PDO para el dispositivo joystick e incluye un puntero de referencia al PDO del joystick en la lista de dispositivos secundarios devueltos con el IRP.

    Cuando el controlador del bus principal del concentrador USB (el par de controladores de clase/miniclase del controlador de host USB) completa el IRP, el IRP recorre la pila de dispositivos hacia arriba mediante cualquier rutina IoCompletion registrada por los controladores del concentrador.

Tenga en cuenta que el controlador de función de bus informa sobre un cambio en su lista de dispositivos secundarios solicitando al administrador de PnP que consulte su lista de dispositivos secundarios. Todos los controladores de los dispositivos de bus ven la solicitud resultante de IRP_MN_QUERY_DEVICE_RELATIONS. Normalmente, el controlador de función de bus es el único controlador para controlar el IRP y los elementos secundarios del informe. 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 bus. Un ejemplo es ACPI, que se conecta como controlador de filtro de bus para dispositivos ACPI. En algunas pilas de dispositivos, los controladores de filtro que no son de bus manejan la solicitud IRP_MN_QUERY_DEVICE_RELATIONS, aunque esto no es lo común.

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 algún dispositivo ha llegado recientemente o se ha retirado. En este ejemplo, hay un nuevo dispositivo. En la ilustración siguiente se muestra el administrador de PnP que crea un nodo de dispositivo para el nuevo dispositivo y empieza a configurar el dispositivo.

Diagrama que ilustra la creación de un devnode para un nuevo dispositivo plug and play.

Las notas siguientes corresponden a los números en círculo de la ilustración anterior:

  1. El administrador de PnP crea nodos de dispositivo para cualquier nuevo dispositivo secundario en el bus.

    El administrador de PnP compara la lista de relaciones de bus devueltas en el IRP de IRP_MN_QUERY_DEVICE_RELATIONS con la lista de elementos secundarios del bus actualmente registrados en el árbol de dispositivos PnP. El administrador de PnP crea un devnode para cada dispositivo nuevo e inicia el procesamiento para la 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 nodo de dispositivo 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 por motivos de simplicidad.

    La flecha ancha entre los dos devnodes de la ilustración anterior indica que el devnode del joystick es un elemento secundario del devnode del concentrador USB.

  2. 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 primario del bus del dispositivo y filtra los DO para los controladores de filtro de bus opcionales. Por lo tanto, el controlador de bus y los controladores de filtro de bus son los únicos controladores que responden a estos IRP. En este ejemplo, el único controlador en la pila del dispositivo joystick es el controlador del bus principal, que es 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:

    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 el 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 esta máquina. El administrador de PnP comprueba si hay una subclave <enumerator>\<deviceID> para el dispositivo en la rama Enum. En este ejemplo, el dispositivo es nuevo y debe configurarse "desde cero".

  3. El administrador de PnP almacena información sobre el dispositivo en el Registro.

    La rama Enum del registro está reservada para su uso por los componentes del sistema operativo y su estructura está sujeto a cambios. Los desarrolladores 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 Enum solo se muestra 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\<enumerador>\<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 controlador de bus 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\<enumerador>\<deviceID>\<instanceID>.

    • 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, de IRP_MN_QUERY_DEVICE_TEXT

      Location, de IRP_MN_QUERY_DEVICE_TEXT

      Capabilities, las marcas de IRP_MN_QUERY_CAPABILITIES

      UINumber, de IRP_MN_QUERY_CAPABILITIES

      HardwareID, de IRP_MN_QUERY_ID

      CompatibleIDs, de IRP_MN_QUERY_ID

      ContainerID, de IRP_MN_QUERY_ID

      LogConf\BootConfig, de IRP_MN_QUERY_RESOURCES

      LogConf\BasicConfigVector, de IRP_MN_QUERY_RESOURCE_REQUIREMENTS

En este momento, el gestor de PnP está listo para localizar el controlador de función y los controladores de filtro para el dispositivo, si los hay. (Consulte la ilustración siguiente).

Diagrama que ilustra la función de búsqueda y los controladores de filtro.

Las notas siguientes corresponden a los círculos numerados de la ilustración anterior:

  1. El administrador PnP en modo kernel se coordina con el administrador PnP en modo de usuario y los componentes de configuración en modo de usuario para encontrar los controladores de función y de filtro para el 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.

  2. Los componentes de configuración en modo de usuario dirigen al administrador PnP en modo kernel para cargar la función y filtrar controladores.

    Los componentes del modo de usuario realizan una llamada de retorno al modo kernel para cargar los controladores, lo que provoca la llamada a sus rutinas AddDevice.

En la ilustración siguiente se muestra el administrador de PnP que carga los controladores (si procede), llamando a sus rutinas AddDevice y dirigiendo a los controladores para iniciar el dispositivo.

diagrama que ilustra cómo llamar a rutinas adddevice e iniciar el nuevo dispositivo.

Las notas siguientes corresponden a los círculos numerados de la ilustración anterior:

  1. 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 del controlador DriverEntry 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.

  2. Controlador de función

    Una vez conectados los filtros inferiores, el administrador de PnP procesa el controlador de funciones. El administrador de PnP llama a la rutina DriverEntry del controlador de función si el controlador aún no está cargado y luego 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 trabajan juntos para servir como controlador de función. El par de controladores crea solo un FDO y lo asocia a la pila de dispositivos.

  3. Controladores de filtro superior

    Una vez asociado el controlador de función, el administrador de PnP procesa los controladores de filtros superiores.

    En este ejemplo, hay un controlador de filtro superior para el dispositivo.

  4. 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.

    • Asignación de 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 del bus principal del dispositivo. Una vez cargado el conjunto completo de controladores para el dispositivo, el administrador de PnP envía una solicitud 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.

    • Iniciar el 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 indicar a los controladores que inicien el dispositivo.

    Una vez iniciado el dispositivo, el administrador de PnP envía tres IRP más a los controladores del dispositivo:

    • IRP_MN_QUERY_CAPABILITIES

      Después de que se complete correctamente el IRP de arranque, el administrador de PnP envía otro IRP IRP_MN_QUERY_CAPABILITIES 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.

    • IRP_MN_QUERY_PNP_DEVICE_STATE

      Este IRP ofrece a un controlador la oportunidad de notificar, por ejemplo, que el dispositivo no debe mostrarse en interfaces de usuario, como el Administrador de dispositivos y el programa Hotplug. Esto es útil para los dispositivos que están presentes en un sistema, pero que 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 bus

      El administrador de PnP envía este IRP para determinar si el dispositivo tiene dispositivos secundarios. 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 el IRP IRP_MN_QUERY_INTERFACE con InterfaceType = GUID_PNP_LOCATION_INTERFACE. El controlador suministra un puntero a una estructura PNP_LOCATION_INTERFACE que contiene los 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.