Elegir el modo de usuario o el modo kernel
Importante
Se recomienda usar el controlador de clase de bandeja de entrada IPP de Microsoft, junto con las 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 la Guía de diseño de aplicaciones de soporte técnico de 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.
No se requieren mejores funcionalidades de punto flotante, ya que no se requieren funciones de punto flotante DDI de gráficos.
Capacidad de llamar a los archivos DLL personalizados y proporcionados por el proveedor que no formen parte de la arquitectura de controlador de impresora de Microsoft Windows 2000 y versiones 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 de Windows SDK) 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 soporte técnico de GDI y a otras funciones de devolución de llamada DDI con prefijo de gráficos prefijos. Sin embargo, hay algunas reglas que se deben seguir:
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 los DDIs de gráficos que crean o modifican una superficie de dibujo. Estas funciones de devolución de llamada son los Servicios de soporte técnico de GDI y no se permiten equivalentes de Win32 de estas funciones de dibujo.
En el caso de los archivos DLL en modo de usuario, el cliente GDI del modo de usuario intercepta las llamadas a estas funciones de devolución de llamada de dibujo, que luego pasa las llamadas al motor de representación de gráficos en modo kernel (GRE) de GDI.
La siguiente lista de funciones DDI de gráficos prefijos no se puede llamar mediante archivos DLL en modo de usuario:
Los archivos DLL de gráficos de impresora en modo de usuario pueden seguir usando funciones DDI de gráficos para los servicios de punto flotante GDI.
Convertir un archivo DLL de gráficos de impresora existente en modo de usuario
Si anteriormente ha desarrollado 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 convertir, agregue una función DrvQueryDriverInfo al archivo DLL y, a continuación, siga las reglas para compilar 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 ejecute 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:
En el caso de las funciones con prefijo Eng que tienen equivalentes exactos de 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 a Win32 EngAllocMem HeapAlloc EngAllocUserMem HeapAlloc EngEnumForms EnumForms EngFreeMem MontónFree EngFreeUserMem MontónFree EngFindImageProcAddress GetProcAddress EngGetForm GetForm EngGetLastError Obtener último error 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 homólogos de Win32.
Función con prefijo eng Equivalente a 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 soporte técnico de GDI y no a sus equivalentes win32.
En lugar de usar funciones DDI de gráficos para GDI Floating-Point Services, puede usar el tipo de datos FLOAT.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de