Séquence de démarrage
Étant donné que le pilote d’adaptateur est installé en tant que service de pilote en mode noyau, le système d’exploitation charge le pilote de l’adaptateur au moment du démarrage du système et appelle la routine DriverEntry du pilote. La routine DriverEntry reçoit deux paramètres : un objet de pilote et un nom de chemin d’accès au Registre. DriverEntry doit appeler la fonction PortCls PcInitializeAdapterDriver avec les paramètres driver-object et registry-path name ainsi qu’un troisième paramètre, qui est un pointeur vers la fonction AddDevice du pilote d’adaptateur.
Dans l’exemple suivant, la fonction DriverEntry du pilote transmet le pointeur MyAddDevice
de fonction , qui pointe vers la fonction AddDevice du pilote, comme troisième paramètre de la routine PcInitializeAdapterDriver .
NTSTATUS
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
}
La routine PcInitializeAdapterDriver installe la routine AddDevice fournie dans l’extension du pilote de l’objet pilote et installe les gestionnaires IRP du pilote PortCls dans l’objet pilote lui-même.
Le code suivant est un exemple d’implémentation de la fonction du MyAddDevice
pilote.
#define MAX_MINIPORTS 6 // maximum number of miniports
NTSTATUS
MyAddDevice(
PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT PhysicalDeviceObject
)
{
return PcAddAdapterDevice(DriverObject, PhysicalDeviceObject, MyStartDevice,
MAX_MINIPORTS, 0);
}
Cette fonction appelle la fonction PortCls PcAddAdapterDevice, qui crée le périphérique d’adaptateur spécifié, associe un pilote à l’appareil et stocke un pointeur vers la fonction du MyStartDevice
pilote d’adaptateur, appelée lorsque le système d’exploitation démarre l’appareil (voir Démarrage d’un appareil). La routine PcAddAdapterDevice crée un objet d’appareil fonctionnel (FDO) et l’associe à l’objet d’appareil physique (PDO) fourni par le système. Le nouveau FDO est créé avec une extension que PortCls utilise pour stocker des informations de contexte sur l’appareil. Ce contexte inclut le pointeur de MyStartDevice
fonction fourni par MyAddDevice
.
Une fois que le système d’exploitation a déterminé les ressources (interruptions, canaux DMA, adresses de port d’E/S, etc.) à affecter à l’appareil, il envoie à l’appareil une demande de démarrage (IRP_MN_START_DEVICE). En réponse à cette demande, le gestionnaire de demandes dans le pilote PortCls appelle la fonction du pilote de MyStartDevice
l’adaptateur, qui est illustrée dans l’exemple de code suivant :
NTSTATUS
MyStartDevice(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PRESOURCELIST ResourceList
)
{
...
}
Le gestionnaire de requêtes fournit MyStartDevice
des pointeurs vers l’objet d’appareil, IRP_MN_START_DEVICE requête et la liste de ressources (voir IResourceList). La MyStartDevice
fonction partitionne la liste des ressources dans les ressources requises pour chaque pilote miniport à démarrer. La fonction démarre ensuite chaque pilote miniport et retourne le contrôle à PortCls, ce qui termine l’IRP et retourne le contrôle au système d’exploitation.
Pour plus d’exemples de code de démarrage de pilote, consultez les exemples de pilotes d’adaptateur audio dans le Kit de pilotes Microsoft Windows (WDK).