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