Partager via


Responsabilités facultatives de DriverEntry

Selon la position d’un pilote particulier dans une chaîne de pilotes en couches, la nature de l’appareil sous-jacent et la conception du pilote, une routine DriverEntry peut également être responsable des tâches suivantes :

  • Appel à IoAllocateDriverObjectExtension afin de créer et d'initialiser une extension d'objet de pilote, dans le cas où le pilote nécessite un stockage pour les données à l'échelle du pilote. L’extension d’objet du pilote est une structure de données spécifique au pilote. Par exemple, un pilote peut utiliser son extension d’objet pilote pour stocker un chemin d’accès au 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 seul paramètre PVOID d’entrée.

  • Inscription d’une routine de réinitialisation . (Voir Écrire 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 miniport ou un pilote de mini-classe spécifique à un appareil peut avoir en collaboration avec un pilote de port ou de classe. Pour plus d’informations, consultez la documentation spécifique du type d’appareil dans le Kit de pilotes Windows (WDK).

Fourniture de stockage pour les ressources système

Allouez des objets par appareil dans la routine AddDevice ou dans la routine Dispatch qui gère la requête pnP IRP_MN_START_DEVICE , 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 globales du pilote. Si c’est le cas, la routine DriverEntry peut appeler une (ou plusieurs) des routines suivantes :

Chaque routine DriverEntry s’exécute dans le contexte d’un thread système à IRQL = PASSIVE_LEVEL. Par conséquent, toute mémoire allouée avec ExAllocatePoolWithTag qui est destinée à être utilisée exclusivement pendant l'initialisation peut provenir du pool paginé, à condition que le pilote ne contrôle pas l'appareil contenant le fichier de pagination 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 dans le Registre. Les pilotes PnP, d’autre part, ne réclament pas de ressources matérielles à partir du registre ni n'assignent directement les besoins en ressources au 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 requête PnP IRP_MN_START_DEVICE.

Les pilotes qui n’interagissent pas directement avec le gestionnaire PnP, tels que certains pilotes miniports, peuvent avoir des exigences de création de rapports différentes imposées par une classe ou un pilote 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 spécifiques à 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 informations dont il a besoin pour initialiser le pilote, ou 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 de 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 le pointeur lui-même, car le pointeur n’est plus valide une fois DriverEntry retourné.