Compartilhar via


IRP_MN_QUERY_ID

Os motoristas de ônibus devem lidar com solicitações de BusQueryDeviceID para seus dispositivos filho (PDOs filho). Os motoristas de barramento podem lidar com solicitações de BusQueryHardwareIDs, BusQueryCompatibleIDs e BusQueryInstanceID para seus dispositivos filho.

A partir do Windows 7, os motoristas de ônibus também devem lidar com solicitações de BusQueryContainerID para seus PDOs filho.

Para obter mais informações sobre esses identificadores (IDs), consulte Cadeias de caracteres de identificação do dispositivo.

Nota Drivers de função e drivers de filtro não lidam com esse IRP.

Valor

0x13

Código principal

IRP_MJ_PNP

Quando enviado

O gerenciador PnP envia esse IRP quando um dispositivo é enumerado. Um driver pode enviar esse IRP para recuperar a ID da instância de um de seus dispositivos.

O gerenciador de PnP e os drivers enviam esse IRP no IRQL PASSIVE_LEVEL em um contexto de thread arbitrário.

Parâmetros de Entrada

O membro Parameters.QueryId.IdType da estrutura IO_STACK_LOCATION especifica o tipo de IDs solicitadas. Os valores possíveis incluem BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID e BusQueryContainerID. O seguinte tipo de ID é reservado: BusQueryDeviceSerialNumber.

Parâmetros de saída

Retornado no bloco status de E/S.

Bloco de Status de E/S

Um driver define Irp-IoStatus.Status> como STATUS_SUCCESS ou para um erro apropriado status.

Com êxito, um driver define Irp-IoStatus.Information> como um ponteiro WCHAR que aponta para as informações solicitadas. Em caso de erro, um driver define Irp-IoStatus.Information> como zero.

Operação

Se um driver retornar IDs em resposta a esse IRP, ele alocará uma estrutura WCHAR do pool de páginas para conter as IDs. O gerenciador PnP libera a estrutura quando ela não é mais necessária.

Um driver retorna um dos seguintes:

  • Um REG_SZ cadeia de caracteres em resposta a uma solicitação BusQueryDeviceID, BusQueryInstanceID ou BusQueryContainerID.

  • Um REG_MULTI_SZ cadeia de caracteres em resposta a uma solicitação BusQueryHardwareIDs ou BusQueryCompatibleIDs.

Se um driver retornar uma ID com um caractere ilegal, o sistema bugará marcar. Caracteres com os seguintes valores são ilegais em uma ID para este IRP:

  • Menor ou igual a 0x20 (' ')

  • Maior que 0x7F

  • Igual a 0x2C (',')

Um driver deve estar em conformidade com as seguintes restrições de comprimento para IDs:

  • Cada ID de hardware ou ID compatível que um driver retorna nesse IRP deve ter menos de MAX_DEVICE_ID_LEN caracteres. Atualmente, essa constante tem um valor de 200 conforme definido em sdk\inc\cfgmgr32.h.

  • A ID do contêiner que um driver retorna nesse IRP deve ser formatada como um GUID (identificador global exclusivo) e deve ser MAX_GUID_STRING_LEN caracteres, o que inclui o terminador nulo.

  • Se um motorista de ônibus fornecer IDs de instância globalmente exclusivas para seus dispositivos filho (ou seja, o driver definirá DEVICE_CAPABILITIES. UniqueID para os dispositivos), a combinação da ID do dispositivo mais a ID da instância deve ser menor que (MAX_DEVICE_ID_LEN - 1) caracteres. O sistema operacional requer o caractere adicional para um separador de caminho.

  • Se um driver de barramento não fornecer IDs de instância globalmente exclusivas para seus dispositivos filho, a combinação de ID do dispositivo mais ID de instância deverá ser menor que (MAX_DEVICE_ID_LEN - 28). O valor dessa equação é atualmente 172.

Os motoristas de barramento devem estar preparados para lidar com esse IRP para um dispositivo filho imediatamente após a enumeração do dispositivo.

