IRP_MN_QUERY_ID

I driver del bus devono gestire le richieste per BusQueryDeviceID per i dispositivi figlio (PDO figlio). I driver del bus possono gestire le richieste per BusQueryHardwareIDs, BusQueryCompatibleIDs e BusQueryInstanceID per i dispositivi figlio.

A partire da Windows 7, i driver del bus devono gestire anche le richieste per BusQueryContainerID per i PDO figlio.

Per altre informazioni su questi identificatori (ID), vedere Stringhe di identificazione del dispositivo.

Nota I driver di funzione e i driver di filtro non gestiscono questo IRP.

Valore

0x13

Codice principale

IRP_MJ_PNP

Data di invio

Il gestore PnP invia questo IRP quando un dispositivo viene enumerato. Un driver potrebbe inviare questo IRP per recuperare l'ID istanza per uno dei dispositivi.

Il gestore PnP e i driver inviano questo IRP a IRQL PASSIVE_LEVEL in un contesto di thread arbitrario.

Parametri di input

Il membro Parameters.QueryId.IdType della struttura IO_STACK_LOCATION specifica il tipo di ID richiesto. I valori possibili includono BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID e BusQueryContainerID. Il tipo di ID seguente è riservato: BusQueryDeviceSerialNumber.

Parametri di output

Restituito nel blocco di stato di I/O.

Blocco dello stato I/O

Un driver imposta Irp-IoStatus.Status> su STATUS_SUCCESS o su uno stato di errore appropriato.

In caso di esito positivo, un driver imposta Irp-IoStatus.Information> su un puntatore WCHAR che punta alle informazioni richieste. In caso di errore, un driver imposta Irp-IoStatus.Information> su zero.

Operazione

Se un driver restituisce ID in risposta a questo IRP, alloca una struttura WCHAR dal pool di paging per contenere gli ID. Il gestore PnP libera la struttura quando non è più necessaria.

Un driver restituisce uno degli elementi seguenti:

  • Stringa REG_SZ in risposta a una richiesta BusQueryDeviceID, BusQueryInstanceID o BusQueryContainerID.

  • Stringa REG_MULTI_SZ in risposta a una richiesta BusQueryHardwareIDs o BusQueryCompatibleIDs.

Se un driver restituisce un ID con un carattere non valido, il sistema verifica i bug. I caratteri con i valori seguenti non sono validi in un ID per questo IRP:

  • Minore o uguale a 0x20 (' ')

  • Maggiore di 0x7F

  • Uguale a 0x2C (',')

Un driver deve essere conforme alle restrizioni di lunghezza seguenti per gli ID:

  • Ogni ID hardware o ID compatibile restituito da un driver in questo IRP deve essere inferiore MAX_DEVICE_ID_LEN caratteri. Questa costante ha attualmente un valore pari a 200 come definito in sdk\inc\cfgmgr32.h.

  • L'ID contenitore restituito da un driver in questo IRP deve essere formattato come identificatore univoco globale (GUID) e deve essere MAX_GUID_STRING_LEN caratteri, che include il carattere di terminazione Null.

  • Se un driver del bus fornisce ID istanza univoci globali per i dispositivi figlio, ovvero il driver imposta DEVICE_CAPABILITIES. UniqueID per i dispositivi), quindi la combinazione di ID dispositivo e ID istanza deve essere minore di (MAX_DEVICE_ID_LEN - 1). Il sistema operativo richiede il carattere aggiuntivo per un separatore di percorso.

  • Se un driver bus non fornisce ID istanza univoci globali per i dispositivi figlio, la combinazione di ID dispositivo e ID istanza deve essere minore di (MAX_DEVICE_ID_LEN - 28). Il valore di questa equazione è attualmente 172.

I driver del bus devono essere preparati a gestire questo IRP per un dispositivo figlio immediatamente dopo l'enumerazione del dispositivo.

Specifica di BusQueryDeviceID e BusQueryInstanceID

