Escolher o modo de usuário ou o modo do Kernel

Importante

A plataforma de impressão moderna é o meio preferido do Windows para se comunicar com as impressoras. Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft juntamente com PSA (Aplicativos de Suporte à Impressão) para personalizar a experiência de impressão no Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.

Para obter mais informações, consulte Plataformade impressão moderna e o Guia de design do aplicativo de suporte de impressão.

A execução no modo de usuário de DLLs gráficas de impressora fornece as seguintes vantagens em relação à execução no modo kernel:

  • Espaço ilimitado na pilha.

  • Acesso a APIs Win32.

  • Menos potencial para causar falhas no sistema.

  • Depuração mais fácil, com depuradores de modo de usuário.

  • Melhores recursos de ponto flutuante, já que o uso de funções de ponto flutuante DDI gráficos não é necessário.

  • Capacidade de chamar DLLs de modo de usuário personalizadas fornecidas pelo fornecedor que não fazem parte da arquitetura de driver de impressora descrita do Microsoft Windows 2000 e posterior

No Windows Vista, não é possível instalar um driver de impressora no modo kernel. Se um aplicativo tentar fazer isso, as funções AddPrinterDriver e AddprinterDriverEx (descritas na documentação do SDK do Windows) falharão com o código de erro ERROR_KM_DRIVER_BLOCKED.

A tabela a seguir mostra os modos de execução de driver de impressora permitidos:

Versão do sistema operacional Modo de execução permitido da DLL de gráficos da impressora
Windows NT 4.0 kernel
Windows 2000 usuário ou kernel
Windows XP e Windows Server 2003 modo kernel disponível para impressoras existentes; Modo de usuário necessário para novas instalações de impressora
Windows Vista usuário

Usando a DDI de gráficos no modo de usuário

Uma DLL de gráficos de impressora no modo de usuário não se limita a chamar os Serviços de Suporte GDI e outras funções de retorno de chamada DDI de gráficos prefixados em Eng. No entanto, existem algumas regras que devem ser seguidas:

  • Assim como as DLLs de gráficos no modo kernel, as DLLs de gráficos no modo de usuário devem chamar as DDIs de gráficos que criam ou modificam uma superfície de desenho. Essas funções de retorno de chamada são os Serviços de Suporte GDI e chamar equivalentes Win32 dessas funções de desenho não é permitido.

    Para DLLs no modo de usuário, as chamadas para essas funções de retorno de chamada de desenho são interceptadas pelo cliente GDI do modo de usuário, que passa as chamadas para o GRE (mecanismo de renderização de gráficos) do modo kernel do GDI.

  • A seguinte lista de funções DDI de gráficos prefixados por Eng não pode ser chamada por DLLs no modo de usuário:

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

  • As DLLs de gráficos de impressora no modo de usuário podem continuar a usar funções DDI de gráficos para serviços de ponto flutuante GDI.

Convertendo uma DLL gráfica de impressora existente para o modo de usuário

Se você desenvolveu anteriormente uma DLL de gráficos de impressora que é executada no modo kernel, poderá converter a DLL em execução no modo de usuário. Para converter, adicione uma função DrvQueryDriverInfo à DLL e siga as regras para criar uma DLL de gráficos de impressora.

Criando uma nova DLL de gráficos de impressora no modo de usuário

Para desenvolver uma nova DLL de gráficos de impressora que seja executada no modo de usuário, você pode continuar a usar todas as funções de DDI de gráficos usadas por DLLs no modo kernel. No entanto, você também tem as seguintes opções:

  • Para funções prefixadas em Eng que têm equivalentes Win32 exatos, é recomendável chamar as funções Win32. A tabela a seguir lista essas funções prefixadas em Eng, juntamente com seus equivalentes Win32.

    Função prefixada em inglês Equivalente ao 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
  • Para funções prefixadas em Eng que correspondem a funções Win32 com funcionalidade semelhante, também é recomendável chamar as funções Win32. A tabela a seguir lista várias dessas funções prefixadas em Eng, juntamente com suas contrapartes Win32.

    Função prefixada em inglês Equivalente ao Win32
    EngAcquireSemaphore EnterCriticalSection
    EngCreateSemaphore Aloque um objeto CRITICAL_SECTION e inicialize-o usando uma chamada para a função Win32 InitializeCriticalSection .
    EngDeleteSemaphore DeleteCriticalSection
    EngFindResource FindResource
    EngFreeModule FreeLibrary
    EngLoadModule LoadLibrary
    EngMultiByteToWideChar MultiByteToWideChar
    EngQueryLocalTime GetLocalTime
    EngReleaseSemaphore ReleaseSemaphore
    EngWideCharToMultiByte WideCharToMultiByte
  • Para funções que criam ou modificam um serviço de desenho, novos drivers devem continuar a chamar serviços de suporte GDI e não seus equivalentes Win32.

  • Em vez de usar funções DDI gráficas para Serviços de Ponto Flutuante GDI, você pode usar o tipo de dados FLOAT.