Elección del modo de usuario o modo kernel
Importante
La plataforma de impresión moderna es el medio preferido de Windows para comunicarse con impresoras. Se recomienda usar el controlador de clase de bandeja de entrada IPP de Microsoft, junto con aplicaciones de soporte técnico de impresión (PSA), para personalizar la experiencia de impresión en Windows 10 y 11 para el desarrollo de dispositivos de impresora.
Para obtener más información, consulte Plataforma de impresión moderna y la Guía de diseño de aplicaciones para compatibilidad con impresión.
La ejecución en modo de usuario de archivos DLL de gráficos de impresora proporciona las siguientes ventajas sobre la ejecución en modo kernel:
Espacio ilimitado de pila.
Acceso a las API de Win32.
Menor potencial para provocar bloqueos del sistema.
Depuración más sencilla, con depuradores en modo de usuario.
Mejores funcionalidades de punto flotante, ya que no se requiere el uso de funciones de gráficos de punto flotante de DDI.
Capacidad de llamar a los archivos DLL personalizados proporcionados por el proveedor que no formen parte de la arquitectura de controladores de impresora de Microsoft Windows 2000 y posteriores.
En Windows Vista, no es posible instalar un controlador de impresora en modo kernel. Si una aplicación intenta hacerlo, las funciones AddPrinterDriver y AddprinterDriverEx (descritas en la documentación del SDK de Windows) producirán un error con el código de error ERROR_KM_DRIVER_BLOCKED.
En la tabla siguiente se muestran los modos de ejecución de controladores de impresora permitidos:
Versión del sistema operativo | Modo de ejecución permitido del archivo DLL de gráficos de impresora |
---|---|
Windows NT 4.0 | kernel |
Windows 2000 | usuario o kernel |
Windows XP y Server 2003 | modo kernel disponible para impresoras existentes; modo de usuario necesario para las nuevas instalaciones de impresora |
Windows Vista | usuario |
Uso de DDI de gráficos en modo de usuario
Un archivo DLL de gráficos de impresora en modo de usuario no se limita a llamar a los Servicios de compatibilidad de GDI y a otras funciones de devolución de llamada de DDI de gráficos con prefijos Eng. Sin embargo, hay algunas reglas que deben seguirse:
Al igual que los archivos DLL de gráficos en modo kernel, los archivos DLL de gráficos en modo de usuario deben llamar a las DDI de gráficos que crean o modifican una superficie de dibujo. Estas funciones de devolución de llamada son los servicios de compatibilidad de GDI y no se permite llamar a equivalentes winW2 de estas funciones de dibujo.
En el caso de los archivos DLL en modo de usuario, las llamadas a estas funciones de devolución de llamada de dibujo se interceptan mediante el cliente GDI en modo de usuario, que luego pasa las llamadas al motor de representación de gráficos en modo kernel (GRE) de GDI.
No se puede llamar a la siguiente lista de funciones DDI de gráficos con prefijo Eng mediante DLL en modo de usuario:
Los archivos DLL de gráficos de impresora en modo de usuario pueden seguir usando funciones de DDI de gráficos para servicios de punto flotante GDI.
Conversión de un archivo DLL de gráficos de impresora existente al modo de usuario
Si ha desarrollado previamente un archivo DLL de gráficos de impresora que se ejecuta en modo kernel, puede convertir el archivo DLL a la ejecución en modo de usuario. Para ello, agregue una función DrvQueryDriverInfo al archivo DLL y, a continuación, siga las reglas para crear un archivo DLL de gráficos de impresora.
Creación de un archivo DLL de gráficos de impresora en modo de usuario
Para desarrollar un nuevo archivo DLL de gráficos de impresora que se ejecuta en modo de usuario, puede seguir usando todas las funciones DDI de gráficos que usan los archivos DLL en modo kernel. Sin embargo, también tiene las siguientes opciones:
Para las funciones con prefijo Eng que tienen equivalentes exactos en Win32, se recomienda llamar a las funciones Win32. En la tabla siguiente se enumeran estas funciones con prefijo Eng, junto con sus equivalentes de Win32.
Función con prefijo Eng Equivalente de 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 En el caso de las funciones con prefijo Eng que corresponden a funciones Win32 con una funcionalidad similar, también se recomienda llamar a las funciones Win32. En la tabla siguiente se enumeran varias de estas funciones con prefijo Eng, junto con sus equivalentes de Win32.
Función con prefijo Eng Equivalente de Win32 EngAcquireSemaphore EnterCriticalSection EngCreateSemaphore Asigne un objeto CRITICAL_SECTION e inicialícelo mediante una llamada a la función InitializeCriticalSection de Win32. EngDeleteSemaphore DeleteCriticalSection EngFindResource FindResource EngFreeModule FreeLibrary EngLoadModule LoadLibrary EngMultiByteToWideChar MultiByteToWideChar EngQueryLocalTime GetLocalTime EngReleaseSemaphore ReleaseSemaphore EngWideCharToMultiByte WideCharToMultiByte En el caso de las funciones que crean o modifican un servicio de dibujo, los nuevos controladores deben seguir llamando a los servicios de compatibilidad de GDI y no a sus equivalentes Win32.
En lugar de usar funciones de DDI de gráficos para los servicios de punto flotante de GDI, puede usar el tipo de datos FLOAT.