Condividi tramite


Specificare l'ordine di caricamento dei driver

Per la maggior parte dei sistemi, la gerarchia fisica dei dispositivi su un computer determina l'ordine in cui Windows e il gestore PnP caricano i driver. Windows e il manager PnP configurano i dispositivi a partire dal dispositivo radice del sistema e quindi configurano i dispositivi figlio del dispositivo radice (ad esempio, una scheda PCI), gli elementi figlio di tali dispositivi e così via. Il gestore PnP carica i driver per ogni dispositivo durante la configurazione del dispositivo, se i driver non sono stati caricati in precedenza per un altro dispositivo.

Le impostazioni nel file INF possono influenzare l'ordine di caricamento del driver. Questo argomento descrive i valori pertinenti che i fornitori devono specificare nella sezione di installazione del servizio di un driver INF AddService directive. In particolare, questo argomento illustra le voci StartType, BootFlags, LoadOrderGroup e Dependencies .

I driver devono seguire queste regole per specificare StartType:

  • Driver PnP non necessario all'inizio dell'avvio

    Un driver PnP deve avere un tipo di avvio pari a SERVICE_DEMAND_START (0x3), specificando che il gestore PnP può caricare il driver quando trova un dispositivo che il driver supporta.

  • Driver per un dispositivo necessario per avviare il computer

    Se un dispositivo è necessario per avviare il computer, i driver per il dispositivo devono avere un tipo di avvio di SERVICE_BOOT_START (0x0).

  • Driver non di avvio che rileva i dispositivi che non sono PnP-enumerabili

    Per un dispositivo che non è PnP-enumerable, un driver segnala il dispositivo al gestore PnP chiamando IoReportRootDevice o IoReportDetectedDevice. Tale driver deve avere il tipo di avvio SERVICE_SYSTEM_START (0x01) in modo che Windows caricherà il driver durante l'inizializzazione del sistema.

    Solo i driver che segnalano hardware non PnP devono impostare questo tipo di avvio. Se un driver gestisce dispositivi sia PnP che non PnP, dovrebbe impostare questo tipo di avvio.

  • Driver non PnP che deve essere avviato dal gestore di controllo del servizio

    Tale driver deve avere il tipo di avvio SERVICE_AUTO_START (0x02). I driver PnP non devono impostare questo tipo di avvio.

È necessario scrivere un driver PnP in modo che possa essere caricato quando Windows configura un dispositivo che i servizi driver. Viceversa, un driver dovrebbe poter essere disattivato ogni volta che il gestore PnP determina che non ci sono più dispositivi presenti che il driver gestisce. Gli unici ordini di carico dei driver da cui devono dipendere i driver PnP sono i seguenti:

  1. I driver per un dispositivo figlio possono dipendere dal caricamento dei driver per il dispositivo padre.

  2. Un driver nello stack di dispositivi può dipendere dal fatto che i driver che si trovano al di sotto di esso siano caricati.

    Ad esempio, il driver di funzione può essere certo che tutti i driver con filtro inferiore vengano caricati.

    Tenere tuttavia presente che un driver nello stack di dispositivi non può dipendere dal caricamento sequenziale dopo i driver inferiori di un dispositivo, perché il driver potrebbe essere stato caricato in precedenza quando è stato configurato un altro dispositivo.

I driver di filtro in un gruppo di filtri non possono prevedere l'ordinamento del carico. Ad esempio, se un dispositivo ha tre driver di filtro superiore registrati, questi tre driver verranno caricati tutti dopo il driver di funzione, ma potrebbero essere caricati in qualsiasi ordine all'interno del gruppo di filtri superiore.

Se un driver ha una dipendenza esplicita dell'ordine di carico da un altro driver, tale dipendenza deve essere implementata tramite una relazione padre/figlio. Un driver per un dispositivo figlio può dipendere dai driver per il dispositivo padre caricato prima del caricamento dei driver figlio.

