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 MyAddDevice
a 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).