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 propri 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 l'IRP.
Valore
0x13
Codice principale
Data di invio
La gestione PnP invia questo IRP quando un dispositivo viene enumerato. Un driver potrebbe inviare questo IRP per recuperare l'ID istanza per uno dei relativi dispositivi.
Il gestore e i driver PnP inviano l'IRP in 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 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 GLI ID in risposta a questa IRP, alloca una struttura WCHAR dal pool di pagine per contenere gli ID. Il gestore PnP libera la struttura quando non è più necessaria.
Un driver restituisce uno dei seguenti elementi:
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 verificherà il bug. I caratteri con i valori seguenti sono illegali in un ID per questa 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 minore di MAX_DEVICE_ID_LEN caratteri lunghi. Questa costante attualmente ha 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 terminatore Null.
Se un driver del bus fornisce ID istanza univoca globale 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) caratteri. Il sistema operativo richiede il carattere aggiuntivo per un separatore di percorso.
Se un driver del bus non fornisce ID di istanza univoca globale per i dispositivi figlio, la combinazione di ID dispositivo più 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 per gestire questo IRP per un dispositivo figlio immediatamente dopo l'enumerazione del dispositivo.
Specifica di BusQueryDeviceID e busQueryInstanceID
I valori forniti da un driver del 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 nel IRP_MN_QUERY_ID IRP e il campo ID univoco restituito nel IRP_MN_QUERY_CAPABILITIES IRP 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 del dispositivo possibile, incorporando il nome dell'enumeratore e le stringhe che identificano il produttore, il dispositivo, la revisione, il pacchettor e il prodotto in pacchetto, se possibile. Ad esempio, il driver del bus PCI risponde con ID dispositivo del modulo 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. Il programma di installazione e i driver del bus usano l'ID istanza, con altre informazioni, per distinguere tra due dispositivi identici nel computer. L'ID istanza è univoco nell'intero computer o solo univoco nel bus padre del dispositivo.
Se un ID istanza è univoco solo nel bus, il driver del bus specifica che la stringa per BusQueryInstanceID ma specifica anche un valore UniqueID di FALSE in risposta a una richiesta di 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 quindi rende l'ID univoco nel computer. In questo caso, il driver del bus non deve eseguire passaggi aggiuntivi per rendere gli ID dell'istanza dei dispositivi univoci a livello globale; solo restituire le informazioni appropriate sulle funzionalità e il sistema operativo si occupa di esso.
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 un valore UniqueID di TRUE in risposta a una richiesta di 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 all'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 elenco 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 per la maggior parte dei casi per facilitare la scelta del driver migliore 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 controlla gli ID rispetto agli ID elencati nei file INF per le possibili corrispondenze. Il programma di installazione analizza prima l'elenco degli ID hardware, quindi l'elenco ID compatibili. Le voci precedenti vengono considerate come descrizioni più specifiche del dispositivo e le voci successive come 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 degli ID compatibili.
Vedere Plug and Play per le regole generali per la gestione di irp secondari Plug and Play.
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 di volume che può estendersi su più dischi in più contenitori, ma non appartiene a alcun contenitore, vedere Panoramica degli ID contenitore.
Un dispositivo fisico rimovibile è definito come dispositivo figlio che il driver del bus specifica una funzionalità rimovibile di TRUE in risposta a una richiesta di IRP_MN_QUERY_CAPABILITIES . Per altre informazioni sul valore rimovibile , 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 la richiesta IRP e impostare IoStatus.Status su STATUS_NOT_SUPPORTED se uno dei seguenti è true:
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 ha specificato in precedenza una funzionalità rimovibile di FALSE in risposta a una richiesta di IRP_MN_QUERY_CAPABILITIES per il dispositivo.
Invio di questo IRP
In genere, solo il gestore PnP invia l'IRP.
Per ottenere gli ID hardware o gli ID compatibili per un dispositivo, chiamare IoGetDeviceProperty anziché inviare l'IRP .
Un driver potrebbe inviare questo IRP per recuperare l'ID istanza per uno dei relativi dispositivi. Si consideri, ad esempio, un dispositivo ISA multifunzione i cui funzioni non operano in modo indipendente. Il gestore PnP enumera le funzioni come dispositivi separati, ma il driver per tale dispositivo potrebbe essere necessario per associare una o più funzioni. Poiché PnP ISA garantisce un ID istanza univoco, il driver per tale dispositivo multifunzione può usare gli ID dell'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 INDIRIZZI DI accesso. I passaggi seguenti si applicano in modo specifico a questo IRP:
Impostare i valori nel percorso dello stack I/O successivo dell'IRP: impostare MajorFunction su 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 all'invio dell'ID query IRP, il driver deve chiamare IoGetDeviceProperty per ottenere DevicePropertyEnumeratorName per il dispositivo.
Al termine dell'IRP e il driver viene completato con l'ID, il driver deve liberare la struttura ID restituita dai driver che hanno gestito la query IRP.
Requisiti
Intestazione |
Wdm.h (include Wdm.h, Ntddk.h o Ntifs.h) |