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


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

Важно!

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

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

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

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

  • Доступ к API Win32.

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

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

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

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

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

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

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

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

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

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

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

  • Следующий список графических функций 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 HeapAlloc
    EngAllocUserMem HeapAlloc
    EngEnumForms EnumForms
    EngFreeMem HeapFree
    EngFreeUserMem HeapFree
    EngFindImageProcAddress GetProcAddress
    EngGetForm GetForm
    EngGetLastError GetLastError
    EngGetPrinter GetPrinter
    EngGetPrinterData GetPrinterData
    EngGetPrinterDriver GetPrinterDriver
    EngLoadImage LoadLibrary
    EngMulDiv МалДив
    EngSetLastError SetLastError
    EngSetPrinterData SetPrinterData
    EngUnloadImage FreeLibrary
    EngWritePrinter WritePrinter
  • Для функций с префиксом Eng, которые соответствуют функциям Win32 с аналогичными функциями, также рекомендуется вызывать функции Win32. В следующей таблице перечислены некоторые из этих функций с префиксом Eng вместе с их аналогами Win32.

    Функция с префиксом Eng Эквивалент Win32
    EngAcquireSemaphore EnterCriticalSection
    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 Floating-Point можно использовать тип данных FLOAT.