Condividi tramite


Aggiunta di un dispositivo PnP a un sistema in esecuzione

Questa sezione descrive la sequenza di eventi che si verificano quando il sistema configura un dispositivo PnP aggiunto da un utente a un computer in esecuzione. In questa discussione vengono evidenziati i ruoli del gestore PnP, dei driver di bus e delle funzioni e dei driver di filtro nell'enumerazione e configurazione di un nuovo dispositivo.

La maggior parte di questa discussione è rilevante anche per la configurazione di un dispositivo PnP presente all'avvio del computer. In particolare, i dispositivi i cui driver sono contrassegnati SERVICE_DEMAND_START in un file INF vengono configurati essenzialmente nello stesso modo in cui il dispositivo viene aggiunto in modo dinamico o è presente in fase di avvio.

La figura seguente illustra i primi passaggi per configurare il dispositivo, a partire da quando l'utente collega l'hardware al computer.

diagramma che illustra l'enumerazione e la segnalazione di un dispositivo plug and play.

Le note seguenti corrispondono ai numeri cerchiati nella figura precedente:

  1. Un utente collega un dispositivo PnP a uno slot gratuito in un bus PnP.

    In questo esempio, l'utente collega un joystick USB PnP all'hub in un controller host USB. L'hub USB è un dispositivo bus PnP perché i dispositivi figlio possono essere collegati.

  2. Il driver di funzione per il dispositivo bus determina che un nuovo dispositivo è sul bus.

    Il modo in cui il conducente determina questo dipende dall'architettura del bus. Per alcuni autobus, il driver della funzione del bus riceve una notifica plug-hot dei nuovi dispositivi. Se il bus non supporta la notifica plug-hot, l'utente deve intervenire in modo appropriato nel Pannello di controllo per fare in modo che il bus venga enumerato.

    In questo esempio, il bus USB supporta la notifica plug-hot in modo che il driver di funzione per il bus USB venga informato che i relativi figli sono stati modificati.

  3. Il driver di funzione per il dispositivo bus notifica al gestore PnP che il set di dispositivi figlio è stato modificato.

    Il driver della funzione notifica al gestore PnP chiamando IoInvalidateDeviceRelations con un tipo di busRelations.

  4. Il gestore PnP esegue una query sui driver dell'autobus per l'elenco corrente di dispositivi nel bus.

    Il gestore PnP invia una richiesta di IRP_MN_QUERY_DEVICE_RELATIONS allo stack di dispositivi per il bus. Il valore Parameters.QueryDeviceRelations.Type è BusRelations, che indica che il gestore PnP richiede l'elenco corrente di dispositivi presenti sul bus (relazioni tra bus).

    Il gestore PnP invia l'IRP al driver principale nello stack di dispositivi per il bus. In base alle regole per i runtime di integrazione PnP, ogni driver nello stack gestisce l'IRP, se appropriato, e passa l'IRP al driver successivo.

  5. Il driver di funzione per il dispositivo bus gestisce l'IRP.

    Per informazioni dettagliate sulla gestione di questo IRP, vedere la pagina di riferimento per IRP_MN_QUERY_DEVICE_RELATIONS .

    In questo esempio, il driver dell'hub USB gestisce questo IRP per l'hub FDO. Il driver hub crea un PDO per il dispositivo joystick e include un puntatore a cui si fa riferimento al PDO del joystick nell'elenco dei dispositivi figlio restituiti con l'IRP.

    Quando il driver del bus padre dell'hub USB (la coppia di driver di classe/miniclasse del controller host USB) completa l'IRP, il protocollo IRP esegue il backup dello stack di dispositivi tramite qualsiasi routine IoCompletion registrata dai driver dell'hub.

Si noti che il driver delle funzioni del bus segnala una modifica nell'elenco di elementi figlio richiedendo che la query PnP manager per il relativo elenco di dispositivi figlio. La richiesta di IRP_MN_QUERY_DEVICE_RELATIONS risultante viene visualizzata da tutti i driver per il dispositivo bus. In genere, il driver della funzione del bus è l'unico conducente a gestire l'IRP e segnalare gli elementi figlio. In alcuni stack di dispositivi, è presente un driver filtro bus e partecipa alla costruzione dell'elenco delle relazioni tra bus. Un esempio è ACPI, che si collega come driver di filtro bus per i dispositivi ACPI. In alcuni stack di dispositivi, i driver di filtro nonbus gestiscono la richiesta di IRP_MN_QUERY_DEVICE_RELATIONS , ma questo non è tipico.

