Поделиться через


Выбор пользовательского режима или режима ядра

Внимание

Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.

Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.

Выполнение библиотек DLL графики принтера в пользовательском режиме обеспечивает следующие преимущества при выполнении в режиме ядра:

  • Неограниченное пространство стека.

  • Доступ к API Win32.

  • Меньше возможностей для возникновения сбоев системы.

  • Упрощенная отладка с помощью отладчиков пользовательского режима.

  • Улучшены возможности с плавающей запятой, так как использование функций с плавающей запятой DDI графики не требуется.

  • Возможность вызывать пользовательские библиотеки DLL, предоставляемые поставщиком, которые не являются частью описанной архитектуры драйвера принтера Microsoft Windows 2000 и более поздних версий.

В Windows Vista невозможно установить драйвер принтера в режиме ядра. Если приложение пытается сделать это, функции AddPrinterDriver и AddprinterDriverEx (описанные в документации по пакету SDK для Windows) завершаются ошибкой с кодом ошибки ERROR_KM_DRIVER_BLOCKED.

В следующей таблице показаны режимы выполнения драйвера принтера:

Версия операционной системы Разрешенный режим выполнения библиотеки DLL графики принтера
Windows NT 4.0 Backports
Windows 2000 пользователь или ядро
Windows XP и Server 2003 режим ядра, доступный для существующих принтеров; режим пользователя, необходимый для новых установок принтера
Windows Vista Пользователь

Использование графического DDI в пользовательском режиме

Библиотека DLL графического принтера в пользовательском режиме не ограничивается вызовом служб поддержки GDI и других функций обратного вызова DDI с префиксом Eng. Однако существуют некоторые правила, которые должны соблюдаться:

  • Как и библиотеки DLL в режиме ядра, библиотеки DLL графики в пользовательском режиме должны вызывать графические DDIs, создающие или изменяющие область рисования. Эти функции обратного вызова являются службами поддержки GDI, и вызовы эквивалентов Win32 этих функций рисования не допускаются.

    Для библиотек DLL в пользовательском режиме вызовы этих функций обратного вызова документа перехватываются клиентом GDI пользовательского режима, который затем передает вызовы подсистеме отрисовки в режиме ядра GDI (GRE).

  • Следующий список функций DDI с префиксом Eng не может вызываться библиотеками DLL в пользовательском режиме:

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

  • Библиотеки DLL принтера в режиме пользователя могут продолжать использовать функции DDI графики для служб с плавающей запятой GDI.

Преобразование существующей библиотеки DLL графики принтера в режим пользователя

Если вы ранее разработали библиотеку DLL графики принтера, которая выполняется в режиме ядра, можно преобразовать библиотеку DLL в выполнение в пользовательском режиме. Чтобы преобразовать, добавьте функцию DrvQueryDriverInfo в библиотеку DLL, а затем следуйте правилам для создания библиотеки DLL графики принтера.

Создание библиотеки DLL графики принтера в пользовательском режиме

Чтобы разработать новую библиотеку DLL графики принтера, которая выполняется в пользовательском режиме, можно продолжать использовать все функции DDI графики, используемые библиотеками DLL в режиме ядра. Однако у вас также есть следующие варианты:

  • Для функций с префиксом Eng, имеющих точные эквиваленты Win32, рекомендуется вызывать функции Win32. В следующей таблице перечислены эти функции с префиксом Eng, а также их эквиваленты Win32.

    Функция с префиксом Eng Эквивалент Win32
    EngAllocMem КучиAlloc
    EngAllocUserMem КучиAlloc
    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
  • Для функций с префиксом Eng, которые соответствуют функциям Win32 с аналогичными функциями, также рекомендуется вызывать функции Win32. В следующей таблице перечислены некоторые из этих функций с префиксом Eng вместе с их коллегами Win32.

    Функция с префиксом Eng Эквивалент Win32
    EngAcquireSemaphore ВводCriticalSection
    EngCreateSemaphore Выделите объект CRITICAL_SECTION и инициализировать его с помощью вызова функции Win32 InitializeCriticalSection.
    EngDeleteSemaphore DeleteCriticalSection
    EngFindResource FindResource
    EngFreeModule FreeLibrary
    EngLoadModule LoadLibrary
    EngMultiByteToWideChar MultiByteToWideChar
    EngQueryLocalTime GetLocalTime
    EngReleaseSemaphore ReleaseSemaphore
    EngWideCharToMultiByte WideCharToMultiByte
  • Для функций, создающих или изменяющих службу рисования, новые драйверы должны продолжать вызывать службы поддержки GDI, а не эквиваленты Win32.

  • Вместо использования графических функций DDI для служб С плавающей запятой GDI можно использовать тип данных FLOAT.