Especificando BusQueryDeviceID e BusQueryInstanceID

Os valores que um motorista de ônibus fornece para BusQueryDeviceID e BusQueryInstanceID permitem que o sistema operacional diferencie um dispositivo de outros dispositivos no computador. O sistema operacional usa a ID do dispositivo e a ID da instância retornadas no IRP IRP_MN_QUERY_ID e o campo ID exclusivo que são retornados no IRP IRP_MN_QUERY_CAPABILITIES para localizar informações do Registro para o dispositivo.

Para BusQueryDeviceID, um motorista de ônibus fornece a ID do dispositivo. Uma ID do dispositivo deve conter a descrição mais específica do dispositivo possível, incorporando o nome do enumerador e as cadeias de caracteres que identificam o fabricante, o dispositivo, a revisão, o empacotador e o produto empacotado, sempre que possível. Por exemplo, o driver de barramento PCI responde com IDs de dispositivo do formulário PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx, codificando todos os cinco itens mencionados acima. No entanto, uma ID do dispositivo não deve conter informações suficientes para diferenciar entre dois dispositivos idênticos. Essas informações devem ser codificadas na ID da instância.

Para BusQueryInstanceID, um driver de barramento deve fornecer uma cadeia de caracteres que contenha a ID da instância do dispositivo. Os drivers de instalação e de barramento usam a ID da instância, com outras informações, para diferenciar entre dois dispositivos idênticos no computador. A ID da instância é exclusiva em todo o computador ou apenas exclusiva no barramento pai do dispositivo.

Se uma ID de instância for exclusiva apenas no barramento, o motorista do barramento especificará essa cadeia de caracteres para BusQueryInstanceID, mas também especificará um valor UniqueID de FALSE em resposta a uma solicitação de IRP_MN_QUERY_CAPABILITIES para o dispositivo. Se UniqueID for FALSE, o gerenciador de PnP aprimorará a ID da instância adicionando informações sobre o pai do dispositivo e, portanto, torna a ID exclusiva no computador. Nesse caso, o motorista do ônibus não deve tomar medidas extras para tornar as IDs de instância de seus dispositivos globalmente exclusivas; basta retornar as informações de funcionalidades apropriadas e o sistema operacional cuida dela.

Se um motorista de ônibus puder fornecer uma ID globalmente exclusiva para cada dispositivo filho, como um número de série, o motorista do barramento especificará essas cadeias de caracteres para BusQueryInstanceID e especificará um valor UniqueID de TRUE em resposta a uma solicitação de IRP_MN_QUERY_CAPABILITIES para cada dispositivo.

Especificando BusQueryHardwareIDs e BusQueryCompatibleIDs

Os valores que um motorista de ônibus fornece para BusQueryHardwareIDs e BusQueryCompatibleIDs permitem que a Instalação localize os drivers apropriados para o dispositivo filho do ônibus.

Um motorista de ônibus responde a cada uma dessas solicitações com uma lista REG_MULTI_SZ de IDs que descrevem o dispositivo. O comprimento máximo, em caracteres, de uma lista de IDs, incluindo os dois caracteres NULL que terminam a lista, é REGSTR_VAL_MAX_HCID_LEN.

Ao retornar mais de uma ID de hardware e/ou mais de uma ID compatível, um motorista de ônibus deve listar as IDs na ordem mais específica para o mais geral para facilitar a escolha da melhor correspondência de driver para o dispositivo. A primeira entrada na lista de IDs de hardware é a descrição mais específica do dispositivo e, como tal, geralmente é idêntica à ID do dispositivo.

A instalação verifica as IDs em relação às IDs listadas em arquivos INF para possíveis correspondências. A instalação primeiro verifica a lista de IDs de hardware e, em seguida, a lista de IDs compatíveis. Entradas anteriores são tratadas como descrições mais específicas do dispositivo e entradas posteriores como correspondências mais gerais (e, portanto, menos ideais) para o dispositivo. Se nenhuma correspondência for encontrada na lista de IDs de hardware, a Instalação poderá solicitar ao usuário a mídia de instalação antes de passar para a lista de IDs compatíveis.

