Sequenza di avvio

Poiché il driver dell'adattatore viene installato come servizio driver in modalità kernel, il sistema operativo carica il driver dell'adattatore in fase di avvio del sistema e chiama la routine DriverEntry del driver. La routine DriverEntry riceve due parametri: un oggetto driver e un nome del percorso del Registro di sistema. DriverEntry deve chiamare la funzione PortCls PcInitializeAdapterDriver con i parametri driver-object e registry-path name più un terzo parametro, che è un puntatore alla funzione AddDevice del driver dell'adattatore.

Nell'esempio seguente la funzione DriverEntry del driver passa il puntatore MyAddDevicea funzione , che punta alla funzione AddDevice del driver, come terzo parametro della routine PcInitializeAdapterDriver .

NTSTATUS 
  DriverEntry( 
    PDRIVER_OBJECT  DriverObject,
    PUNICODE_STRING  RegistryPath
    )
  {
      return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
  }

La routine PcInitializeAdapterDriver installa la routine AddDevice fornita nell'estensione driver dell'oggetto driver e installa i gestori IRP del driver PortCls nell'oggetto driver stesso.

Il codice seguente è un'implementazione di esempio della funzione del MyAddDevice driver.

#define MAX_MINIPORTS 6    // maximum number of miniports
NTSTATUS
  MyAddDevice(
    PDRIVER_OBJECT  DriverObject,
    PDEVICE_OBJECT  PhysicalDeviceObject 
    )
  {
      return PcAddAdapterDevice(DriverObject, PhysicalDeviceObject, MyStartDevice,
                                MAX_MINIPORTS, 0);
  }

Questa funzione chiama la funzione PortCls PcAddAdapterDevice, che crea il dispositivo adattatore specificato, associa un driver al dispositivo e archivia un puntatore alla funzione del driver dell'adattatore MyStartDevice , che viene chiamato quando il sistema operativo avvia il dispositivo (vedere Avvio di un dispositivo). La routine PcAddAdapterDevice crea un oggetto dispositivo funzionale (FDO) e lo associa all'oggetto dispositivo fisico (PDO) fornito dal sistema. Il nuovo fdO viene creato con un'estensione usata da PortCls per archiviare le informazioni di contesto sul dispositivo. Questo contesto include il puntatore a MyStartDevice funzione fornito da MyAddDevice.

Dopo che il sistema operativo determina le risorse (interrupt, canali DMA, indirizzi di porta I/O e così via) da assegnare al dispositivo, invia al dispositivo una richiesta di avvio (IRP_MN_START_DEVICE). In risposta a questa richiesta, il gestore della richiesta nel driver PortCls chiama la funzione del driver dell'adattatore MyStartDevice , come illustrato nel codice di esempio seguente:

NTSTATUS
  MyStartDevice(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp,
    PRESOURCELIST ResourceList
    )
  {
    ...
  }

Il gestore della richiesta fornisce puntatori MyStartDevice all'oggetto dispositivo, IRP_MN_START_DEVICE richiesta e elenco di risorse (vedere IResourceList). La MyStartDevice funzione partiziona l'elenco di risorse nelle risorse necessarie per ogni driver miniport che deve essere avviato. La funzione avvia quindi ogni driver miniport e restituisce il controllo a PortCls, che completa l'IRP e restituisce il controllo al sistema operativo.

Per altri esempi di codice di avvio del driver, vedere i driver di adattatore audio di esempio in Microsoft Windows Driver Kit (WDK).