Compartir a través de


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:

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

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