Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os motoristas de barramento devem lidar com solicitações de BusQueryDeviceID para seus dispositivos filho (PDOs filho). Os drivers de barramento podem lidar com solicitações para BusQueryHardwareIDs, BusQueryCompatibleIDs e BusQueryInstanceID para seus dispositivos filho.
A partir do Windows 7, os drivers de barramento também devem lidar com solicitações de BusQueryContainerID para seus PDOs filhos.
Para obter mais informações sobre esses identificadores (IDs), consulte Cadeias de caracteres de identificação de dispositivo.
Observação: Drivers de função e drivers de filtro não lidam com esse IRP.
Valor
0x13
Código principal
Quando enviado
O gerenciador PnP envia esse IRP quando um dispositivo é enumerado. Um driver pode enviar esse IRP para recuperar o ID da instância de um de seus dispositivos.
O gerenciador 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 ID(s) solicitado(s). 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 de status de E/S.
Bloco de status de E/S
Um driver define Irp-IoStatus.Status> como STATUS_SUCCESS ou para um status de erro apropriado.
Quando bem-sucedido, um driver define Irp-IoStatus.Information> como um ponteiro WCHAR que aponta para as informações solicitadas. No erro, um driver define Irp-IoStatus.Information> como zero.
Funcionamento
Se um driver retornar ID(s) em resposta a esse IRP, ele alocará uma estrutura WCHAR do pool paginado para conter o(s) ID(s). O gestor PnP liberta a estrutura quando esta já não é necessária.
Um driver retorna um dos seguintes:
Uma cadeia de caracteres REG_SZ em resposta a uma solicitação BusQueryDeviceID, BusQueryInstanceID ou BusQueryContainerID.
Uma cadeia de caracteres REG_MULTI_SZ em resposta a uma solicitação BusQueryHardwareIDs ou BusQueryCompatibleIDs.
Se um driver retornar um ID com um caractere ilegal, o sistema irá verificar bugs. Caracteres com os seguintes valores são ilegais em um ID para este IRP:
Inferior 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 neste IRP deve ter menos de MAX_DEVICE_ID_LEN caracteres. Esta constante tem atualmente um valor de 200 conforme definido em sdk\inc\cfgmgr32.h.
O ID do contêiner que um driver retorna neste IRP deve ser formatado como um identificador global exclusivo (GUID) e deve ser MAX_GUID_STRING_LEN caracteres, o que inclui o terminador nulo.
Se um driver de barramento fornecer IDs de instância globalmente exclusivas para seus dispositivos filho (ou seja, o driver define DEVICE_CAPABILITIES. UniqueID para os dispositivos), então a combinação de ID de dispositivo mais ID de 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 de dispositivo mais ID de instância deverá ser menor que (MAX_DEVICE_ID_LEN - 28). O valor desta equação é atualmente 172.
Os drivers de barramento devem estar preparados para lidar com esse IRP para um dispositivo filho imediatamente após o dispositivo ser enumerado.
Especificando BusQueryDeviceID e BusQueryInstanceID
Os valores que um driver de barramento fornece para BusQueryDeviceID e BusQueryInstanceID permitem que o sistema operacional diferencie um dispositivo de outros dispositivos no computador. O sistema operacional usa o ID do dispositivo e o ID da instância que são retornados no IRP do IRP_MN_QUERY_ID e o campo ID exclusivo que são retornados no IRP IRP_MN_QUERY_CAPABILITIES para localizar as informações do Registro para o dispositivo.
Para BusQueryDeviceID, um driver de barramento fornece a ID do dispositivo do dispositivo. Um ID de dispositivo deve conter a descrição mais específica possível do dispositivo, incorporando o nome do enumerador e cadeias de caracteres que identificam o fabricante, o dispositivo, a revisão, o empacotador e o produto embalado, sempre que possível. Por exemplo, o driver de barramento PCI responde com IDs de dispositivo do formato PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx, codificando todos os cinco itens mencionados acima. No entanto, um ID de dispositivo não deve conter informações suficientes para diferenciar dois dispositivos idênticos. Essas informações devem ser codificadas no ID da instância.
Para BusQueryInstanceID, um driver de barramento deve fornecer uma cadeia de caracteres que contenha o ID da instância para o dispositivo. O Windows e os drivers de barramento usam o ID da instância, com outras informações, para diferenciar entre dois dispositivos idênticos no computador. O ID da instância é exclusivo em todo o computador ou apenas exclusivo no barramento pai do dispositivo.
Se um ID de instância for exclusivo apenas no barramento, o driver de barramento especifica essa cadeia de caracteres para BusQueryInstanceID, mas também especifica 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 PnP aprimora o ID da instância adicionando informações sobre o pai do dispositivo e, portanto, torna o ID exclusivo no computador. Neste caso, o motorista de barramento não deve tomar medidas adicionais para tornar os IDs de instância de seus dispositivos globalmente exclusivos; basta retornar as informações de recursos apropriadas e o sistema operacional cuida disso.
Se um driver de barramento puder fornecer uma ID globalmente exclusiva para cada dispositivo filho, como um número de série, o driver de 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 driver de barramento fornece para BusQueryHardwareIDs e BusQueryCompatibleIDs permitem que o Windows localize os drivers apropriados para o dispositivo filho do barramento.
Um driver de barramento 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 encerram a lista, é REGSTR_VAL_MAX_HCID_LEN.
Ao retornar mais de um ID de hardware e/ou mais de um ID compatível, um driver de barramento deve listar os IDs na ordem do mais específico 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 ao ID do dispositivo.
O Windows verifica as IDs em relação às IDs listadas nos arquivos INF em busca de possíveis correspondências. O Windows verifica primeiro a lista de IDs de hardware e, em seguida, a lista de IDs compatíveis. As entradas anteriores são tratadas como descrições mais específicas do dispositivo, e as 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, o Windows 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 IRPs menores Plug and Play.
Especificando BusQueryContainerIDs
A partir do Windows 7, um driver de barramento deve fornecer uma cadeia de caracteres para BusQueryContainerID que contém a ID do contêiner para o dispositivo. O 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 o mesmo 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 de IDs de contêiner.
Um dispositivo físico removível é definido como um dispositivo filho que o driver de barramento especifica um recurso 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 driver de 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 IDs de contêiner são gerados.
O driver deve falhar a solicitação IRP e definir IoStatus.Status como STATUS_NOT_SUPPORTED se qualquer uma das seguintes situações for verdadeira:
O dispositivo não suporta uma ID exclusiva específica do barramento que o driver de barramento pode usar para gerar uma ID de contêiner.
O driver de barramento havia especificado anteriormente um recurso removível de FALSE em resposta a uma solicitação de IRP_MN_QUERY_CAPABILITIES para o dispositivo.
enviar este IRP
Normalmente, apenas o gerente PnP envia esse IRP.
Para obter os IDs de hardware ou IDs compatíveis para um dispositivo, chame IoGetDeviceProperty em vez de enviar este IRP.
Um driver pode enviar esse IRP para recuperar o ID da instância de um de seus dispositivos. Por exemplo, considere um dispositivo PnP ISA multifuncional cujas funções não operam de forma independente. O gerenciador PnP enumera as funções como dispositivos separados, mas o driver para tal dispositivo pode ser necessário para associar uma ou mais das funções. Como o PnP ISA garante um ID de instância exclusivo, o driver para esse dispositivo multifuncional pode usar os 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 Tratamento de 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 da 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 o IRP de ID de consulta, o driver deve chamar IoGetDeviceProperty para obter o DevicePropertyEnumeratorName para o dispositivo.
Depois que o IRP for concluído e o driver terminar com o ID, o driver deve liberar a estrutura de ID retornada pelo(s) driver(es) que manipulou o IRP de consulta.
Requerimentos
Cabeçalho |
Wdm.h (inclui Wdm.h, Ntddk.h ou Ntifs.h) |