A questo punto, il gestore PnP include l'elenco corrente dei dispositivi nel bus. Il gestore PnP determina quindi se i dispositivi sono appena arrivati o sono stati rimossi. In questo esempio è presente un nuovo dispositivo. La figura seguente illustra il gestore PnP che crea un devnode per il nuovo dispositivo e inizia a configurare il dispositivo.

diagramma che illustra la creazione di un nodo devnode per un nuovo dispositivo plug and play.

Le note seguenti corrispondono ai numeri cerchiati nella figura precedente:

  1. Il gestore PnP crea devnodes per tutti i nuovi dispositivi figlio nel bus.

    Il gestore PnP confronta l'elenco delle relazioni tra bus restituite nel IRP_MN_QUERY_DEVICE_RELATIONS IRP e l'elenco di elementi figlio per il bus attualmente registrato nell'albero dei dispositivi PnP. Il gestore PnP crea un nodo devnode per ogni nuovo dispositivo e avvia l'elaborazione della rimozione per tutti i dispositivi rimossi.

    In questo esempio è presente un nuovo dispositivo (un joystick), quindi il gestore PnP crea un nodo devnode per il joystick. A questo punto, l'unico driver configurato per il joystick è il driver del bus hub USB padre, che ha creato il PDO del joystick. Tutti i driver di filtro bus facoltativi saranno presenti anche nello stack di dispositivi, ma l'esempio omette i driver di filtro bus per semplicità.

    La freccia larga tra i due devnodes nella figura precedente indica che il joystick devnode è un elemento figlio del nodo devnode dell'hub USB.

  2. Il gestore PnP raccoglie informazioni sul nuovo dispositivo e inizia a configurare il dispositivo.

    Il gestore PnP invia una sequenza di irP allo stack di dispositivi per raccogliere informazioni sul dispositivo. A questo punto, lo stack di dispositivi è costituito solo dal PDO creato dal driver del bus padre del dispositivo e filtra gli oggetti DO per eventuali driver di filtro del bus facoltativi. Pertanto, i driver del bus e i driver filtro bus sono gli unici conducenti che rispondono a questi IRP. In questo esempio, l'unico driver nello stack di dispositivi joystick è il driver del bus padre, il driver dell'hub USB.

    Il gestore PnP raccoglie informazioni su un nuovo dispositivo inviando i runtime di integrazione allo stack di dispositivi. Questi provider di integrazione includono quanto segue:

    Il gestore PnP invia i provider di integrazione elencati sopra in questa fase di elaborazione di un nuovo dispositivo PnP, ma non necessariamente nell'ordine elencato, quindi non è consigliabile fare ipotesi sull'ordine in cui vengono inviati i provider di integrazione. Inoltre, non è consigliabile presupporre che il gestore PnP invii solo i provider di integrazione elencati in precedenza.

    Il gestore PnP controlla il Registro di sistema per determinare se il dispositivo è stato installato in precedenza in questo computer. Il gestore PnP verifica la presenza di una < sottochiave enumeratore>\<deviceID> per il dispositivo nel ramo Enum. In questo esempio il dispositivo è nuovo e deve essere configurato "da zero".

  3. Il gestore PnP archivia le informazioni sul dispositivo nel Registro di sistema.

    Il ramo Enum del Registro di sistema è riservato per l'uso da parte dei componenti del sistema operativo e il relativo layout è soggetto a modifiche. I writer di driver devono utilizzare routine di sistema per estrarre informazioni correlate ai driver. Non accedere al ramo Enum direttamente da un driver. Le informazioni enumerazioni seguenti sono elencate solo a scopo di debug.

    • Il gestore PnP crea una sottochiave per il dispositivo sotto la chiave per l'enumeratore del dispositivo.

      Il gestore PnP crea una sottochiave denominata HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceID>. Crea la sottochiave dell'enumeratore><, se non esiste già.

      Un enumeratore è un componente che individua i dispositivi PnP basati su uno standard hardware PnP. Le attività di un enumeratore vengono eseguite da un driver bus PnP in collaborazione con il responsabile PnP. Un dispositivo viene in genere enumerato dal driver del bus padre, ad esempio PCI o PCMCIA. Alcuni dispositivi vengono enumerati da un driver di filtro bus, ad esempio ACPI.

    • Il gestore PnP crea una sottochiave per questa istanza del dispositivo.

      Se Capabilities.UniqueID viene restituito come TRUE per IRP_MN_QUERY_CAPABILITIES, l'ID univoco del dispositivo è univoco nel sistema. In caso contrario, il gestore PnP modifica l'ID in modo che sia univoco a livello di sistema.

      Il gestore PnP crea una sottochiave denominata HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceIDinstanceID>>\<.

    • Il gestore PnP scrive informazioni sul dispositivo nella sottochiave per l'istanza del dispositivo.

      Il gestore PnP archivia le informazioni, incluse le seguenti, se fornite per il dispositivo:

      DeviceDesc : da IRP_MN_QUERY_DEVICE_TEXT

      Posizione : da IRP_MN_QUERY_DEVICE_TEXT

      Funzionalità: flag di IRP_MN_QUERY_CAPABILITIES

      UINumber : da IRP_MN_QUERY_CAPABILITIES

      HardwareID : da IRP_MN_QUERY_ID

      CompatibleIDs : da IRP_MN_QUERY_ID

      ContainerID : da IRP_MN_QUERY_ID

      LogConf\BootConfig : da IRP_MN_QUERY_RESOURCES

      LogConf\BasicConfigVector : da IRP_MN_QUERY_RESOURCE_REQUIREMENTS

