Choisir le mode utilisateur ou le mode noyau
Important
Nous vous recommandons d’utiliser le pilote de classe de boîte de réception IPP 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’imprimante.
Pour plus d’informations, consultez le Guide de conception de l’application de support d’impression.
L’exécution en mode utilisateur des DLL 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 système.
Débogage plus facile, avec des débogueurs en mode utilisateur.
De meilleures fonctionnalités à virgule flottante, car l’utilisation de fonctions graphiques à virgule flottante DDI n’est pas nécessaire.
Possibilité d’appeler des DLL personnalisées en mode utilisateur fournies par le fournisseur qui ne font pas partie de l’architecture de pilote d’imprimante Microsoft Windows 2000 et ultérieure décrite
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 du pilote d’imprimante autorisés :
Version du système d'exploitation | Mode d’exécution autorisé de la DLL graphique de l’imprimante |
---|---|
Windows NT 4.0 | noyau |
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’imprimantes |
Windows Vista | utilisateur |
Utilisation de la DDI graphique en mode utilisateur
Une DLL graphique d’imprimante en mode utilisateur n’est pas limitée à l’appel des services de support GDI et d’autres fonctions de rappel DDI graphiques préfixées. Toutefois, certaines règles doivent être suivies :
Comme les DLL graphiques en mode noyau, les DLL graphiques en mode utilisateur doivent appeler les DLL graphiques qui créent ou modifient une surface de dessin. Ces fonctions de rappel sont les services de support GDI, et l’appel d’é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 (GRE) en mode noyau de GDI.
La liste suivante de fonctions DDI graphiques préfixées ne peut pas être appelée par des DLL en mode utilisateur :
Les DLL graphiques d’imprimante en mode utilisateur peuvent continuer à utiliser des fonctions DDI graphiques pour les services à virgule flottante GDI.
Conversion d’une DLL graphique d’imprimante existante en mode utilisateur
Si vous avez déjà développé une DLL graphique d’imprimante qui s’exécute en mode noyau, vous pouvez convertir la DLL en exécution en mode utilisateur. Pour convertir, ajoutez une fonction DrvQueryDriverInfo à la DLL, puis suivez les règles de création d’une DLL graphique d’imprimante.
Création d’une DLL graphique d’imprimante en mode utilisateur
Pour développer une nouvelle DLL graphique d’imprimante qui s’exécute en mode utilisateur, vous pouvez continuer à utiliser toutes les fonctions DDI graphiques utilisées par les DLL en mode noyau. Toutefois, vous disposez également des options suivantes :
Pour les fonctions avec préfixe 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 Eng, ainsi que leurs équivalents Win32.
Fonction préfixée eng Équivalent Win32 EngAllocMem HeapAlloc EngAllocUserMem HeapAlloc EngEnumForms EnumForms EngFreeMem HeapFree EngFreeUserMem HeapFree EngFindImageProcAddress GetProcAddress EngGetForm GetForm EngGetLastError Obtenir la dernière erreur EngGetPrinter GetPrinter EngGetPrinterData GetPrinterData EngGetPrinterDriver GetPrinterDriver EngLoadImage LoadLibrary EngMulDiv MulDiv EngSetLastError SetLastError EngSetPrinterData SetPrinterData EngUnloadImage FreeLibrary EngWritePrinter WritePrinter Pour les fonctions préfixées qui correspondent à des 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 Eng, ainsi que leurs équivalents Win32.
Fonction préfixée 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 graphiques pour GDI Floating-Point Services, vous pouvez utiliser le type de données FLOAT.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour