Responsabilités facultatives de DriverEntry
Selon la position d’un pilote particulier dans une chaîne de pilotes en couches, la nature du périphérique sous-jacent et la conception du pilote, une routine DriverEntry peut également être responsable des éléments suivants :
Appel d’IoAllocateDriverObjectExtension pour créer et initialiser une extension d’objet de pilote, si le pilote nécessite un stockage pour les données à l’échelle du pilote. L’extension d’objet de pilote est une structure de données spécifique au pilote. Par exemple, un pilote peut utiliser son extension d’objet de pilote pour stocker un chemin d’accès de Registre ou d’autres informations globales.
Appel de PsCreateSystemThread pour créer des threads de travail exécutifs, si le pilote est un pilote de niveau supérieur (tel qu’un pilote de système de fichiers) qui utilise ces threads. Dans ce cas, le pilote doit également avoir une routine de rappel de type WORKER_THREAD_ROUTINE, qui prend un paramètre PVOID d’entrée unique.
Inscription d’une routine Reinitialize . (Voir Écriture d’une routine de réinitialisation.)
Gestion des exigences d’initialisation spécifiques à la classe qui diffèrent de celles décrites ici, telles que celles qu’un pilote miniport ou miniclass spécifique à un appareil fonctionnant en tandem avec un pilote de port ou de classe peut avoir. Pour plus d’informations, consultez la documentation spécifique au type d’appareil dans le Kit de pilotes Windows (WDK).
Fourniture de stockage pour les ressources système
Les objets par appareil doivent être alloués dans la routine AddDevice ou dans la routine Dispatch qui gère la demande de IRP_MN_START_DEVICE PnP, et non dans DriverEntry.
Toutefois, un pilote peut avoir besoin d’allouer de la mémoire d’espace système supplémentaire pour d’autres utilisations à l’échelle du pilote. Dans ce cas, la routine DriverEntry peut appeler une (ou plusieurs) des routines suivantes :
IoAllocateDriverObjectExtension, pour créer une zone de contexte associée à l’objet driver
ExAllocatePoolWithTag pour la mémoire d’espace système paginée ou non paginée
MmAllocateNonCachedMemory ou MmAllocateContiguousMemory pour la mémoire de l’espace système non aligné sur le cache (utilisée pour les mémoires tampons d’E/S)
Chaque routine DriverEntry est exécutée dans le contexte d’un thread système à IRQL = PASSIVE_LEVEL. Par conséquent, toute mémoire allouée avec ExAllocatePoolWithTag pour une utilisation exclusive pendant l’initialisation peut provenir d’un pool paginé, tant que le pilote ne contrôle pas l’appareil qui contient le fichier de page système. La mémoire allouée doit être libérée avec ExFreePool avant que DriverEntry retourne le contrôle. Toutefois, un pilote qui définit une routine Reinitialize peut passer un pointeur vers cette mémoire lorsqu’il appelle IoRegisterDriverReinitialization, ce qui rend la routine Reinitialize du pilote responsable de la libération de l’allocation de mémoire.
Revendication de ressources matérielles
Les pilotes non PnP plus anciens revendiquaient des ressources auprès du Registre. En revanche, les pilotes PnP ne revendiquent pas les ressources de périphérique et n’écrivent pas directement les exigences en matière de ressources dans le Registre. Au lieu de cela, ces pilotes signalent les exigences en réponse à certains IRP PnP, dans le cadre du processus d’énumération du gestionnaire PnP. Un pilote PnP reçoit ses ressources allouées dans une demande de IRP_MN_START_DEVICE PnP.
Les pilotes qui n’interagissent pas directement avec le gestionnaire PnP, tels que certains pilotes miniport, peuvent avoir des exigences de création de rapports différentes imposées par un pilote de classe ou de port qui interagit avec le gestionnaire PnP. Ces exigences sont spécifiques à la classe d’appareil. Pour plus d’informations spécifiques à l’appareil et à la classe, consultez la documentation relative à la classe d’appareil appropriée dans le Kit de pilotes Windows (WDK).
Utilisation du Registre
Une routine DriverEntry peut utiliser le Registre pour obtenir certaines des informations dont elle a besoin pour initialiser le pilote, ou elle peut définir des informations dans le Registre pour d’autres pilotes ou sous-systèmes protégés à utiliser. La nature des informations dépend du type d’appareil. Les pilotes peuvent accéder au registre à l’aide des routines ZwXxx et RtlXxx . Le paramètre RegistryPath de la routine DriverEntry pointe vers une chaîne Unicode comptée qui spécifie un chemin d’accès à la clé de Registre du pilote, \Registry\Machine\System\CurrentControlSet\Services\*DriverName. La routine doit enregistrer une copie de la chaîne, et non du pointeur lui-même, car le pointeur n’est plus valide après le retour de *DriverEntry.