Partager via


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 :

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

  • 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.