Choisir entre le mode utilisateur ou le mode noyau
Important
La plateforme d’impression moderne est le moyen privilégié de Windows pour communiquer avec les imprimantes. Nous vous recommandons d’utiliser le pilote de classe IPP en boîte de Microsoft, ainsi que les applications de support d’impression (PSA), pour personnaliser l’expérience d’impression dans Windows 10 et 11 pour le développement de périphériques d’impression.
Pour plus d’informations, veuillez consulter les articles Plateforme d’impression moderne et Guide de conception des applications de support d’impression.
L’exécution en mode utilisateur des DLL de graphiques d’imprimante offre les avantages suivants par rapport à l’exécution en mode noyau :
Espace de pile illimité.
Accès aux API Win32.
Moins de risque de provoquer des plantages du système.
Débogage plus facile, avec des débogueurs en mode utilisateur.
De meilleures fonctionnalités en virgule flottante, car l’utilisation de fonctions en virgule flottante de DDI graphiques n’est pas nécessaire.
Possibilité d’appeler des DLL en mode utilisateur personnalisées et fournies par le fournisseur qui ne font pas partie de l’architecture de pilote d’imprimante Microsoft Windows 2000 et versions ultérieures
Dans Windows Vista, il n’est pas possible d’installer un pilote d’imprimante en mode noyau. Si une application tente de le faire, les fonctions AddPrinterDriver et AddprinterDriverEx (décrites dans la documentation du SDK Windows) échouent avec le code d’erreur ERROR_KM_DRIVER_BLOCKED.
Le tableau suivant présente les modes d’exécution de pilote d’imprimante autorisés :
Version du système d'exploitation | Mode d’exécution de la DLL de graphiques d’imprimante autorisé |
---|---|
Windows NT 4.0 | kernel |
Windows 2000 | utilisateur ou noyau |
Windows XP et Server 2003 | mode noyau disponible pour les imprimantes existantes ; mode utilisateur requis pour les nouvelles installations d’imprimante |
Windows Vista | utilisateur |
Utilisation de DDI de graphiques en mode utilisateur
Une DLL de graphiques d’imprimante en mode utilisateur n’est pas limitée à l’appel des Services de support GDI et autres fonctions de rappel de DDI de graphiques avec préfixe en Eng. Toutefois, certaines règles doivent être respectées :
Comme les DLL de graphiques en mode noyau, les DLL de graphiques en mode utilisateur doivent appeler les DDI de graphiques qui créent ou modifient une surface de dessin. Ces fonctions de rappel sont les Services de support GDI et l’appel des équivalents Win32 de ces fonctions de dessin n’est pas autorisé.
Pour les DLL en mode utilisateur, les appels à ces fonctions de rappel de dessin sont interceptés par le client GDI en mode utilisateur, qui transmet ensuite les appels au moteur de rendu graphique en mode noyau GDI (GRE).
La liste suivante des fonctions de DDI de graphiques avec préfixe en Eng ne peut pas être appelée par des DLL en mode utilisateur :
Les DLL de graphiques d’imprimante en mode utilisateur peuvent continuer à utiliser des fonctions de DDI graphiques pour les services GDI en virgule flottante.
Conversion d’une DLL de graphiques d’imprimante existante en mode utilisateur
Si vous avez déjà développé une DLL de graphiques d’imprimante qui s’exécute en mode noyau, vous pouvez convertir la DLL pour une exécution en mode utilisateur. Pour la convertir, ajoutez une fonction DrvQueryDriverInfo à la DLL, puis suivez les règles de création d’une DLL de graphiques d’imprimante.
Création d’une nouvelle DLL de graphiques d’imprimante en mode utilisateur
Pour développer une nouvelle DLL de graphiques d’imprimante qui s’exécute en mode utilisateur, vous pouvez continuer à utiliser toutes les fonctions DDI de graphiques utilisées par les DLL en mode noyau. Toutefois, vous disposez également des options suivantes :
Pour les fonctions avec préfixe en Eng qui ont des équivalents Win32 exacts, il est recommandé d’appeler les fonctions Win32. Le tableau suivant répertorie ces fonctions avec préfixe en Eng, ainsi que leurs équivalents Win32.
Fonction avec préfixe en Eng Équivalent Win32 EngAllocMem HeapAlloc EngAllocUserMem HeapAlloc EngEnumForms EnumForms EngFreeMem HeapFree EngFreeUserMem HeapFree EngFindImageProcAddress GetProcAddress EngGetForm GetForm EngGetLastError GetLastError EngGetPrinter GetPrinter EngGetPrinterData GetPrinterData EngGetPrinterDriver GetPrinterDriver EngLoadImage LoadLibrary EngMulDiv MulDiv EngSetLastError SetLastError EngSetPrinterData SetPrinterData EngUnloadImage FreeLibrary EngWritePrinter WritePrinter Pour les fonctions avec préfixe en Eng qui correspondent aux fonctions Win32 avec des fonctionnalités similaires, il est également recommandé d’appeler les fonctions Win32. Le tableau suivant répertorie plusieurs de ces fonctions avec préfixe en Eng, ainsi que leurs équivalents Win32.
Fonction avec préfixe en Eng Équivalent Win32 EngAcquireSemaphore EnterCriticalSection EngCreateSemaphore Allouez un objet CRITICAL_SECTION et initialisez-le à l’aide d’un appel à la fonction Win32 InitializeCriticalSection. EngDeleteSemaphore DeleteCriticalSection EngFindResource FindResource EngFreeModule FreeLibrary EngLoadModule LoadLibrary EngMultiByteToWideChar MultiByteToWideChar EngQueryLocalTime GetLocalTime EngReleaseSemaphore ReleaseSemaphore EngWideCharToMultiByte WideCharToMultiByte Pour les fonctions qui créent ou modifient un service de dessin, les nouveaux pilotes doivent continuer à appeler les services de support GDI et non leurs équivalents Win32.
Au lieu d’utiliser des fonctions DDI de graphiques pour les Services GDI en virgule flottante, vous pouvez utiliser le type de données FLOAT.