Compatibilidad con clientes de Gráficos Low-Level
[Estas funciones están sujetas a cambios con cada revisión del sistema operativo. En su lugar, use Microsoft DirectDraw y Microsoft Direct3DAPIs; estas API aíslan las aplicaciones de estos cambios en el sistema operativo y ocultan muchas otras dificultades implicadas en la interacción directa con los controladores de pantalla. Para obtener más información, vea Introduction to Display.]
DirectDraw y Direct3D usan algunas rutinas de modo kernel para comunicarse con el sistema operativo y el controlador de pantalla.
El kernel del sistema operativo parece ser un controlador de pantalla DirectDraw/Direct3D desde el punto de vista de los componentes del modo de usuario. Sin embargo, existen algunas diferencias entre los controladores kernel y display. Los componentes del modo kernel mantienen una copia de estructuras que representan objetos DirectDraw/Direct3D, como dispositivos y superficies. El componente de modo de usuario de DirectDraw/Direct3D solicita la creación de esas estructuras, a las que se hace referencia con identificadores devueltos por el modo kernel. Por lo tanto, las diferencias se encuentran principalmente en los argumentos pasados a las rutinas: el kernel acepta identificadores, mientras que los controladores suelen aceptar punteros.
- Evolución de los puntos de entrada del modo kernel
- Llamar al kernel
- Escritura de aplicaciones portátiles
- Creación de dispositivos
- Objetos kernel
- Funciones
- Temas relacionados
Evolución de los puntos de entrada del modo kernel
DirectDraw realiza todas sus conexiones al modo kernel a través del Gdi32.dll mediante varios puntos de entrada. Estos puntos de entrada normalmente solo calculan las referencias de los parámetros. Como parte de la creación del dispositivo, el Gdi32.dll devuelve punteros a rutinas dentro de sí que, a continuación, se usan en DirectDraw y Direct3D 7.0.
Direct3D 8. x realiza una interrupción limpia de Gdi32.dll y llama directamente a los puntos de entrada en modo kernel.
Llamar al kernel
Estos puntos de entrada son similares y, en muchos casos, idénticos a los puntos de entrada del propio controlador de pantalla, por lo que un conocimiento de los materiales del Kit de desarrollo de controladores (DDK) para DirectDraw y Direct3D es un requisito previo esencial para usar estas funciones.
Llamar a estas funciones difiere entre los sistemas operativos. En Windows 2000, W2KUMODE. La biblioteca LIB contiene rutinas que permiten que el subproceso que realiza la llamada realice la transición al modo kernel. Estas rutinas no realizan la serialización de parámetros y son el mecanismo de llamada ideal en Windows 2000. El mecanismo que realiza la transición al modo kernel se basa en la ordenación de una tabla. Esta ordenación cambiará en las revisiones del sistema operativo. Por lo tanto, no es aconsejable compilar una aplicación que se base en W2KUMODE. LIB para Windows 2000 y espera que se ejecute sin modificar en Windows XP. En la sección siguiente se describe un mecanismo para crear la portabilidad del sistema operativo.
En Windows XP, D3D8THK.DLL exporta todas las funciones del modo kernel, pero con un nombre ligeramente decorado. En el ejemplo siguiente se muestra cómo las aplicaciones pueden usar el alias de las funciones de cliente de bajo nivel mediante el preprocesador. Antes de hacerlo, vincule dinámicamente a D3D8THK.DLL.
#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h" // Brings in the definition of "NtGdiDdUnlock",
. // which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);
Escritura de aplicaciones portátiles
Hay varias técnicas disponibles para que una aplicación sea portátil en todos los sistemas operativos. El más sólido es instalar el paquete redistribuible microsoft DirectX 8.x en Windows 2000 como parte del proceso de instalación de su propia aplicación. Esto garantiza que D3D8THK.DLL estará disponible en sistemas Windows 2000 y permite una única ruta de acceso de código en la aplicación, ya que puede usar la misma técnica que se describe anteriormente para Windows XP.
Las aplicaciones también pueden compilar su propio archivo DLL aislado e implementar dos versiones de ese archivo DLL, una para Windows 2000 con la técnica mostrada anteriormente y otra para Windows XP que usa D3D8THK.DLL.
Creación de dispositivos
DirectDraw y Direct3D deben crear primero una instancia de la abstracción del kernel del objeto de controlador. En Gdi32.dll y Ddraw.dll, esto se logra llamando a DdCreateDirectDrawObject, DdQueryDirectDrawObject y DdReenableDirectDrawObject. En Direct3D 8. x, esto se logra llamando a NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject y NtGdiDdReenableDirectDrawObject. Tenga en cuenta que los puntos de entrada GdiEntry* son simplemente serializadores para los puntos de entrada en modo kernel.
Después de llamar a estas funciones, se devuelve un identificador que representa la abstracción del objeto kernel de un dispositivo DirectDraw. Este objeto kernel representa una instancia de controlador propiedad del controlador de visualización. Este identificador se puede usar en llamadas posteriores, como DdCreateSurfaceObject (o NtGdiDdCreateSurfaceObject en Direct3D 8. x) para crear objetos adicionales.
Objetos kernel
Algunos puntos de entrada se usan para administrar las representaciones del modo kernel de determinados objetos. DdCreateSurfaceObject (o NtGdiDdCreateSurfaceObject en Direct3D 8. x) es un buen ejemplo. Este punto de entrada crea un objeto de modo kernel que representa un fragmento de memoria del sistema. El punto de entrada devuelve un identificador y este identificador se puede usar en llamadas de dibujo posteriores. El kernel deriva un puntero a su propia estructura de estos identificadores y pasa ese puntero al controlador de pantalla, que luego lleva a cabo la operación.
Functions
En esta tabla se enumeran las funciones que representan los puntos de entrada del modo kernel y las rutinas auxiliares del modo de usuario en Gdi32.dll que encapsulan estos puntos de entrada.
Tema | Contenido |
---|---|
DdAttachSurface | La función DdAttachSurface asocia dos representaciones de superficie en modo kernel. |
DdCreateDIBSection | Crea una estructura DIBSECTION que comparte su tabla de colores con el dispositivo. GdiEntry9 se #defined como alias para esta función. |
DdCreateDirectDrawObject | Contenedor para la función NtGdiDdCreateDirectDrawObject y crea una representación del lado kernel del objeto DirectDraw. Un identificador de esta representación se almacenará en pDirectDrawGlobal-hDDD>. GdiEntry1 se define como alias para esta función. |
DdCreateSurfaceObject | Contenedor para la función NtGdiDdCreateSurfaceObject y crea un objeto de superficie en modo kernel. GdiEntry4 se define como alias para esta función. |
DdDeleteDirectDrawObject | Contenedor para la función NtGdiDdDeleteDirectDrawObject y elimina un objeto DirectDraw en modo kernel que se creó anteriormente mediante DdCreateDirectDrawObject. GdiEntry3 se define como alias para esta función. |
DdDeleteSurfaceObject | Contenedor para la función NtGdiDdDeleteSurfaceObject y elimina un objeto de superficie en modo kernel creado anteriormente por NtGdiDdCreateSurfaceObject. GdiEntry5 se define como alias para esta función. |
DdGetDC | Contenedor para la función NtGdiDdGetDC y devuelve un contexto de dispositivo de interfaz de dispositivos gráficos (GDI) de Windows (DC) que representa la superficie de DirectDraw indicada. GdiEntry7 se define como alias para esta función. |
DdGetDxHandle |
DdGetDxHandle devuelve el identificador de LA API de Microsoft DirectX en modo kernel para usarlo en llamadas posteriores a los puntos de entrada del modo kernel que controlan el mecanismo de la API de DirectX. |
DdQueryDirectDrawObject | Contenedor para la función NtGdiDdQueryDirectDrawObject y consulta una representación en modo kernel creada previamente para las funcionalidades. GdiEntry2 se define como alias para esta función. |
DdQueryDisplaySettingsUniqueness | Devuelve el valor actual de un entero que se incrementa cada vez que se produce un modificador de modo, como cuando hay un conmutador de escritorio, un conmutador de usuario rápido o un cuadro microsoft MS-DOS de pantalla completa. La aplicación puede llamar a esta función repetidamente y comparar los valores antiguos y nuevos del valor devuelto para determinar si la configuración de visualización ha cambiado. GdiEntry13 se define como un alias para esta función. |
DdReenableDirectDrawObject | Contenedor para la función NtGdiDdReenableDirectDrawObject . Vuelve a habilitar una instancia del controlador directDraw después de un evento de estilo de conmutador de modo como un conmutador de modo verdadero, la apariencia de un cuadro MS-DOS de pantalla completa o el cambio del controlador de pantalla. GdiEntry10 se define como alias para esta función. |
DdReleaseDC | Contenedor para la función NtGdiDdReleaseDC y libera un controlador de dominio obtenido previamente a través de DdGetDC o GdiEntry7. GdiEntry8 se define como alias para esta función. |
DdResetVisrgn | Contenedor para la función NtGdiDdResetVisrgn y habilita la información en modo de usuario oportuna en la región de recorte para windows en el escritorio. GdiEntry6 se define como alias para esta función. |
DdSetGammaRamp | La función DdSetGammaRamp establece la rampa gamma para el dispositivo. |
DdSwapTextureHandles | Desarrollado para interfaces de controlador de dispositivo (DDIs) antes de Microsoft DirectDraw 7.0 y no hace nada en los sistemas Microsoft Windows NT. Se omiten todos los parámetros. GdiEntry16 se define como alias para esta función. |
DdUnattachSurface | La función DdUnattachSurface quita un archivo adjunto, creado con DdAttachSurface, entre dos objetos de superficie en modo kernel. |
NtGdiD3DContextCreate | Crea un contexto. |
NtGdiD3DContextDestroy | Elimina el contexto especificado. |
NtGdiD3DContextDestroyAll | Consulta la cantidad de memoria libre en el montón de memoria administrada por el controlador. |
NtGdiD3DDrawPrimitives2 | Representa primitivos y devuelve el estado de representación actualizado. |
NtGdiD3DGetDriverState | Usado por los entornos de ejecución de DirectDraw y Direct3D para obtener información del controlador sobre su estado actual. |
NtGdiD3DValidateTextureStageState | Devuelve el número de pases en los que el hardware puede realizar las operaciones de mezcla especificadas en el estado actual. |
NtGdiDdAddAlphaBlt | Sin implementar. |
NtGdiDdAddAttachedSurface | Adjunta una superficie a otra superficie. |
NtGdiDdAttachSurface | Asocia dos representaciones de superficie en modo kernel. |
NtGdiDdBeginMoCompFrame | Inicia la descodificación de un nuevo marco. |
NtGdiDdBlt | Realiza una transferencia de bloques de bits. |
NtGdiDdCanCreateD3DBuffer | Determina si el controlador puede crear un comando de nivel de controlador o un búfer de vértices de la descripción especificada. |
NtGdiDdCanCreateSurface | Indica si el controlador puede crear una superficie de la descripción de la superficie especificada. |
NtGdiDdColorControl | Controla la luminancia y los controles de brillo de una superficie superpuesta. |
NtGdiDdCreateD3DBuffer | Se usa para crear un comando de nivel de controlador o un búfer de vértices de la descripción especificada. |
NtGdiDdCreateDirectDrawObject | Crea una representación del lado kernel del objeto DirectDraw. |
NtGdiDdCreateMoComp | Notifica al controlador que un descodificador de software comenzará a usar la compensación de movimiento con el GUID especificado. |
NtGdiDdCreateSurface | Adjunta una superficie a otra superficie. |
NtGdiDdCreateSurfaceEx | Crea una superficie de Direct3D a partir de una superficie de DirectDraw y asocia un valor de identificador solicitado. |
NtGdiDdCreateSurfaceObject | Crea un objeto de superficie en modo kernel que representa el objeto de superficie en modo de usuario al que hace referencia puSurfaceLocal. |
NtGdiDdDeleteDirectDrawObject | Destruye un objeto de dispositivo directDraw en modo kernel creado anteriormente. |
NtGdiDdDeleteSurfaceObject |
NtGdiDdDeleteSurfaceObject elimina un objeto de superficie en modo kernel creado anteriormente. |
NtGdiDdDestroyD3DBuffer | Destruye un objeto de superficie directDraw en modo kernel asignado previamente que se creó con el miembro dwCaps de la estructura DDSCAPS establecida en DDSCAPS_EXECUTEBUFFER. |
NtGdiDdDestroyMoComp | Notifica al conductor que este objeto de compensación de movimiento ya no se usará. El controlador ahora debe realizar cualquier limpieza necesaria. |
NtGdiDdDestroySurface | Destruye un objeto de superficie directDraw en modo kernel asignado previamente. |
NtGdiDdEndMoCompFrame | Completa un marco descodificado. |
NtGdiDdFlip | Hace que la memoria expuesta asociada a las superficies de destino y actuales se interdistintamente. |
NtGdiDdFlipToGDISurface | Notifica al controlador cuando DirectDraw se voltea hacia o desde una superficie GDI. |
NtGdiDdGetAvailDriverMemory | Consulta la cantidad de memoria libre en todos los montones de memoria de vídeo. |
NtGdiDdGetBltStatus | Consulta el estado de la ranura de la superficie especificada. |
NtGdiDdGetDC | Crea un controlador de dominio para la superficie especificada. |
NtGdiDdGetDriverInfo | Consulta el controlador para obtener funcionalidades adicionales de DirectDraw y Direct3D que admite el controlador. |
NtGdiDdGetDxHandle | Devuelve el identificador de api directX en modo kernel que se va a usar en llamadas posteriores a los puntos de entrada del modo kernel que controlan el mecanismo de la API de DirectX. |
NtGdiDdGetFlipStatus | Determina si se ha producido el volteo solicitado más recientemente en una superficie. |
NtGdiDdGetInternalMoCompInfo | Permite al controlador informar de que asigna internamente memoria de visualización para realizar una compensación de movimiento. |
NtGdiDdGetMoCompBuffInfo | Permite al controlador especificar cuántas superficies provisionales son necesarias para admitir el GUID especificado y el tamaño, la ubicación y el formato de cada una de estas superficies. |
NtGdiDdGetMoCompFormats | Indica los formatos sin comprimir a los que el hardware puede descodificar los datos. |
NtGdiDdGetMoCompGuids | Recupera el número de GUID que admite el controlador. |
NtGdiDdGetScanLine | Devuelve el número de la línea de examen físico actual. |
NtGdiDdLock | Bloquea un área especificada de memoria expuesta y proporciona un puntero válido a un bloque de memoria asociado a una superficie. |
NtGdiDdLockD3D | Se usa para bloquear un área especificada de memoria del búfer y para proporcionar un puntero válido a un bloque de memoria asociado al búfer. |
NtGdiDdQueryDirectDrawObject | Consulta una representación en modo kernel creada anteriormente de un objeto DirectDraw para sus funcionalidades. |
NtGdiDdQueryMoCompStatus | Consulta el estado de la operación de representación más reciente en la superficie especificada. |
NtGdiDdReenableDirectDrawObject | Vuelve a habilitar un objeto de dispositivo en modo kernel de DirectDraw después de un modificador de modo. |
NtGdiDdReleaseDC | Libera el controlador de dominio creado anteriormente para el objeto de superficie directDraw en modo kernel indicado. |
NtGdiDdRenderMoComp | Indica al controlador qué macroblocks se van a representar especificando las superficies que contienen los macroblocks, los desplazamientos en cada superficie donde existen los macroblocks y el tamaño de los datos de macroblock que se van a representar. |
NtGdiDdResetVisrgn | Se usa para permitir que el modo de usuario comprenda de forma válida la región de recorte para las ventanas en el escritorio. Este recorte puede cambiar de forma asincrónica desde el punto de vista de los subprocesos en modo de usuario. |
NtGdiDdSetColorKey | Establece el valor de clave de color de la superficie especificada. |
NtGdiDdSetExclusiveMode | Notifica al controlador cuando una aplicación de DirectDraw cambia a o desde el modo exclusivo. |
NtGdiDdSetGammaRamp | Establece la rampa gamma para el dispositivo. |
NtGdiDdSetOverlayPosition | Establece la posición de una superposición. |
NtGdiDdUnattachSurface | Quita un archivo adjunto, creado con NtGdiDdAttachSurface, entre dos objetos de superficie en modo kernel. |
NtGdiDdUnlock | Libera el bloqueo mantenido en la superficie especificada. |
NtGdiDdUnlockD3D | Se usa para liberar un bloqueo mantenido en un área especificada de memoria del búfer. |
NtGdiDdUpdateOverlay | Cambia la posición o modifica los atributos visuales de una superficie superpuesta. |
NtGdiDdWaitForVerticalBlank | Devuelve el estado en blanco vertical del dispositivo. |
Temas relacionados