Création de pilotes d’exportation
Un pilote d’exportation est une DLL en mode noyau qui peut être chargée par divers autres composants spécifiques au matériel ou à la pile de périphériques, mais qui n’a pas certaines des caractéristiques d’un pilote en mode noyau complet. Plus précisément, un pilote d’exportation n’a pas de table de répartition, il n’a pas de place dans la pile des pilotes et il n’a pas d’entrée dans la base de données du gestionnaire de contrôle de service qui le définit comme un service système. Bien qu’un pilote d’exportation ne dispose pas d’une table de répartition, il peut fournir des routines de distribution à un pilote standard. Le pilote standard insère les routines de distribution dans sa propre table de répartition. Un pilote d’exportation a une routine DriverEntry stub qui n’est jamais appelée.
Les pilotes d’exportation en mode noyau sont particulièrement adaptés à l’implémentation de la partie d’une paire de pilotes indépendante des caractéristiques matérielles et de pile sous-jacentes.
Windows inclut plusieurs pilotes d’exportation chargés par d’autres pilotes, par exemple :
- Pilote de port SCSI
- Pilote de classe de bande
- Les pilotes de contrôleur IDE sont tous des pilotes d’exportation fournis par le système
Les pilotes standard peuvent également fonctionner en tant que pilotes d’exportation. Pour qu’un pilote fonctionne dans les deux sens, il doit être généré en tant que pilote d’exportation et chargé en tant que pilote standard.
Génération d’un pilote d’exportation
Pour créer un pilote d’exportation dans Visual Studio, procédez comme suit :
- Créez un projet à partir d’un modèle, tel que Pilote WDM vide.
- Ajoutez un fichier de définition de module au projet, par exemple :
LIBRARY mydriver.sys
EXPORTS
DllInitialize PRIVATE
DllUnload PRIVATE
Le point d’entrée d’une DLL en mode noyau est toujours DllInitialize. Le système appelle la routine DllInitialize d’une DLL en mode noyau immédiatement après le chargement de la DLL. Les pilotes d’exportation doivent fournir des routines DllInitialize . Vous pouvez utiliser la routine DllInitialize pour acquérir ou initialiser les ressources requises par d’autres routines dans la DLL.
Vous ne pouvez pas spécifier le point d’entrée à l’aide de la macro DLLENTRY .
NTSTATUS DllInitialize(
_In_ PUNICODE_STRING RegistryPath
);
RegistryPath est un pointeur vers une chaîne Unicode comptée spécifiant le chemin d’accès à la clé de Registre de la DLL, HKEY_LOCAL_MACHINE\CurrentControlSet\Services\DllName. Les routines DLL peuvent utiliser cette clé pour stocker des informations spécifiques à la DLL. La mémoire tampon pointée par RegistryPath est libérée une fois DllInitialize terminée. Par conséquent, si la DLL utilise la clé, DllInitialize doit dupliquer le nom de la clé.
Le processus de génération génère une bibliothèque d’exportation avec une extension .lib et un pilote d’exportation avec une extension .sys.
Importation de fonctions à partir d’un pilote d’exportation
Pour importer des fonctions exportées par un pilote d’exportation, vous devez déclarer les fonctions à l’aide de la macro DECLSPEC_IMPORT, qui est définie dans Ntdef.h. Par exemple :
DECLSPEC_IMPORT int LoadPrinterDriver (int arg1);
Cette macro est résolue en une déclaration de classe de stockage __declspec(dllimport) sur ces plateformes lorsque cela est nécessaire et en rien sur ces plateformes lorsque cela n’est pas nécessaire.
Dans le pilote d’exportation, la fonction à exporter doit être déclarée avec la macro DECLSPEC_EXPORT. Cette macro est résolue en une déclaration de classe de stockage __declspec(dllexport) sur ces plateformes si nécessaire et en rien sur ces plateformes lorsque ce n’est pas nécessaire. Si un pilote d’exportation fournit une routine de distribution à un pilote standard, cette routine n’a pas besoin d’être exportée.
Chargement et déchargement d’un pilote d’exportation
Les pilotes d’exportation doivent être installés dans le répertoire %Windir%\System32\Drivers. À compter de Windows 2000, le système d’exploitation conserve un nombre de références qui indique le nombre de fois que les fonctions du pilote d’exportation ont été importées par d’autres pilotes. Le système décrémente ce nombre chaque fois que l’un des pilotes d’importation se décharge. Lorsque le nombre de références tombe à zéro, le système décharge le pilote d’exportation. Toutefois, le pilote d’exportation doit contenir les routines de point d’entrée et de déchargement standard, DllInitialize et DllUnload, sinon le système d’exploitation n’active pas ce mécanisme de nombre de références.
Le système appelle la routine DllUnload d’une DLL en mode noyau lorsqu’il décharge la DLL.
NTSTATUS DllUnload(void);
Les pilotes d’exportation doivent fournir des routines DllUnload. Vous pouvez utiliser la routine DllUnload pour libérer toutes les ressources utilisées par les routines dans la DLL.