A questo punto, il gestore PnP è pronto per individuare il driver di funzione e filtrare i driver per il dispositivo, se presente. Vedere la figura seguente.

diagramma che illustra la ricerca di driver di funzione e filtro.

Le note seguenti corrispondono ai cerchi numerati nella figura precedente:

  1. Il gestore PnP in modalità kernel si coordina con i componenti di gestione PnP in modalità utente e configurazione in modalità utente per trovare la funzione e filtrare i driver per il dispositivo, se presenti.

    Il gestore PnP in modalità kernel accoda un evento al gestore PnP in modalità utente, identificando un dispositivo che deve essere installato. Dopo l'accesso di un utente con privilegi, i componenti in modalità utente procedono alla ricerca dei driver. Per informazioni sui componenti di installazione e sul relativo ruolo nell'installazione di un dispositivo, vedere la panoramica dell'installazione del dispositivo .

  2. I componenti di installazione in modalità utente indirizzano il gestore PnP in modalità kernel per caricare la funzione e filtrare i driver.

    I componenti in modalità utente richiamano la modalità kernel per caricare i driver, causando la chiamata delle routine AddDevice .

La figura seguente mostra il gestore PnP che carica i driver (se appropriato), chiamando le routine AddDevice e indirizzando i driver all'avvio del dispositivo.

diagramma che illustra la chiamata di routine adddevice e l'avvio del nuovo dispositivo.

