Compartir a través de


IRP_MN_QUERY_ID

Los controladores de autobús deben controlar las solicitudes de BusQueryDeviceID para sus dispositivos secundarios (PPO secundarios). Los controladores de bus pueden controlar las solicitudes de BusQueryHardwareIDs, BusQueryCompatibleIDs y BusQueryInstanceID para sus dispositivos secundarios.

A partir de Windows 7, los controladores de bus también deben controlar las solicitudes de BusQueryContainerID para sus PDO secundarios.

Para obtener más información sobre estos identificadores, consulte Cadenas de identificación de dispositivos.

Nota Los controladores de función y los controladores de filtro no controlan este IRP.

Valor

0x13

Código principal

IRP_MJ_PNP

Cuándo se envió

El administrador de PnP envía este IRP cuando se enumera un dispositivo. Un controlador puede enviar este IRP para recuperar el identificador de instancia de uno de sus dispositivos.

El administrador de PnP y los controladores envían este IRP en IRQL PASSIVE_LEVEL en un contexto de subproceso arbitrario.

Parámetros de entrada

El miembro Parameters.QueryId.IdType de la estructura IO_STACK_LOCATION especifica el tipo de identificadores solicitados. Entre los valores posibles se incluyen BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID y BusQueryContainerID. El siguiente tipo de identificador está reservado: BusQueryDeviceSerialNumber.

Parámetros de salida

Se devuelve en el bloque de estado de E/S.

Bloque de estado de entrada/salida

Un controlador establece Irp-IoStatus.Status> en STATUS_SUCCESS o en un estado de error adecuado.

Si se ejecuta correctamente, un controlador establece Irp-IoStatus.Information> en un puntero WCHAR que apunta a la información solicitada. En caso de error, un controlador establece Irp-IoStatus.Information> en cero.

Operación

Si un controlador devuelve identificadores en respuesta a este IRP, asigna una estructura WCHAR del grupo paginado para que contenga los identificadores. El administrador de PnP libera la estructura cuando ya no se necesita.

Un controlador devuelve una de las siguientes opciones:

  • Cadena REG_SZ en respuesta a una solicitud BusQueryDeviceID, BusQueryInstanceID o BusQueryContainerID.

  • Cadena REG_MULTI_SZ en respuesta a una solicitud BusQueryHardwareIDs o BusQueryCompatibleIDs.