Consulte Plug and Play para obter as regras gerais para lidar com Plug and Play IRPs menores.

Especificando BusQueryContainerIDs

A partir do Windows 7, um motorista de ônibus deve fornecer uma cadeia de caracteres para BusQueryContainerID que contenha a ID do contêiner para o dispositivo. A ID do contêiner permite que o sistema operacional agrupe todos os dispositivos funcionais de um único dispositivo físico removível. Por exemplo, todos os dispositivos funcionais de um dispositivo multifuncional removível têm a mesma ID de contêiner. Para obter mais informações sobre como relatar IDs de contêiner em casos especiais, como um dispositivo de volume que pode abranger vários discos em vários contêineres, mas não pertence a nenhum contêiner, consulte Visão geral das IDs de contêiner.

Um dispositivo físico removível é definido como um dispositivo filho que o motorista do barramento especifica uma funcionalidade Removível de TRUE em resposta a uma solicitação de IRP_MN_QUERY_CAPABILITIES . Para obter mais informações sobre o valor Removível , consulte DEVICE_CAPABILITIES.

O motorista do barramento cria uma ID de contêiner com base em uma ID exclusiva específica do barramento que o dispositivo fornece. Para obter mais informações, consulte Como as IDs de contêiner são geradas.

O driver deve falhar na solicitação IRP e definir IoStatus.Status como STATUS_NOT_SUPPORTED se qualquer uma das seguintes opções for verdadeira:

  • O dispositivo não dá suporte a uma ID exclusiva específica do barramento que o motorista do barramento pode usar para gerar uma ID de contêiner.

  • O motorista do barramento havia especificado anteriormente uma funcionalidade removível de FALSE em resposta a uma solicitação de IRP_MN_QUERY_CAPABILITIES para o dispositivo.

Enviando este IRP

Normalmente, somente o gerenciador PnP envia esse IRP.

Para obter as IDs de hardware ou IDs compatíveis de um dispositivo, chame IoGetDeviceProperty em vez de enviar esse IRP.

Um driver pode enviar esse IRP para recuperar a ID da instância de um de seus dispositivos. Por exemplo, considere um dispositivo ISA PnP multifuncional cujas funções não operam independentemente. O gerenciador PnP enumera as funções como dispositivos separados, mas o driver para esse dispositivo pode ser necessário para associar uma ou mais das funções. Como o ISA do PnP garante uma ID de instância exclusiva, o driver para esse dispositivo multifuncional pode usar as IDs de instância para localizar funções que residem no mesmo dispositivo. O driver para esse dispositivo também deve obter o nome do enumerador do dispositivo chamando IoGetDeviceProperty, para confirmar que o dispositivo é um dispositivo ISA PnP.

Consulte Manipulando IRPs para obter informações sobre como enviar IRPs. As seguintes etapas se aplicam especificamente a este IRP:

  • Defina os valores no próximo local de pilha de E/S do IRP: defina MajorFunction como IRP_MJ_PNP, defina MinorFunction como IRP_MN_QUERY_ID e defina Parameters.QueryId.IdType como BusQueryInstanceID.

  • Defina IoStatus.Status como STATUS_NOT_SUPPORTED.

Além de enviar a ID de consulta IRP, o driver deve chamar IoGetDeviceProperty para obter o DevicePropertyEnumeratorName para o dispositivo.

Depois que o IRP for concluído e o driver terminar com a ID, o driver deverá liberar a estrutura de ID retornada pelos driveres que manipulavam a consulta IRP.

Requisitos

parâmetro

Wdm.h (inclua Wdm.h, Ntddk.h ou Ntifs.h)

Confira também

Cadeias de caracteres de identificação do dispositivo

IoGetDeviceProperty