Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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, anche i driver del bus devono gestire 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
Quando viene inviato
Il gestore PnP invia questo IRP quando viene enumerato un dispositivo. Un driver potrebbe inviare questo IRP per recuperare l'ID istanza per uno dei relativi dispositivi.
Il gestore PnP e i driver inviano questo 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 di ID seguente è riservato: BusQueryDeviceSerialNumber.
Parametri di output
Restituito nel blocco di stato di I/O.
Blocco di stato di 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 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 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à 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 minore di 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 di istanza univoca globale per i dispositivi figlio, ovvero il driver imposta DEVICE_CAPABILITIES. UniqueID per i dispositivi), la combinazione di ID dispositivo più 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 del bus non fornisce ID 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 a gestire questo IRP per un dispositivo figlio subito 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 differenziare 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 delle 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 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 Windows e 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 la stringa per BusQueryInstanceID, ma specifica anche un valore UniqueIDfalse 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 ulteriori passaggi per rendere gli ID dell'istanza dei dispositivi univoci a livello globale; restituire solo 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 UniqueIDtrue in risposta a una richiesta di IRP_MN_QUERY_CAPABILITIES per ogni dispositivo.
Specifica di BusQueryHardwareIDs e BusQueryCompatibleIDs
I valori forniti da un driver bus per BusQueryHardwareIDs e BusQueryCompatibleIDs consentono a Windows di individuare i driver appropriati per il dispositivo figlio del bus.
Un driver del bus risponde a ognuna di queste richieste con un elenco 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 per la maggior parte generale per facilitare la scelta della corrispondenza 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.
Windows controlla gli ID rispetto agli ID elencati nei file INF per individuare le possibili corrispondenze. Windows analizza prima l'elenco degli ID hardware, 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, Windows 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 dei plug-and play di integrazione 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 per la creazione di report in casi speciali, ad esempio un dispositivo di 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 viene 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 conducente del bus aveva precedentemente specificato una funzionalità rimovibilefalse in risposta a una richiesta di IRP_MN_QUERY_CAPABILITIES per il dispositivo.
l'invio di questo IRP
In genere, solo il gestore PnP invia questo IRP.
Per ottenere gli ID hardware o gli ID compatibili per un dispositivo, chiama IoGetDeviceProperty invece di inviare questo IRP.
Un driver potrebbe inviare questo IRP per recuperare l'ID istanza per uno dei relativi 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 il driver per un dispositivo di questo tipo 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 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 runtime di integrazione, vedere gestione dei runtime di integrazione. I passaggi seguenti si applicano in modo specifico a questo IRP:
Impostare i valori nella posizione successiva dello stack di I/O 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 a inviare l'ID di 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 l'IRP della query.
Requisiti
Intestazione |
Wdm.h (include Wdm.h, Ntddk.h o Ntifs.h) |