Si un controlador devuelve un identificador con un carácter no válido, el sistema comprobará el error. Los caracteres con los valores siguientes no son válidos en un identificador para este IRP:

  • Menor o igual que 0x20 (" ')

  • Mayor que 0x7F

  • Igual a 0x2C (',')

Un controlador debe cumplir las siguientes restricciones de longitud para los identificadores:

  • Cada identificador de hardware o identificador compatible que devuelve un controlador en este IRP debe tener menos de MAX_DEVICE_ID_LEN caracteres. Esta constante tiene actualmente un valor de 200 tal y como se define en sdk\inc\cfgmgr32.h.

  • El identificador de contenedor que devuelve un controlador en este IRP debe tener el formato de identificador único global (GUID) y debe ser MAX_GUID_STRING_LEN caracteres, que incluye el terminador nulo.

  • Si un controlador de bus proporciona identificadores de instancia únicos globales para sus dispositivos secundarios (es decir, el controlador establece DEVICE_CAPABILITIES. UniqueID para los dispositivos) y, a continuación, la combinación del identificador de dispositivo más el identificador de instancia debe ser menor que (MAX_DEVICE_ID_LEN - 1). El sistema operativo requiere el carácter adicional para un separador de ruta de acceso.

  • Si un controlador de bus no proporciona identificadores de instancia únicos globalmente para sus dispositivos secundarios, la combinación del identificador de dispositivo más el identificador de instancia debe ser menor que (MAX_DEVICE_ID_LEN - 28). El valor de esta ecuación es actualmente 172.

Los controladores de autobús deben estar preparados para controlar este IRP para un dispositivo secundario inmediatamente después de enumerar el dispositivo.

Especificar BusQueryDeviceID y BusQueryInstanceID

Los valores que proporciona un controlador de bus para BusQueryDeviceID y BusQueryInstanceID permiten al sistema operativo diferenciar un dispositivo de otros dispositivos del equipo. El sistema operativo usa el identificador de dispositivo y el identificador de instancia que se devuelven en el IRP de IRP_MN_QUERY_ID y el campo de identificador único que se devuelven en la IRP_MN_QUERY_CAPABILITIES IRP para buscar la información del Registro para el dispositivo.

Para BusQueryDeviceID, un controlador de bus proporciona el identificador de dispositivo del dispositivo. Un identificador de dispositivo debe contener la descripción más específica del dispositivo posible, incorporando el nombre del enumerador y las cadenas que identifican el fabricante, el dispositivo, la revisión, el empaquetador y el producto empaquetado, siempre que sea posible. Por ejemplo, el controlador de bus PCI responde con los identificadores de dispositivo con el formato PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx, codificando los cinco elementos mencionados anteriormente. Sin embargo, un identificador de dispositivo no debe contener suficiente información para diferenciar entre dos dispositivos idénticos. Esta información se debe codificar en el identificador de instancia.

Para BusQueryInstanceID, un controlador de bus debe proporcionar una cadena que contenga el identificador de instancia del dispositivo. Los controladores de instalación y autobús usan el identificador de instancia, con otra información, para diferenciar entre dos dispositivos idénticos en el equipo. El identificador de instancia es único en todo el equipo o solo único en el bus primario del dispositivo.

Si un identificador de instancia solo es único en el bus, el controlador de bus especifica esa cadena para BusQueryInstanceID, pero también especifica un valor UniqueID de FALSE en respuesta a una solicitud de IRP_MN_QUERY_CAPABILITIES para el dispositivo. Si UniqueID es FALSE, el administrador de PnP mejora el identificador de instancia agregando información sobre el elemento primario del dispositivo y, por tanto, hace que el identificador sea único en el equipo. En este caso, el controlador de bus no debe realizar pasos adicionales para que los identificadores de instancia de sus dispositivos sean únicos globalmente; simplemente devuelva la información de funcionalidades adecuada y el sistema operativo se encarga de ella.

Si un controlador de bus puede proporcionar un identificador único global para cada dispositivo secundario, como un número de serie, el controlador de bus especifica esas cadenas para BusQueryInstanceID y especifica un valor UniqueID de TRUE en respuesta a una solicitud de IRP_MN_QUERY_CAPABILITIES para cada dispositivo.

Especificar BusQueryHardwareIDs y BusQueryCompatibleIDs

Los valores que proporciona un controlador de bus para BusQueryHardwareIDs y BusQueryCompatibleIDs permiten al programa de instalación localizar los controladores adecuados para el dispositivo secundario del bus.

Un controlador de bus responde a cada una de estas solicitudes con una REG_MULTI_SZ lista de identificadores que describen el dispositivo. La longitud máxima, en caracteres, de una lista de identificadores, incluidos los dos caracteres NULL que finalizan la lista, se REGSTR_VAL_MAX_HCID_LEN.

Al devolver más de un identificador de hardware o más de un identificador compatible, un controlador de bus debe enumerar los identificadores en el orden más específico de la mayoría general para facilitar la elección de la mejor coincidencia de controladores para el dispositivo. La primera entrada de la lista de identificadores de hardware es la descripción más específica del dispositivo y, como tal, suele ser idéntica al identificador del dispositivo.

El programa de instalación comprueba los identificadores con los identificadores enumerados en los archivos INF en busca de posibles coincidencias. El programa de instalación examina primero la lista de identificadores de hardware y, a continuación, la lista de identificadores compatibles. Las entradas anteriores se tratan como descripciones más específicas del dispositivo y las entradas posteriores como coincidencias más generales (y, por lo tanto, menos óptimas) para el dispositivo. Si no se encuentra ninguna coincidencia en la lista de identificadores de hardware, el programa de instalación podría solicitar al usuario medios de instalación antes de pasar a la lista de identificadores compatibles.

Consulte Plug and Play para conocer las reglas generales para controlar Plug and Play IRP menores.

Especificación de BusQueryContainerIDs

A partir de Windows 7, un controlador de bus debe proporcionar una cadena para BusQueryContainerID que contiene el identificador de contenedor del dispositivo. El identificador de contenedor permite al sistema operativo agrupar todos los dispositivos funcionales desde un único dispositivo físico extraíble. Por ejemplo, todos los dispositivos funcionales de un dispositivo multifunción extraíble tienen el mismo identificador de contenedor. Para obtener más información sobre los identificadores de contenedor de informes en casos especiales, como un dispositivo de volumen que puede abarcar varios discos en varios contenedores, pero no pertenece a ningún contenedor, consulte Información general sobre los identificadores de contenedor.

Un dispositivo físico extraíble se define como un dispositivo secundario que el controlador de bus especifica una funcionalidad extraíbletrue en respuesta a una solicitud de IRP_MN_QUERY_CAPABILITIES . Para obtener más información sobre el valor extraíble , vea DEVICE_CAPABILITIES.

El controlador de bus crea un identificador de contenedor basado en un identificador único específico del bus que proporciona el dispositivo. Para obtener más información, consulte Cómo se generan los identificadores de contenedor.

El controlador debe producir un error en la solicitud IRP y establecer IoStatus.Status en STATUS_NOT_SUPPORTED si se cumple alguna de las siguientes condiciones:

  • El dispositivo no admite un identificador único específico del bus que el controlador de bus puede usar para generar un identificador de contenedor.

  • El controlador de bus había especificado previamente una funcionalidad extraíble de FALSE en respuesta a una solicitud de IRP_MN_QUERY_CAPABILITIES para el dispositivo.

Envío de este IRP

Normalmente, solo el administrador de PnP envía este IRP.

Para obtener los identificadores de hardware o los identificadores compatibles de un dispositivo, llame a IoGetDeviceProperty en lugar de enviar este IRP.

Un controlador puede enviar este IRP para recuperar el identificador de instancia de uno de sus dispositivos. Por ejemplo, considere un dispositivo PnP ISA multifunción cuyas funciones no funcionan de forma independiente. El administrador de PnP enumera las funciones como dispositivos independientes, pero el controlador de este tipo de dispositivo podría ser necesario para asociar una o varias de las funciones. Dado que el ISA de PnP garantiza un identificador de instancia único, el controlador para este dispositivo multifunción puede usar los identificadores de instancia para buscar funciones que residen en el mismo dispositivo. El controlador de este tipo de dispositivo también debe obtener el nombre del enumerador del dispositivo mediante una llamada a IoGetDeviceProperty para confirmar que el dispositivo es un dispositivo ISA de PnP.

Consulte Control de IRP para obtener información sobre el envío de IRP. Los pasos siguientes se aplican específicamente a este IRP:

  • Establezca los valores en la siguiente ubicación de pila de E/S del IRP: establezca MajorFunction en IRP_MJ_PNP, establezca MinorFunction en IRP_MN_QUERY_ID y establezca Parameters.QueryId.IdType en BusQueryInstanceID.

  • Establezca IoStatus.Status en STATUS_NOT_SUPPORTED.

Además de enviar el IRP del identificador de consulta, el controlador debe llamar a IoGetDeviceProperty para obtener devicePropertyEnumeratorName para el dispositivo.

Una vez completado el IRP y el controlador ha terminado con el identificador, el controlador debe liberar la estructura de identificadores devuelta por los controladores que controlaron el IRP de consulta.

Requisitos

Encabezado

Wdm.h (incluya Wdm.h, Ntddk.h o Ntifs.h)

Consulte también

Cadenas de identificación de dispositivos

IoGetDeviceProperty