I valori forniti da un driver bus per BusQueryDeviceID e BusQueryInstanceID consentono al sistema operativo di distinguere un dispositivo da altri dispositivi nel computer. Il sistema operativo usa l'ID dispositivo e l'ID istanza restituiti nell'IRP IRP_MN_QUERY_ID e il campo ID univoco restituito nell'IRP IRP_MN_QUERY_CAPABILITIES per individuare le informazioni del Registro di sistema per il dispositivo.

Per BusQueryDeviceID, un driver del bus fornisce l'ID dispositivo del dispositivo. Un ID dispositivo deve contenere la descrizione più specifica possibile del dispositivo, incorporando il nome dell'enumeratore e le stringhe che identificano il produttore, il dispositivo, la revisione, il packager e il prodotto in pacchetto, ove possibile. Ad esempio, il driver del bus PCI risponde con ID dispositivo nel formato PCI\VEN_xxxx& DEV_xxxx& SUBSYS_xxxxxxxx& REV_xx, codificando tutti e cinque gli elementi indicati in precedenza. Tuttavia, un ID dispositivo non deve contenere informazioni sufficienti per distinguere tra due dispositivi identici. Queste informazioni devono essere codificate nell'ID istanza.

Per BusQueryInstanceID, un driver del bus deve fornire una stringa contenente l'ID istanza per il dispositivo. I driver di installazione e bus usano l'ID istanza, con altre informazioni, per distinguere due dispositivi identici nel computer. L'ID istanza è univoco nell'intero computer o semplicemente univoco nel bus padre del dispositivo.

Se un ID istanza è univoco solo nel bus, il driver del bus specifica tale stringa per BusQueryInstanceID, ma specifica anche il valore UniqueIDFALSE in risposta a una richiesta IRP_MN_QUERY_CAPABILITIES per il dispositivo. Se UniqueID è FALSE, il gestore PnP migliora l'ID istanza aggiungendo informazioni sull'elemento padre del dispositivo e rendendo l'ID univoco nel computer. In questo caso, il driver del bus non deve eseguire passaggi aggiuntivi per rendere univoci a livello globale gli ID istanza dei dispositivi. è sufficiente restituire le informazioni sulle funzionalità appropriate e il sistema operativo ne si occupa.

Se un driver del bus può fornire un ID univoco globale per ogni dispositivo figlio, ad esempio un numero di serie, il driver del bus specifica tali stringhe per BusQueryInstanceID e specifica il valore UniqueIDTRUE in risposta a una richiesta IRP_MN_QUERY_CAPABILITIES per ogni dispositivo.

Specifica di BusQueryHardwareIDs e BusQueryCompatibleIDs

I valori forniti da un driver del bus per BusQueryHardwareIDs e BusQueryCompatibleIDs consentono al programma di installazione di individuare i driver appropriati per il dispositivo figlio del bus.

Un driver del bus risponde a ognuna di queste richieste con un REG_MULTI_SZ di ID che descrivono il dispositivo. La lunghezza massima, in caratteri, di un elenco di ID, inclusi i due caratteri NULL che terminano l'elenco, è REGSTR_VAL_MAX_HCID_LEN.

Quando si restituiscono più ID hardware e/o più ID compatibili, un driver del bus deve elencare gli ID nell'ordine più specifico rispetto a quello più generale per facilitare la scelta della migliore corrispondenza del driver per il dispositivo. La prima voce nell'elenco degli ID hardware è la descrizione più specifica del dispositivo e, di conseguenza, è in genere identica all'ID dispositivo.

Il programma di installazione verifica la presenza di possibili corrispondenze tra gli ID elencati nei file INF. Il programma di installazione analizza prima l'elenco degli ID hardware e quindi l'elenco degli ID compatibili. Le voci precedenti vengono considerate come descrizioni più specifiche del dispositivo e le voci successive come corrispondenze più generali (e quindi meno ottimali) per il dispositivo. Se non viene trovata alcuna corrispondenza nell'elenco degli ID hardware, il programma di installazione potrebbe richiedere all'utente il supporto di installazione prima di passare all'elenco di ID compatibili.