Le note seguenti corrispondono ai cerchi numerati nella figura precedente:

  1. Driver con filtro inferiore

    Prima che il driver di funzione si allega allo stack di dispositivi, il gestore PnP elabora eventuali driver con filtro inferiore. Per ogni driver con filtro inferiore, il gestore PnP chiama la routine DriverEntry del driver se il driver non è ancora caricato. Il gestore PnP chiama quindi la routine AddDevice del driver. Nella routine AddDevice il driver di filtro crea un oggetto dispositivo filtro (filtro DO) e lo collega allo stack di dispositivi (IoAttachDeviceToDeviceStack). Dopo aver collegato l'oggetto dispositivo allo stack di dispositivi, il driver viene attivato come driver per il dispositivo.

    Nell'esempio di joystick USB è presente un driver di filtro inferiore per il dispositivo.

  2. Driver di funzione

    Dopo aver collegato eventuali filtri inferiori, il gestore PnP elabora il driver di funzione. Il gestore PnP chiama la routine DriverEntry del driver di funzione se il driver non è ancora caricato e chiama la routine AddDevice del driver di funzione. Il driver di funzione crea un oggetto dispositivo funzione (FDO) e lo collega allo stack di dispositivi.

    In questo esempio, il driver di funzione per il joystick USB è in realtà una coppia di driver: il driver di classe HID e il driver miniclasse HID. I due driver interagiscono per fungere da driver di funzione. La coppia di driver crea un solo fdO e lo collega allo stack di dispositivi.

  3. Driver di filtro superiore

    Dopo aver collegato il driver di funzione, il gestore PnP elabora tutti i driver di filtro superiore.

    In questo esempio è presente un driver di filtro superiore per il dispositivo.

  4. Assegnazione di risorse e avvio del dispositivo

    Il gestore PnP assegna le risorse al dispositivo, se necessario e rilascia un IRP per avviare il dispositivo.

    • Assegnazione di risorse

      In precedenza nel processo di configurazione, il gestore PnP ha raccolto i requisiti delle risorse hardware per il dispositivo dal driver del bus padre del dispositivo. Dopo il caricamento completo dei driver per il dispositivo, il gestore PnP invia una richiesta di IRP_MN_FILTER_RESOURCE_REQUIREMENTS allo stack di dispositivi. Tutti i driver nello stack hanno la possibilità di gestire questo IRP e modificare l'elenco dei requisiti delle risorse del dispositivo, se necessario.

      Il gestore PnP assegna le risorse al dispositivo, se il dispositivo richiede, in base ai requisiti del dispositivo e alle risorse attualmente disponibili.

      Il gestore PnP potrebbe dover riorganizzare le assegnazioni di risorse dei dispositivi esistenti per soddisfare le esigenze del nuovo dispositivo. Questa riassegnazione delle risorse è denominata "ribilanciamento". I driver per i dispositivi esistenti ricevono una sequenza di arresti e avvia i runtime di integrazione durante un ribilanciamento, ma il ribilanciamento deve essere trasparente per gli utenti.

      Nell'esempio del joystick USB, i dispositivi USB non richiedono risorse hardware, quindi il gestore PnP imposta l'elenco di risorse su NULL.

    • Avvio del dispositivo (IRP_MN_START_DEVICE)

      Quando il gestore PnP assegna le risorse al dispositivo, invia un IRP_MN_START_DEVICE IRP allo stack di dispositivi per indirizzare i driver all'avvio del dispositivo.

    Dopo l'avvio del dispositivo, il gestore PnP invia altri tre provider di integrazione ai driver per il dispositivo:

    • IRP_MN_QUERY_CAPABILITIES

      Al termine dell'avvio di IRP, il gestore PnP invia un altro IRP_MN_QUERY_CAPABILITIES IRP allo stack di dispositivi. Tutti i driver per il dispositivo hanno la possibilità di gestire l'IRP. Il gestore PnP invia questo IRP in questo momento, dopo che tutti i driver sono collegati e il dispositivo viene avviato, perché la funzione o i driver di filtro potrebbero dover accedere al dispositivo per raccogliere informazioni sulle funzionalità.

    • IRP_MN_QUERY_PNP_DEVICE_STATE

      Questo IRP offre a un driver l'opportunità, ad esempio, di segnalare che il dispositivo non deve essere visualizzato nelle interfacce utente, ad esempio Gestione dispositivi e il programma Hotplug. Questo è utile per i dispositivi presenti in un sistema, ma non sono utilizzabili nella configurazione corrente, ad esempio una porta di gioco su un portatile che non è utilizzabile quando il portatile è scollegato.

    • IRP_MN_QUERY_DEVICE_RELATIONS per le relazioni con gli autobus

      Il gestore PnP invia questo IRP per determinare se il dispositivo ha dispositivi figlio. In tal caso, il gestore PnP configura ogni dispositivo figlio.

Uso di GUID_PNP_LOCATION_INTERFACE

L'interfaccia GUID_PNP_LOCATION_INTERFACE fornisce la proprietà del dispositivo Plug and Play (PnP) SPDRP_LOCATION_PATHS per un dispositivo.

Per implementare questa interfaccia nel driver, gestire il IRP_MN_QUERY_INTERFACE IRP con InterfaceType = GUID_PNP_LOCATION_INTERFACE. Il driver fornisce un puntatore a una struttura PNP_LOCATION_INTERFACE che contiene puntatori alle singole routine dell'interfaccia. La routine PnpGetLocationString fornisce la parte specifica del dispositivo della proprietà SPDRP_LOCATION_PATHS del dispositivo.