Per rafforzare l'importanza di impostare il valore StartType corretto, l'elenco seguente descrive in che modo Windows e il gestore PnP usano le voci StartType nei file INF:

  1. All'avvio del sistema, il caricatore del sistema operativo carica i driver di tipo SERVICE_BOOT_START prima di trasferire il controllo al kernel. Questi driver sono in memoria quando il kernel ottiene il controllo.

    I driver di avvio vengono caricati prima della configurazione della maggior parte dei dispositivi, quindi l'ordine di carico non può essere determinato dalla gerarchia dei dispositivi. I driver di avvio possono usare le voci INF LoadOrderGroup per ordinare il caricamento. Il sistema operativo ignora le voci Dipendenze INF per i driver di avvio.

  2. Il gestore PnP chiama le routine DriverEntry dei driver SERVICE_BOOT_START in modo che i driver possano gestire i dispositivi di avvio.

    Se un dispositivo di avvio include dispositivi subordinati, questi dispositivi vengono enumerati. I dispositivi figlio vengono configurati e avviati se i driver sono anche driver di avvio. Se i driver di un dispositivo non sono tutti i driver di avvio di avvio, il gestore PnP crea un nodo del dispositivo (devnode) per il dispositivo ma non avvia ancora il dispositivo.

  3. Dopo che tutti i driver di avvio sono stati caricati e i dispositivi di avvio sono stati avviati, il gestore PnP configura il resto dei dispositivi PnP e carica i driver.

    Il manager PnP guida l'albero dei dispositivi e carica i driver per i devnodes che non sono ancora stati avviati( ovvero gli eventuali devnodes non avviati dal passaggio precedente). All'avvio di ogni dispositivo, il gestore PnP enumera gli elementi figli del dispositivo, se presenti.

    Durante la configurazione di questi dispositivi, il gestore PnP carica i driver per i dispositivi, indipendentemente dai valori StartType dei driver (tranne quando StartType è SERVICE_DISABLED) prima di procedere all'avvio dei dispositivi. Molti di questi driver sono SERVICE_DEMAND_START driver.

    Il gestore PnP ignora le voci del Registro di sistema create come risultato delle voci delle dipendenze INF e delle voci LoadOrderGroup per i driver caricati in questo passaggio. L'ordinamento del carico si basa sulla gerarchia dei dispositivi fisici.

    Al termine di questo passaggio, tutti i dispositivi vengono configurati, ad eccezione dei dispositivi non enumerabili PnP e dei discendenti di tali dispositivi. I discendenti potrebbero essere o meno enumerabili PnP.

  4. Il gestore PnP carica i driver di StartType SERVICE_SYSTEM_START non ancora caricati.

    Questi driver rilevano e segnalano i dispositivi non PnP. Il gestore PnP elabora le voci del Registro di sistema che sono il risultato delle voci INF LoadOrderGroup per questi driver. Ignora le voci del Registro di sistema create a causa delle voci delle dipendenze INF per questi driver.

  5. Gestione controllo del servizio carica i driver di StartType SERVICE_AUTO_START non ancora caricati.

    Il gestore del controllo del servizio elabora le informazioni del database del servizio in relazione ai servizi DependOnGroup e DependOnServices. Queste informazioni provengono dalle voci Dependencies nelle voci INF AddService . Tenere presente che le informazioni sulle dipendenze vengono elaborate solo per i driver non PnP perché tutti i driver PnP necessari sono stati caricati in un passaggio precedente dell'avvio del sistema. Il gestore del controllo del servizio ignora le informazioni INF LoadOrderGroup.

    Per altre informazioni su Gestione controllo dei servizi, vedere la documentazione di Microsoft Windows SDK.

Uso di BootFlags per alzare di livello il startType di un driver all'avvio a seconda dello scenario di avvio

Il sistema operativo può alzare di livello startType di un driver come driver di avvio a seconda del valore BootFlags specificato nell'INF del driver. È possibile specificare uno o più valori numerici (ORed) seguenti nel file INF, espressi come valore esadecimale:

  • Se un driver deve essere alzato di livello come driver di avvio all'avvio di rete, specificare 0x1 (CM_SERVICE_NETWORK_BOOT_LOAD).
  • Se un driver deve essere alzato di livello all'avvio da un disco rigido virtuale, specificare 0x2 (CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD)
  • Se un driver deve essere alzato di livello durante l'avvio da un disco USB, specificare 0x4 (CM_SERVICE_USB_DISK_BOOT_LOAD).
  • Se un driver deve essere alzato di livello durante l'avvio dall'archiviazione SD, specificare 0x8 (CM_SERVICE_SD_DISK_BOOT_LOAD)
  • Se un driver deve essere alzato di livello durante l'avvio da un disco in un controller USB 3.0, specificare 0x10 (CM_SERVICE_USB3_DISK_BOOT_LOAD).
  • Se un driver deve essere alzato di livello durante l'avvio con avvio misurato abilitato, specificare 0x20 (CM_SERVICE_MEASURED_BOOT_LOAD).
  • Se un driver deve essere promosso mentre l'avvio con il verificatore è abilitato, specificare 0x40 (CM_SERVICE_VERIFIER_BOOT_LOAD).
  • Se un driver deve essere alzato di livello nell'avvio WinPE, specificare 0x80 (CM_SERVICE_WINPE_BOOT_LOAD).

Per altre informazioni sulla promozione di StartType di un driver all'avvio, a seconda dello scenario di avvio, vedere direttiva INF AddService.