Compartir a través de


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:

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

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