IRP_MN_QUERY_CAPABILITIES
Il gestore PnP invia questo IRP per ottenere le funzionalità di un dispositivo, ad esempio se il dispositivo può essere bloccato o espulso.
I driver di funzione e filtro possono gestire questa richiesta se modificano le funzionalità supportate dal driver del bus. I conducenti del bus devono gestire questa richiesta per i dispositivi figlio.
Valore
0x09
Codice principale
Quando viene inviato
Il gestore PnP invia questo IRP al driver del bus per un dispositivo immediatamente dopo l'enumerazione del dispositivo. Il gestore PnP invia nuovamente questo IRP dopo che tutti i driver per un dispositivo hanno avviato il dispositivo. Un driver può inviare questo IRP per ottenere le funzionalità per un dispositivo.
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.DeviceCapabilities.Capabilities della struttura IO_STACK_LOCATION punta a una struttura DEVICE_CAPABILITIES contenente informazioni sulle funzionalità del dispositivo.
Parametri di output
Parameters.DeviceCapabilities.Capabilities punta alla struttura DEVICE_CAPABILITIES che riflette le modifiche apportate dai driver che gestiscono l'IRP.
Blocco di stato di I/O
Un driver imposta Irp-IoStatus.Status> su STATUS_SUCCESS o su uno stato di errore appropriato, ad esempio STATUS_UNSUCCESSFUL.
Se un driver di funzione o filtro non gestisce questo IRP, chiama IoSkipCurrentIrpStackLocation e passa l'IRP al driver successivo. Tale driver non deve modificare Irp-IoStatus.Status> e non deve completare l'IRP.
Un autista del bus imposta Irp-IoStatus.Status> e completa l'IRP.
Operazione
Quando un dispositivo viene enumerato, ma prima che la funzione e i driver di filtro vengano caricati per il dispositivo, il gestore PnP invia una richiesta di IRP_MN_QUERY_CAPABILITIES al driver del bus padre per il dispositivo. Il driver del bus deve impostare tutti i valori rilevanti nella struttura DEVICE_CAPABILITIES e restituirlo al gestore PnP.
Dopo che lo stack di dispositivi è stato compilato e i driver hanno avviato il dispositivo, il gestore PnP invia nuovamente questo IRP per essere gestito prima dal driver nella parte superiore dello stack di dispositivi e quindi da ogni driver inferiore nello stack. I driver di funzione e filtro possono impostare una routine IoCompletion e gestire questo IRP durante il backup dello stack di dispositivi.
I driver devono aggiungere funzionalità prima di passare l'IRP al driver inferiore successivo.
I driver devono rimuovere le funzionalità dopo che tutti i driver inferiori hanno terminato l'IRP. Un driver in genere non rimuove le funzionalità impostate da altri driver, ma potrebbe farlo se contiene informazioni speciali sulle funzionalità del dispositivo in una determinata configurazione. Per informazioni sul rinvio dell'elaborazione di IRP fino al termine dei driver inferiori, vedere Plug and Play .
Dopo l'enumerazione di un dispositivo e i relativi driver vengono caricati, le relative funzionalità non devono cambiare. Le funzionalità di un dispositivo possono cambiare se il dispositivo viene rimosso ed enumerato di nuovo.
Quando si gestisce un IRP IRP_MN_QUERY_CAPABILITIES , il driver che rappresenta il gestore dei criteri di risparmio energia per il dispositivo deve impostare una routine IoCompletion e copiare le funzionalità di risparmio energia del dispositivo, ad esempio i mapping dello stato di alimentazione da S a D, nel modo in cui viene eseguito il backup dello stack di dispositivi. Per determinare le funzionalità di alimentazione di un dispositivo figlio, il driver del bus padre crea un'altra funzionalità di query IRP e invia l'IRP al driver padre. Per altre informazioni, vedere Reporting Device Power Capabilities .See Reporting Device Power Capabilities for more information.
Se un driver gestisce questo IRP, deve controllare il valore di DEVICE_CAPABILITIES Version . Se tale valore non è una versione supportata dal driver, il driver deve avere esito negativo su IRP. Se la versione è supportata, il driver deve controllare il campo Dimensioni . Un driver deve impostare solo i campi che si trovano all'interno dei limiti della struttura delle funzionalità ricevuta come input.
I driver che gestiscono questo IRP possono impostare alcuni campi DEVICE_CAPABILITIES , ma non devono impostare i campi Dimensioni e Versione . Questi campi vengono impostati solo dal componente che ha inviato l'IRP.
Vedere Plug and Play per le regole generali per la gestione dei plug-and play di integrazione secondari.
Invio di questo IRP
Un driver del bus invia questo IRP allo stack di dispositivi padre quando gestisce una richiesta di IRP_MN_QUERY_CAPABILITIES per uno dei dispositivi figlio. Inoltre, un driver potrebbe inviare questo IRP per ottenere le funzionalità del dispositivo per uno dei suoi dispositivi. Un singolo driver nello stack ha solo una parte delle informazioni sulle funzionalità per il dispositivo; l'invio di un IRP allo stack di dispositivi consente di raccogliere l'immagine completa, incluse le modifiche apportate da qualsiasi driver di filtro e così via.
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:
Allocare una struttura DEVICE_CAPABILITIES dal pool di paging e inizializzarla in zeri chiamando RtlZeroMemory. Inizializzare sizeof(DEVICE_CAPABILITIES), la versione su 1 e Address e UINumber su -1.
Impostare i valori nella posizione successiva dello stack di I/O di IRP: impostare MajorFunction su IRP_MJ_PNP, impostare MinorFunction su IRP_MN_QUERY_CAPABILITIES e impostare Parameters.DeviceCapabilities su un puntatore alla struttura DEVICE_CAPABILITIES allocata.
Inizializzare IoStatus.Status per STATUS_NOT_SUPPORTED.
Deallocare l'IRP e la struttura DEVICE_CAPABILITIES quando non sono più necessari.
Requisiti
Intestazione |
Wdm.h (include Wdm.h, Ntddk.h o Ntifs.h) |