Partager via


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 :

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

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