图形低级别客户端支持
[这些函数可能会随每个操作系统修订而更改。 请改用 Microsoft DirectDraw 和 Microsoft Direct3DAPIs;这些 API 使应用程序免受此类操作系统更改的隔离,并隐藏与显示驱动程序直接交互所涉及的许多其他困难。 有关详细信息,请参阅显示简介。]
DirectDraw 和 Direct3D 使用一些内核模式例程与操作系统和显示驱动程序通信。
从用户模式组件的角度来看,操作系统内核似乎是 DirectDraw/Direct3D 显示驱动程序。 但是,内核和显示驱动程序之间存在一些差异。 内核模式组件保留表示 DirectDraw/Direct3D 对象(如设备和表面)的结构的副本。 DirectDraw/Direct3D 的用户模式组件请求创建这些结构,这些结构由内核模式返回的句柄引用。 因此,差异主要在于传递给例程的参数:内核接受句柄,而驱动程序通常接受指针。
内核模式入口点的演变
DirectDraw 使用多个入口点通过 Gdi32.dll 连接到内核模式。 这些入口点通常只是封送参数。 作为设备创建的一部分,Gdi32.dll 返回指向本身中的例程的指针,然后由 DirectDraw 和 Direct3D 7.0 使用。
Direct3D 8.x 从 Gdi32.dll 进行完全中断,并直接调用内核模式入口点。
调用内核
这些入口点相似,在许多情况下,与显示驱动程序本身的入口点相同,因此了解 DirectDraw 和 Direct3D 的驱动程序开发工具包 (DDK) 资料是使用这些函数的必要先决条件。
调用这些函数在操作系统之间有所不同。 在 Windows 2000 上,W2KUMODE.LIB 库包含使调用线程能够转换为内核模式的例程。 这些例程不执行参数封送,并且是 Windows 2000 上的理想调用机制。 转换到内核模式的机制依赖于表的排序。 此排序将在操作系统修订之间更改。 因此,不建议生成依赖于 W2KUMODE.LIB for Windows 2000 的应用程序,并期望它在 Windows XP 上运行未修改。 以下部分介绍了用于创建操作系统可移植性的机制。
在 Windows XP 上,D3D8THK.DLL 会导出所有内核模式函数,但名称略带修饰。 以下示例演示如何使用预处理器将应用程序别名化为低级客户端函数。 执行此操作之前,请动态链接到 D3D8THK.DLL。
#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h" // Brings in the definition of "NtGdiDdUnlock",
. // which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);
编写可移植应用程序
可通过多种技术使应用程序可跨操作系统移植。 作为自己应用程序安装过程的一部分,最可靠的是在 Windows 2000 上安装 Microsoft DirectX 8.x 可再发行组件包。 这可以保证 D3D8THK.DLL 在 Windows 2000 系统上可用,并允许应用程序中的单一代码路径,因为可以使用上述 Windows XP 所述的相同技术。
应用程序还可以生成自己的隔离 DLL 并实现该 DLL 的两个版本,一个用于 Windows 2000,使用上面所示的技术,另一个用于使用 D3D8THK.DLL 的 Windows XP。
设备创建
DirectDraw 和 Direct3D 必须先创建内核的驱动程序对象的抽象实例。 在 Gdi32.dll 和 Ddraw.dll 中,可以通过调用 DdCreateDirectDrawObject、DdQueryDirectDrawObject 和 DdReenableDirectDrawObject 来实现此目的。 在 Direct3D 8.x 中,这是通过调用 NtGdiDdCreateDirectDrawObject、NtGdiDdQueryDirectDrawObject 和 NtGdiDdReenableDirectDrawObject 来实现的。 请注意,GdiEntry* 入口点只是内核模式入口点的封送器。
调用这些函数后,将返回一个句柄,表示 DirectDraw 设备的内核对象的抽象。 此内核对象表示显示驱动程序拥有的驱动程序实例。 此句柄可用于后续调用,例如 DdCreateSurfaceObject(或者 Direct3D 8.x 中的 NtGdiDdCreateSurfaceObject),用于生成更多对象。
内核对象
几个入口点用于管理某些对象的内核模式表示形式。 DdCreateSurfaceObject(或 Direct3D 8.x 中的 NtGdiDdCreateSurfaceObject)是一个很好的示例。 此入口点创建表示系统内存的内核模式对象。 入口点返回句柄,此句柄可用于后续绘图调用。 内核从这些句柄派生指向其自身结构的指针,并将该指针传递给显示驱动程序,然后执行该操作。
函数
此表列出了表示内核模式入口点的函数,以及包装这些入口点的 Gdi32.dll 中的用户模式帮助程序例程。
主题 | 目录 |
---|---|
DdAttachSurface | DdAttachSurface 函数附加两个内核模式图面表示形式。 |
DdCreateDIBSection | 创建与设备共享其颜色表的 DIBSECTION 结构。 GdiEntry9 是被定义为此函数的别名。 |
DdCreateDirectDrawObject | NtGdiDdCreateDirectDrawObject 函数的包装器,并创建 DirectDraw 对象的内核端表示形式。 此表示形式的句柄将存储在 pDirectDrawGlobal->hDD 中。 GdiEntry1 被定义为此函数的别名。 |
DdCreateSurfaceObject | NtGdiDdCreateSurfaceObject 函数的包装器,并创建内核模式表面对象。 GdiEntry4 被定义为此函数的别名。 |
DdDeleteDirectDrawObject | NtGdiDdDeleteDirectDrawObject 函数的包装器,并删除以前使用 DdCreateDirectDrawObject 创建的内核模式 DirectDraw 对象。 GdiEntry3 被定义为此函数的别名。 |
DdDeleteSurfaceObject | NtGdiDdDeleteSurfaceObject 函数的包装器,并删除以前由 NtGdiDdCreateSurfaceObject 创建的内核模式表面对象。 GdiEntry5 被定义为此函数的别名。 |
DdGetDC | NtGdiDdGetDC 函数的包装器,并返回表示指示的 DirectDraw 表面的 Windows 图形设备接口 (GDI) 设备上下文 (DC)。 GdiEntry7 被定义为此函数的别名。 |
DdGetDxHandle | DdGetDxHandle 返回内核模式 Microsoft DirectX API 句柄,用于对控制 DirectX API 机制的内核模式入口点的后续调用。 |
DdQueryDirectDrawObject | NtGdiDdQueryDirectDrawObject 函数的包装器,并查询以前为功能创建的内核模式表示形式。 GdiEntry2 被定义为此函数的别名。 |
DdQueryDisplaySettingsUniqueness | 返回一个整数的当前值,该值在模式开关发生时递增,例如,当有桌面交换机、快速用户开关或全屏 Microsoft MS-DOS 框时。 应用程序可以重复调用此函数,并比较返回值的旧值和新值,以确定显示设置是否已更改。 GdiEntry13 被定义为此函数的别名。 |
DdReenableDirectDrawObject | NtGdiDdReenableDirectDrawObject 函数的包装器。 它在模式切换样式事件(例如真正的模式开关、全屏 MS-DOS 框的外观或更改显示驱动程序)后重新启用 DirectDraw 驱动程序实例。 GdiEntry10 被定义为此函数的别名。 |
DdReleaseDC | NtGdiDdReleaseDC 函数的包装器,并释放以前通过 DdGetDC 或 GdiEntry7 获取的 DC。 GdiEntry8 被定义为此函数的别名。 |
DdResetVisrgn | NtGdiDdResetVisrgn 函数的包装器,并为桌面上的窗口的剪辑区域启用及时的用户模式信息。 GdiEntry6 被定义为此函数的别名。 |
DdSetGammaRamp | DdSetGammaRamp 函数设置设备的伽玛渐变。 |
DdSwapTextureHandles | 在 Microsoft DirectDraw 7.0 之前为设备驱动程序接口 (DDI) 开发,在 Microsoft Windows NT 系统上不执行任何操作。 会忽略所有参数。 GdiEntry16 被定义为此函数的别名。 |
DdUnattachSurface | DdUnattachSurface 函数删除在两个内核模式表面对象之间使用 DdAttachSurface 创建的附件。 |
NtGdiD3DContextCreate | 创建上下文。 |
NtGdiD3DContextDestroy | 删除指定的上下文。 |
NtGdiD3DContextDestroyAll | 查询驱动程序管理的内存堆中的可用内存量。 |
NtGdiD3DDrawPrimitives2 | 呈现基元并返回更新的呈现状态。 |
NtGdiD3DGetDriverState | 由 DirectDraw 和 Direct3D 运行时用于从驱动程序获取有关其当前状态的信息。 |
NtGdiD3DValidateTextureStageState | 返回硬件可以执行当前状态中指定的混合操作的传递数。 |
NtGdiDdAddAlphaBlt | 未实现。 |
NtGdiDdAddAttachedSurface | 将表面附加到另一个表面。 |
NtGdiDdAttachSurface | 附加两个内核模式表面表示形式。 |
NtGdiDdBeginMoCompFrame | 开始解码新帧。 |
NtGdiDdBlt | 执行位块传输。 |
NtGdiDdCanCreateD3DBuffer | 确定驱动程序是否可以创建指定描述的驱动程序级命令或顶点缓冲区。 |
NtGdiDdCanCreateSurface | 指示驱动程序是否可以创建指定表面描述的表面。 |
NtGdiDdColorControl | 控制覆盖表面的亮度和亮度控件。 |
NtGdiDdCreateD3DBuffer | 用于创建指定表面的驱动程序级命令或顶点缓冲区。 |
NtGdiDdCreateDirectDrawObject | 创建 DirectDraw 对象的内核端表示形式。 |
NtGdiDdCreateMoComp | 通知驱动程序软件解码器将开始使用具有指定 GUID 的运动补偿。 |
NtGdiDdCreateSurface | 将表面附加到另一个表面。 |
NtGdiDdCreateSurfaceEx | 从 DirectDraw 表面创建 Direct3D 表面,并将请求的句柄值与其关联。 |
NtGdiDdCreateSurfaceObject | 创建一个内核模式表面对象,该对象表示 puSurfaceLocal 引用的用户模式表面对象。 |
NtGdiDdDeleteDirectDrawObject | 销毁以前创建的内核模式 DirectDraw 设备对象。 |
NtGdiDdDeleteSurfaceObject | NtGdiDdDeleteSurfaceObject 删除以前创建的内核模式表面对象。 |
NtGdiDdDestroyD3DBuffer | 销毁以前分配的内核模式 DirectDraw 表面对象,创建该对象时将 DDSCAPS 结构的 dwCaps 成员设置为 DDSCAPS_EXECUTEBUFFER。 |
NtGdiDdDestroyMoComp | 通知驱动程序不再使用此运动补偿对象。 驱动程序现在需要执行任何必要的清理。 |
NtGdiDdDestroySurface | 销毁以前分配的内核模式 DirectDraw surface 对象。 |
NtGdiDdEndMoCompFrame | 完成解码的帧。 |
NtGdiDdFlip | 使与目标表面和当前表面关联的表面内存交换。 |
NtGdiDdFlipToGDISurface | 当 DirectDraw 向 GDI 表面或从 GDI 表面翻转时通知驱动程序。 |
NtGdiDdGetAvailDriverMemory | 查询所有视频内存堆中的可用内存量。 |
NtGdiDdGetBltStatus | 查询指定表面的 blit 状态。 |
NtGdiDdGetDC | 为指定表面创建 DC。 |
NtGdiDdGetDriverInfo | 查询驱动程序以获取驱动程序支持的其他 DirectDraw 和 Direct3D 功能。 |
NtGdiDdGetDxHandle | 返回内核模式 DirectX API 句柄,用于对控制 DirectX API 机制的内核模式入口点的后续调用。 |
NtGdiDdGetFlipStatus | 确定表面上最近请求的翻转是否已发生。 |
NtGdiDdGetInternalMoCompInfo | 允许驱动程序报告它在内部分配显示内存,以执行运动补偿。 |
NtGdiDdGetMoCompBuffInfo | 允许驱动程序指定支持指定 GUID 所需的临时表面数,以及每个表面的大小、位置和格式。 |
NtGdiDdGetMoCompFormats | 指示硬件可以解码数据的未压缩格式。 |
NtGdiDdGetMoCompGuids | 检索驱动程序支持的 GUID 数。 |
NtGdiDdGetScanLine | 返回当前物理扫描行的数目。 |
NtGdiDdLock | 锁定表面内存的指定区域,并提供指向与表面关联的内存块的有效指针。 |
NtGdiDdLockD3D | 用于锁定指定缓冲区内存区域,并提供与缓冲区关联的内存块的有效指针。 |
NtGdiDdQueryDirectDrawObject | 查询以前创建的 DirectDraw 对象的内核模式表示形式,以获取其功能。 |
NtGdiDdQueryMoCompStatus | 将最新呈现操作的状态查询到指定的表面。 |
NtGdiDdReenableDirectDrawObject | 在模式切换后重新启用 DirectDraw 内核模式设备对象。 |
NtGdiDdReleaseDC | 释放以前为指示的内核模式 DirectDraw surface 对象创建的 DC。 |
NtGdiDdRenderMoComp | 通过指定包含宏块的表面、宏块所在的每个表面的偏移量以及要呈现的宏块数据的大小,告诉驱动程序要呈现哪些宏块。 |
NtGdiDdResetVisrgn | 用于使用户模式能够有效了解桌面上窗口的剪辑区域。 此剪辑可以从用户模式线程的角度异步更改。 |
NtGdiDdSetColorKey | 设置指定表面的颜色键值。 |
NtGdiDdSetExclusiveMode | 当 DirectDraw 应用程序切换到或从独占模式切换时通知驱动程序。 |
NtGdiDdSetGammaRamp | 设置设备的伽马渐变。 |
NtGdiDdSetOverlayPosition | 设置覆盖的位置。 |
NtGdiDdUnattachSurface | 删除使用 NtGdiDdAttachSurface 在两个内核模式表面对象之间创建的附件。 |
NtGdiDdUnlock | 释放在指定表面上保留的锁定。 |
NtGdiDdUnlockD3D | 用于释放在指定缓冲区内存区域中保留的锁定。 |
NtGdiDdUpdateOverlay | 重新定位或修改覆盖表面的视觉属性。 |
NtGdiDdWaitForVerticalBlank | 返回设备的垂直空白状态。 |
相关主题