Vedere Plug and Play per le regole generali per la gestione Plug and Play IRP secondari.

Specifica di BusQueryContainerIDs

A partire da Windows 7, un driver del bus deve fornire una stringa per BusQueryContainerID che contiene l'ID contenitore per il dispositivo. L'ID contenitore consente al sistema operativo di raggruppare tutti i dispositivi funzionali da un singolo dispositivo fisico rimovibile. Ad esempio, tutti i dispositivi funzionali di un dispositivo multifunzione rimovibile hanno lo stesso ID contenitore. Per altre informazioni sugli ID contenitore di report in casi speciali, ad esempio un dispositivo volume che può estendersi su più dischi in più contenitori ma non appartiene ad alcun contenitore, vedere Panoramica degli ID contenitore.

Un dispositivo fisico rimovibile è definito come dispositivo figlio che il driver del bus specifica una funzionalità rimovibile true in risposta a una richiesta IRP_MN_QUERY_CAPABILITIES richiesta. Per altre informazioni sul valore Removable, vedere DEVICE_CAPABILITIES.

Il driver del bus crea un ID contenitore basato su un ID univoco specifico del bus fornito dal dispositivo. Per altre informazioni, vedere Come vengono generati gli ID contenitore.

Il driver deve non riuscire nella richiesta IRP e impostare IoStatus.Status su STATUS_NOT_SUPPORTED se si verifica una delle condizioni seguenti:

  • Il dispositivo non supporta un ID univoco specifico del bus che il driver del bus può usare per generare un ID contenitore.

  • Il driver del bus aveva specificato in precedenza una funzionalità Rimovibile false in risposta a una richiesta IRP_MN_QUERY_CAPABILITIES per il dispositivo.

Invio di questo IRP

In genere, solo il responsabile PnP invia questo IRP.

Per ottenere gli ID hardware o gli ID compatibili per un dispositivo, chiamare IoGetDeviceProperty anziché inviare questo IRP.

Un driver potrebbe inviare questo IRP per recuperare l'ID istanza per uno dei dispositivi. Si consideri ad esempio un dispositivo ISA PnP multifunzione le cui funzioni non funzionano in modo indipendente. Il gestore PnP enumera le funzioni come dispositivi separati, ma potrebbe essere necessario associare una o più funzioni al driver per tale dispositivo. Poiché L'ISA PnP garantisce un ID istanza univoco, il driver per un dispositivo multifunzione di questo tipo può usare gli ID istanza per individuare le funzioni che risiedono nello stesso dispositivo. Il driver per tale dispositivo deve anche ottenere il nome dell'enumeratore del dispositivo chiamando IoGetDeviceProperty, per verificare che il dispositivo sia un dispositivo ISA PnP.

Per informazioni sull'invio di IRP , vedere Gestione degli IRP. I passaggi seguenti si applicano in modo specifico a questo IRP:

  • Impostare i valori nella posizione successiva dello stack di I/O di IRP: impostare MajorFunctionsu IRP_MJ_PNP, impostare MinorFunction su IRP_MN_QUERY_ID e impostare Parameters.QueryId.IdType su BusQueryInstanceID.

  • Impostare IoStatus.Status su STATUS_NOT_SUPPORTED.

Oltre a inviare l'ID query IRP, il driver deve chiamare IoGetDeviceProperty per ottenere DevicePropertyEnumeratorName per il dispositivo.

Al termine dell'IRP e dopo che il driver è stato completato con l'ID, il driver deve liberare la struttura id restituita dai driver che hanno gestito l'IRP di query.

Requisiti

Intestazione

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

Vedi anche

Stringhe di identificazione del dispositivo

IoGetDeviceProperty