Condividi tramite


Specifica dell'ordine di carico del driver

Per la maggior parte dei sistemi, la gerarchia fisica dei dispositivi in un computer determina l'ordine in cui Windows e i driver di carico di gestione PnP. Windows e gestione PnP configurano i dispositivi a partire dal dispositivo radice del sistema e quindi configurano i dispositivi figlio del dispositivo radice (ad esempio, un adattatore PCI), i figli di tali dispositivi e così via. Il gestore PnP carica i driver per ogni dispositivo quando il dispositivo è configurato, se i driver non sono stati caricati in precedenza per un altro dispositivo.

Le impostazioni nel file INF possono influenzare l'ordine di carico del driver. In questo argomento vengono descritti i valori pertinenti che i fornitori devono specificare nella sezione installazione del servizio a cui fa riferimento la direttiva INF AddService di un driver. In particolare, questo argomento illustra le voci StartType, BootFlags, LoadOrderGroup e Dipendenze .

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 inizio di SERVICE_DEMAND_START (0x3), specificando che il gestore PnP può caricare il driver quando il gestore PnP trova un dispositivo che i servizi driver.

  • Driver per un dispositivo necessario per avviare il computer

    Se è necessario avviare il computer, i driver per il dispositivo devono avere un tipo di inizio 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 alla gestione PnP chiamando IoReportRootDevice o IoReportDetectedDevice. Tale driver deve avere il tipo di inizio 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 inizio. Se un driver fornisce sia dispositivi PnP che non PnP, deve impostare questo tipo di avvio.

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

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

Un driver PnP deve essere scritto in modo che possa essere caricato quando Windows configura un dispositivo che i servizi driver. Al contrario, un driver deve essere in grado di essere scaricato qualsiasi volta che il gestore PnP determina che non sono più presenti i dispositivi che i servizi driver. L'unico ordinamento del carico del driver che i driver PnP devono dipendere sono i seguenti:

  1. I driver per un dispositivo figlio possono dipendere dal fatto che i driver per il dispositivo padre vengono caricati.

  2. Un driver nello stack di dispositivi può dipendere dal fatto che tutti i driver seguenti vengono caricati.

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

    Tuttavia, tenere 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 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 che vengano caricati i driver figlio.

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

  1. All'avvio del sistema operativo 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 che la maggior parte dei dispositivi sia configurata, 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 delle 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 eseguire il servizio dei dispositivi di avvio.

    Se un dispositivo di avvio include dispositivi figlio, 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, il gestore PnP crea un nodo 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 vengono avviati, il gestore PnP configura il resto dei dispositivi PnP e carica i driver.

    Il gestore PnP illustra l'albero dei dispositivi e carica i driver per i devnodes non ancora avviati, ovvero gli eventuali devnodes non avviati dal passaggio precedente. Quando viene avviato ogni dispositivo, il gestore PnP enumera gli elementi figlio del dispositivo, se presenti.

    Poiché configura 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 per avviare i 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 di dipendenze INF e le voci LoadOrderGroup per i driver caricati in questo passaggio. L'ordinamento del carico si basa sulla gerarchia del dispositivo fisico.

    Alla fine di questo passaggio, tutti i dispositivi vengono configurati, tranne i dispositivi che non sono PnP-enumerabili e i discendenti di tali dispositivi. I discendenti potrebbero o non essere PnP-enumerable.

  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. Il gestore del controllo del servizio carica i driver di StartType SERVICE_AUTO_START non ancora caricati.

    Il gestore del controllo del servizio elabora le informazioni sul database del servizio rispetto ai servizi' DependOnGroup e DependOnServices. Queste informazioni provengono dalle voci Dipendenze nelle voci DIF 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. Gestione controllo del servizio ignora le informazioni inF LoadOrderGroup .

    Per altre informazioni sulla gestione del controllo del servizio, vedere la documentazione Microsoft Windows SDK.

Uso di BootFlags per promuovere startType di un driver all'avvio a seconda dello scenario di avvio

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

  • Se un driver deve essere promosso come driver di avvio in avvio di rete, specificare 0x1 (CM_SERVICE_NETWORK_BOOT_LOAD ).
  • Se un driver deve essere promosso all'avvio da un disco rigido virtuale, specificare 0x2 (CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD )
  • Se un driver deve essere promosso durante l'avvio da un disco USB, specificare 0x4 (CM_SERVICE_USB_DISK_BOOT_LOAD ).
  • Se un driver deve essere promosso durante l'avvio dall'archiviazione SD, specificare 0x8 (CM_SERVICE_SD_DISK_BOOT_LOAD )
  • Se un driver deve essere promosso 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 promosso durante l'avvio con avvio misurato abilitato, specificare 0x20 (CM_SERVICE_MEASURED_BOOT_LOAD ).
  • Se un driver deve essere promosso durante l'avvio con l'avvio del verificatore abilitato, specificare 0x40 (CM_SERVICE_VERIFIER_BOOT_LOAD ).
  • Se un driver deve essere promosso 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.