图形驱动程序资料4_第1页
图形驱动程序资料4_第2页
图形驱动程序资料4_第3页
图形驱动程序资料4_第4页
图形驱动程序资料4_第5页
已阅读5页,还剩370页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 第第 4 4 卷卷 图形驱动程序设计指南图形驱动程序设计指南 第第 1 1 部分部分 图形驱动程序图形驱动程序 第第 2 2 部分部分 显示器及视频微端口驱动程序显示器及视频微端口驱动程序 第第 3 3 部分部分 打印机驱动程序及假脱机打印部件打印机驱动程序及假脱机打印部件 2 第第 1 1 部分部分 图形驱动程序图形驱动程序 第 1 章 图形系统概述 第 2 章 GDI 支持的图形驱动程序 第 3 章 对 DDI 的支持 第第 1 1 章章 图形系统概述图形系统概述 Microsoft Windows NT/Windows 2000 提供了一个健壮的图形体系结构,使第三方 图形硬件公司能

2、很容易地集成其视频显示器和打印设备。本书为编写有效的图形驱动程序 提供了设计指南。可分为以下几个部分: Part 1:图形驱动程序 Part 1 描述了图形驱动程序接口(GDI)和设备驱动程序接口(DDI) ,讨论了显示器 和打印机驱动程序公共的设计和实现细节。 Part 2:显示器和视频微端口驱动程序 Part 2 描述了 Windows NT/Windows 2000 的视频显示器环境,为显示器和视频微端 口驱动程序编写者提供了设计和实现细节。 Part 3:打印机驱动程序和假脱机打印部件 Part 3 描述了构成 Windows NT/Windows 2000 打印环境的驱动程序和假脱机

3、打印部 件,解释了如何提供驱动程序和假脱机打印部件的定制,以提供对新的打印机硬件和网络 配置的支持。 Part 4:静态映像驱动程序 Part 4 可以在在线 DDK 上找到,描述了用 Microsoft 静态映像体系结构(Microsoft STI)定义的 COM 接口,这对提供平板扫描仪和数字静态映像相机这些静态映像硬件的供应 商是有用的。 图形驱动程序的术语表,在在线 DDK 上Design Guide的结尾可以找到,对图形子系 统和驱动程序设计定义了详细的术语和缩略语。 图形驱动程序函数参考可以在在线 DDK 的Graphics Driver Reference中找到。 1.11.1

4、文档约定文档约定 本书使用的字体约定和所有其他的 Microsoft Windows 2000 DDK 书中的约定是一 样的。这些约定在驱动程序编写者指南中描述。 许多 DDK 视频和打印机代码例子中使用了匈牙利命名规则。匈牙利命名规则在平台 SDK 文档中描述。 3 第第 2 2 章章 对图形驱动程序的对图形驱动程序的 GDIGDI 支持支持 本章描述了 Microsoft Windows NT/Windows 2000 图形设备接口(GDI) ,详细说明 了 GDI 提供的对图形驱动程序的支持。 本书中术语“GDI”指的是核心模式 GDI(也称作图形引擎) ;对 Microsoft Win

5、32 DDI 的引用是显式的。核心模式 GDI 也称作图形引擎。 在线 Windows 2000 DDK Graphics Driver Reference中记录了 GDI 函数和结构参考。 大多数 GDI 函数声明和结构定义在winddi.h中。对于显示器驱动程序,DirectDraw 堆管 理器函数在dmemmgr.h中声明。这两个文件都和 Windows 2000 DDK 一起发布。 2.12.1 从驱动程序的观点看从驱动程序的观点看 GDIGDI GDI 是 Windows NT/Windows 2000 图形驱动程序和应用之间的中介支持。应用程 序调用 Win32 GDI 函数进行图

6、形输出请求,这个请求通过核心模式 GDI 发送。然后核心 模式 GDI 把这些请求发送到相应的图形驱动程序,如显示器驱动程序或打印机驱动程序。 核心模式 GDI 是一个不能被替代的系统提供的模块。 GDI 通过一系列设备驱动程序接口(DDI)函数和图形驱动程序通信。这些函数用其 前缀 DrvDrv 标识。信息通过这些入口点的输入/输出参数在 GDI 和驱动程序之间传递。驱动程 序必须支持某些 DrvDrvXxx函数用于 GDI 调用。在返回 GDI 之前,驱动程序通过执行在其相关 硬件上相应的操作来支持 GDI 请求。 GDI 本身包括许多图形输出能力,去除驱动程序中支持这些能力的需求就能减小

7、驱动 程序的大小。GDI 也输出驱动程序能够调用的服务函数,进一步减小了驱动程序必须提供 支持的图形输出能力。GDI 服务函数用其 EngEng 前缀标识,而提供访问 GDI 维护的结构的函 数用XxxOBJOBJ_Xxx的形式命名。 图 2.1 显示了这个通信流。 图 2.1 图形驱动程序和 GDI 的相互作用 2.1.12.1.1 作为应用图形语言的作为应用图形语言的 GDIGDI Win32 GDI 和图形引擎都是完全与设备无关的。因此,应用不需要直接访问硬件。基 于一个应用图形请求,GDI 与设备无关的驱动程序一起工作,为一组图形设备提供高品质 的图形输出。打印和显示设备使用相同的 G

8、DI 代码路径。 2.1.22.1.2 作为绘制引擎的作为绘制引擎的 GDIGDI 对于绘图操作,驱动程序首先必须对每个已经有效的 PDEV 结构启用一个表面。PDEV 是一个物理设备的逻辑表示。如果硬件能够用 GDI 标准格式的位图建立,GDI 就能用来进 4 行一些或所有的位图表面的绘制。GDI 也能处理高级的过渡调色技术。 对于启用 PDEV和表面的信息,参考图形驱动程序参考中的 DrvEnablePDEVDrvEnablePDEV 和 DrvEnableSurfaceDrvEnableSurface 函数。 2.1.2.12.1.2.1 GDIGDI 管理的位图管理的位图 GDI 全部

9、用设备无关位图(DIB)格式管理位图,包括每个像素 1 位、4 位、8 位、16 位、24 位和 32 位。在这些位图上,GDI 能进行所有的绘制直线、填充、文本输出以及位块 传输(bitblt)操作。这使得驱动程序用 GDI 进行所有的图形绘制,或者使用实现函数都 是可能的,因为硬件提供了特别支持。 如果设备在 DIB 格式中有帧缓冲区,GDI 能够直接把一些或所有的图形输出到帧缓冲 区,因而减小了驱动程序的大小。如果设备使用了非标准格式的帧缓冲区,驱动程序就必 须实现所有要求的绘图函数。GDI 还能模拟大多数绘图函数,尽管提高了性能上的代价: 像素在被 GDI 操作之前必须拷贝到一个标准格

10、式的位图中,并且在绘图完成后必须拷贝回 原来的格式。 2.1.2.22.1.2.2 GDIGDI 管理的直线和曲线管理的直线和曲线 GDI 提供了改进的直线和曲线的定义。在 DEVICE 坐标中直线端点的坐标不要求是整 数,就像 Windows 3.x 一样。这允许驱动程序不进行大致的取舍就传送图形对象。在 GDI 中基本的曲线是贝塞尔曲线(立方体锯齿)而不是一个椭圆。所有的 GDI 内部操作是用贝 塞尔曲线处理的,它们被大多数高端的设备支持。对那些不处理贝塞尔曲线的设备,GDI 在调用驱动程序绘制它们之前把曲线分割成直线段。 GDI 能够下载用路径形式填充的区域,还有矩形的形式。驱动程序能够

11、把路径分解成 梯形或区间进行填充。 2.1.2.32.1.2.3 GDIGDI 管理的属性:画刷管理的属性:画刷 GDI 也管理所有的属性。GDI 把属性作为画刷传递给驱动程序:驱动程序通过把画刷 转换成有用的内部格式来实现它们。GDI 为驱动程序维护这些转换信息。GDI 还维护画刷所 有的状态:包括范围、相关性、当前位置和线型。驱动程序能够缓存信息但不用来维护任 何状态。除了初始化和画刷实现,GDI 仅调用驱动程序在设备上绘图。在调用驱动程序之 前,GDI 关心转换、区域锁定以及指针与非操作。 当驱动程序要求使用还未实现的画刷,就需要回调 GDI。GDI 为画刷分配存储器并调 用驱动程序来实

12、现它,如果需要,可以进行抖动处理。 2.1.2.42.1.2.4 GDIGDI 过渡调色功能过渡调色功能 GDI 的过渡调色功能产生了高品质的抖动或颜色过渡调色映像,提供给没有内置这些 功能的打印设备和显示设备。颜色过渡调色能提供: 5 在给定的设备上提供最高品质的可再现的彩色和灰度级别 在一组有限的强度级别上提高可视分辨率 在不同的输出设备之间改进彩色相关性 传统的模拟过渡调色是一个使用过渡调色屏幕的单元过程。这个屏幕由相等大小的 单元组成,中心到中心是固定的单元间隔。固定单元间隔调节墨水的浓度,而点的尺寸可 以改变,用来产生连续色调的印记。 在计算机上大多数打印或屏幕阴影也使用固定单元的像

13、素尺寸。为模拟点大小的变 化,用一束像素的组合来模拟过渡调色屏幕。在 Windows NT/Windows 2000 中,GDI 包 括提供一个好的第一近似的过渡调色缺省参数。额外的设备指定信息能加进系统以改进输 出。 2.22.2 GDI/GDI/驱动程序的分工驱动程序的分工 为了理解图形驱动程序设计,弄懂 GDI 和驱动程序的角色以及它们如何协调是重要 的。具有增强能力的 GDI 能够处理很多图形驱动程序预先要求的操作。GDI 对于管理一些 对图形操作很关键的数据结构,例如表面,也是有效的,尽管每个图形驱动程序必须访问 它们。 2.2.12.2.1 GDIGDI 和驱动程序的通信和驱动程序

14、的通信 驱动程序对于 GDI 仅输出一个函数:DrvEnableDriverDrvEnableDriver。所有其他的驱动程序支持的 函数,包括 DrvDisableDriverDrvDisableDriver 函数,是 GDI 通过一个指针数组来输出的。GDI 调用 DrvEnableDriverDrvEnableDriver 初始化驱动程序并返回驱动程序支持的 DDI 函数列表。因为有一些驱动 程序必须支持的函数,所以 GDI 处理操作不包括在驱动程序的 DrvEnableDriverDrvEnableDriver 例程的函 数表中。当驱动程序被卸载时,GDI 调用 DrvDisableD

15、riverDrvDisableDriver。DDI 函数在第 3 章“支持 DDI”中深入讨论。 GDI 使大量的服务对于驱动程序是可用的。这些服务分为两类:用户对象和服务例程。 2.2.1.12.2.1.1 GDIGDI 用户对象用户对象 GDI 保护重要的内部数据结构,但通过把它们作为用户对象传递使驱动程序能访问这 些结构的公共域。用户对象是中间数据结构,在 GDI 数据结构和需要访问这些结构内的信 息的驱动程序之间提供了接口。驱动程序能把指向用户对象的指针传递回 GDI,用以询问 消息信息或请求各种服务。带有公共域的用户对象有下列优点: 排除了直接访问内部 GDI 数据结构相关的问题。

16、为驱动程序提供了一个空间保存 GDI 数据。例如,PATHOBJ 结构能保存计算一个 复杂对象(如路径)要求的所有额外数据。 下列用户对象是可用的: 6 对象描述 BRUSHOBJ 为图形函数定义了画刷对象,输出直线、文本或填充。 驱动程序能调用 BRUSHOBJ 服务来实现画刷或找到 GDI 预先缓存的实现方 法。 CLIPOBJ 为绘图或填充提供能访问裁剪区的驱动程序。这个区域能用一系列矩形 计算。 FLOATOBJ 允许图形驱动程序模拟浮点操作。浮点操作不适用所有其他的核心模式 驱动程序。 FONTOBJ 使驱动程序访问字体的一个特别的实例(或实现)的信息。 PALOBJ 包含 RGB

17、调色板颜色的结构;通过 PALOBJ_cGetColors 和 DrvSetPalette 函数可以访问。 PATHOBJ 定义路径指定要绘制什么(直线或贝塞尔曲线) 。PATHOBJ 结构传递给驱 动程序用以描述要绘制或填充的一系列直线和贝塞尔曲线。 STROBJ 为驱动程序计算轮廓处理和位置的列表,描述如何绘制文本字符串。 SURFOBJ 识别一个表面,它可以是 GDI 位图、设备相关位图或设备管理的表面。 更多的信息参见表面类型。 XFORMOBJ 描述一个任意的线性二维变换,如几何宽度直线(geometric wide line) 。 XLATEOBJ 定义从源表面格式到目的表面格式转

18、换像素所需要的变换。 2.2.1.22.2.1.2 GDIGDI 服务例程服务例程 GDI 输出许多服务例程,其名字的形式是 EngXxx。驱动程序动态地连接到 win32k.sys来直接访问这些例程。GDI 服务例程包括表面管理、绘图模拟以及路径、调色 板、字体和文本服务。这些服务在GDI 支持的服务中详细讨论。 2.2.22.2.2 PDEVPDEV 协商协商 任何图形驱动程序的首要任务之一是在驱动程序初始化期间使 PDEV 有效。PDEV 是物 理设备的逻辑表现。这个表现由驱动程序定义,一般是私有的数据结构。启用 PDEV 的更多 的信息参考 DrvEnablePDEVDrvEnable

19、PDEV。 通过 DrvEnablePDEVDrvEnablePDEV 函数,驱动程序必须给 GDI 提供信息,描述请求的设备及其能 力。驱动程序给 GDI 的一条重要信息是 DEVINFO 结构的 flGraphicsCapsflGraphicsCaps 和 flGraphicsCaps2flGraphicsCaps2 成员中的一组图形能力标志(GCAPS_Xxx 和 GCAPS2_Xxx 标志) 。 能力标志允许 GDI 确定那些操作是 PDEV 支持的。例如,GDI 测试能力标志,指示在 GDI 尝试用这些基本的类型调用 DrvStrokePathDrvStrokePath 函数来绘制路

20、径之前,PDEV 是否能处理贝 塞尔曲线和几何宽度直线。如果能力标志指示 PDEV 不能处理这些基本类型,GDI 断开直线 或曲线,使 GDI 能简化对驱动程序的调用。 从驱动程序一侧来看,无论何时驱动程序从 GDI 获得一个高级的路径相关的调用, 如果路径或裁剪区对设备进行的处理过于复杂,它可返回 FALSE。 当驱动程序处理一条装饰线(cosmetic line)时它不能从 DrvStrokePathDrvStrokePath 返回 FALSE,因为它必须为装饰线处理任意复杂的裁剪区或造型。然而,如果路径是贝塞尔曲线 或几何直线,DrvStrokePathDrvStrokePath 能够返

21、回 FALSE。当这种情况出现时,GDI 把调用分割成简单 7 的调用。就像能力标志位没有置 1 一样。例如,如果当 DrvStrokePathDrvStrokePath 发送一个几何直线 时返回 FALSE,GDI 简化直线并调用 DrvFillPathDrvFillPath 函数。 如果 DrvStrokePathDrvStrokePath 被报告一个错误,它必须返回 DDI_ERROR。 在 GDI 和驱动程序之间的这种协商,对依赖于 PDEV 的函数,允许 GDI 和驱动程序产 生高质量的输出而无须过多的通信。 2.2.32.2.3 表面协商表面协商 绘图和文本输出要求一个绘制的表面。

22、这个表面由 DrvEnableSurfaceDrvEnableSurface 函数创建并称 作主表面(primary surface) 。它也被称作屏幕上的表面(on-screen surface) ,因为它 出现在视频显示器上。每个 PDEV 只能启用一个主表面,尽管一个驱动程序能够支持几个 PDEV。支持 DrvCreateDeviceBitmapDrvCreateDeviceBitmap 函数的驱动程序能够创建和使用其他的表面。这些位 图表面称作次要表面(secondary surface)或屏幕外的表面(off-screen surface) 。对 任一种类型的表面,驱动程序负责确定它

23、支持的绘图操作的类型。 2.2.3.12.2.3.1 表面坐标表面坐标 设备表面是 228*228像素数组的子集。这些像素是由一对 28 位的带符号数寻址的。设 备表面左上角的像素坐标是(0,0) 。设备表面位于这个坐标空间的右下象限,两个坐标都 是非负的。 2.2.3.22.2.3.2 DCDC 原点原点 应用程序要求在 227*227像素的数组范围内保存其图形。设备空间在 DDI 级有其他的 尺寸,因为窗口管理器可能用一个带符号的 27 位的坐标即DC 原点偏移应用程序的坐标。 DC 原点对驱动程序是不可见的,驱动程序在偏移执行之后才识别图形坐标。 2.2.3.32.2.3.3 FIXFI

24、X 坐标坐标 DDI 使用分数坐标,能够在设备表面上 1/16 像素的范围内表示一个位置。 (在矢量设 备上,分数坐标比设备分辨率精确 16 倍。 )分数坐标用 32 位数字表示,是带符号的 28.4 位 FIX 表示法。在这种表示法中,高 28 位表示坐标的整数部分,最低的 4 位表示分数部分。 例如,0 x0000003C 等于+3.7500,0 xFFFFFFE8 等于-1.5000。 FIX 坐标表示直线和贝塞尔曲线的控制点。对某一对象,如矩形裁剪区,GDI 用带符 号的 32 位整数表示坐标。因为坐标是 28 位数,整数坐标最高的 5 位或者全清 0 或者全置 1。 2.2.3.42

25、.2.3.4 表面类型表面类型 8 表面类型在如何处理它们的上下文中可以看到。这些类型如下: 引擎管理的表面 设备管理的表面(标准格式位图) 设备管理的表面(非标准表面) 引擎管理的表面引擎管理的表面 引擎管理的表面有以下特征: 由 GDI 创建和管理。 用一种标准的 DIB 格式作为 DIB 创建:从上至下,原点位于左上角,或者从底 向上,原点位于左下角。 类型为 STYPE_BITMAP。 表面没有相应的设备句柄。 标准格式位图是单平面、压缩像素(每个像素的数据用连续的方式存储)格式的位 图。位图的每条扫描线在 4 字节的边界排列。 在 EngCreateBitmapEngCreateBi

26、tmap 函数中创建的位图是 DIB 格式。为了使引擎能管理位图,必须 是 DIB 格式。 设备管理的表面(标准格式位图)设备管理的表面(标准格式位图) 设备管理的表面有以下特征: 通过对设备驱动程序的 DrvCreateDeviceBitmapDrvCreateDeviceBitmap 函数的调用创建。 有一个表面的相关设备句柄(DHSURF;参见在线 DDK Graphics Driver Reference中的 SURFOBJ。 ) 可以是透明的或不透明的。 不透明的设备管理表面是一种 GDI 既没有任何有关位图格式的信息,也没有位图中 位的参考信息的表面。因为这些原因,驱动程序最少必须

27、支持 DrvBitBltDrvBitBlt、DrvTextOutDrvTextOut 和 DrvStockePathDrvStockePath 函数。这样的表面的类型是 STYPE_DEVICE。 透明的设备管理表面是一种 GDI 含有有关位图格式的信息并知道位图中位的位置的 表面。因为这个原因,驱动程序不需要实现任何绘图操作,并使它们都服从 GDI。这样的 表面的类型是 STYPE_BITMAP。 驱动程序为了转换不透明的位图到透明的位图,它必须调用 EngModifySurfaceEngModifySurface 函数。 通过这一调用,驱动程序通知 GDI 位图格式和在存储器中位图的位置。

28、 设备管理的 DIB 表面允许驱动程序回调 GDI 使 GDI 在表面绘图。管理其自身表面的 驱动程序,也能通过在其表面周围封装 DIB(用 EngCreateBitmapEngCreateBitmap 创建)而引用到 GDI 的 回调,使用 DIB 除外。 设备管理的表面(非标准格式位图)设备管理的表面(非标准格式位图) 通过调用 EngCreateDeviceSurfaceEngCreateDeviceSurface 函数使 GDI 创建表面并返回一个句柄,驱动程序 可以启用一个设备管理的非 DIB 表面。GDI 依赖驱动程序访问和控制绘制到何处,并从设 备管理的表面读出。 设备相关位图(

29、DDB) ,有时称作设备格式位图,是另一种类型的非 DIB、设备管理的 表面。DDB 支持某些驱动程序,如 VGA 驱动程序,实现快速的位图到屏幕的块传送。DDB 也 允许驱动程序在屏幕外的显示存储器绘制非 DIB 位图。如果请求了 DDB,驱动程序能支持 DrvCreateDeviceBitmapDrvCreateDeviceBitmap 函数并调用 EngCreateDeviceBitmapEngCreateDeviceBitmap 函数使引擎返回一个到位图 的句柄。 9 2.2.3.52.2.3.5 GDIGDI 彩色空间转换彩色空间转换 GDI 使用三个 RGB 颜色空间描述它的位图。

30、在每个颜色空间中,三个位域,或颜色通 道,在给定的颜色中分别用来指定红、绿、蓝使用的位的数量。为了能匹配 GDI 的位图能 力,显示器驱动程序必须能从一个 RGB 颜色空间转换到另一个。 GDI 能识别下列的颜色空间。 5,5,5RGB:红、绿、蓝都是 5 位颜色通道。 5,6,5RGB:红色是 5 位颜色通道,绿色是 6 位颜色通道,蓝色是 5 位颜色通 道。 8,8,8RGB:红、绿、蓝都是 8 位颜色通道。 通常,当从一个多位的颜色通道向少位的颜色通道转换时,GDI 丢弃掉低位。当从一 个少位的颜色通道向多位的通道转换时,较小通道的所有位全部拷贝到较大的通道。为了 填充较大通道的剩余位,

31、较小通道的某些位将再次拷贝到较大的通道。下表概述了 GDI 从 一个 RGB 颜色空间转换到另一个所使用的规则。在这个表中,转换过程中值发生改变的颜 色通道用黑体黑体表示。 GDI 颜色空间转换规则 FromTo 规则例子 5,5,55,6,5 源的绿色通道的最高有效位 (MSB)加到目标的绿色通道 的低位最后。 (0 x15,0 x190 x19,0 x1D)变成 (0 x15,0 x330 x33,0 x1D) 。 注意只有绿色通道改变。 源的 5 位通道的值是二进制 11001,转换成 6 位值, 110011。 5,5,58,8,8 对每个通道,源通道的 3 个 MSB 加到目标通道的

32、最低位 的最后。 (0 x150 x15,0 x190 x19,0 x1D0 x1D)变成 (0 xAD0 xAD,0 xCE0 xCE,0 xEF0 xEF) 。 在红色通道中,10101 变成 10101101。类似的变化也出 现在绿色和蓝色通道。 5,6,55,5,5 丢弃源绿色通道的最低有效 位(LSB) 。 (0 x15,0 x330 x33,0 x1D)变成 (0 x15,0 x190 x19, 0 x1D) 。 注意只有绿色通道改变。 丢弃 110011 的最低位,得到 11001。 5,6,58,8,8 对源的 5 位通道(红色和蓝 色) ,从源通道拷贝 3 个 MSB 加到目

33、标通道的最低位的最 后。对 6 位的绿色通道,从 源通道拷贝 2 个 MSB 加到目 标通道的最低位的最后。 (0 x150 x15,0 x330 x33,0 x1D0 x1D)变成 (0 xAD0 xAD,0 xCE0 xCE,0 xEF0 xEF) 。 在红色通道中,10101 变成 10101101。在绿色通道中, 110011 变成 11001111。蓝色 通道的变化和红色通道类似。 8,8,85,5,5 丢弃源通道的 3 个最低有效 位(LSB) 。 (0 xAB0 xAB,0 xCD0 xCD,0 xEF0 xEF)变成 (0 x150 x15,0 x190 x19,0 x1D0

34、x1D) 。 在红色通道中,10101101 变 成 10101。类似的变化也出 现在其他两个通道。 10 8,8,85,6,5 丢弃红色和蓝色通道的 3 个 最低有效位(LSB) 。丢弃绿 色通道的 2 个最低有效位 (LSB) 。 (0 xAB0 xAB,0 xCD0 xCD,0 xEF0 xEF)变成 (0 x150 x15,0 x330 x33,0 x1D0 x1D) 。 在绿色通道中,11001101 变 成 110011。红色和蓝色通道 的变化与前面列出的变换相 同。 2.2.3.62.2.3.6 HookingHooking 和和 PuntingPunting 术语Hooking

35、和Punting指的是驱动程序决定是否提供标准的位图绘画操作,或依 赖 GDI 提供这些操作。如果驱动程序实现了引擎管理的表面,GDI 能处理所有的绘图操作。 然而,如果硬件能加速这些操作,驱动程序能提供一个或更多的绘图函数。通过实现,或 Hooking DrvXxx函数来做到这一点。 也许只想实现绘图操作的一个子集,实现一个特殊的 DDI 接口点。对它不支持的任 何操作,驱动程序能调用相应的 GDI 函数来实现。这称作 Punting 到 GDI。有一些情形是 操作必须在驱动程序内实现。例如,如果驱动程序实现了一个设备管理的表面,某些绘图 函数必须在显示器驱动程序内完成。 HookingHo

36、oking 缺省情况下,当绘图表面是引擎管理的表面时,GDI 处理绘画(绘图)操作。驱动程 序利用硬件对一给定的表面,为一些或所有的绘图函数提供了加速,或者使用了特别的块 传送硬件,能够 hook 这些函数。对于 hook 调用,驱动程序把 hook 指定为 EngAssociateSurface 和 EngModifySurface 函数flHook参数的标记。 如果驱动程序指定了一个函数的 hook 标记,它必须提供在其支持 DDI 入口点的列表 中的函数。驱动程序能够优化具有硬件支持的操作。这样的驱动程序在一个 hook 调用中可 能只能处理某一种情况。例如,如果在一个 hook 调用中

37、请求了复杂的图形,它可能还要更 有效地直接回调 GDI,允许 GDI 处理操作。 这里还有另一个例子,驱动程序选择是否处理 hook 调用。考虑应该支持硬件的驱动 程序,有能力用某些ROP处理位块传输调用。即使驱动程序能够独立地实现许多操作,其 他方面仅是一个缓冲区。这样的驱动程序将为帧缓冲区给位图表面返回一个句柄,就像为 其 PDEV 表面一样,但它将为自己 hook DrvBitBlt 调用。当 GDI 调用 DrvBitBlt 时,驱动 程序能够检查ROP来看它是否是由硬件支持的一个函数。如果不是,驱动程序能通过对 EngBitBlt 的一个调用把操作传递 GDI。 支持设备管理表面的驱

38、动程序必须向外 hook 一些绘图函数,名字是 DrvCopyBits、DrvTextOut 和 DrvStrokePath。虽然 GDI 模拟能够处理其他绘图函数,因为 性能上的原因推荐这种类型的驱动程序 hook 其他函数,就像 DrvBitBlt 和 DrvRealizeBrush 函数,因为模拟需要从或向表面绘图。 PuntingPunting Punting 回调到 GDI 的意思是提交一个调用到相应的 GDI 模拟。通常,对每个 DrvXxx调用都有一个相应的 GDI EngXxx模拟调用,带有相同的参数。在驱动程序制作透 明的位图时,所有的参数都没有改变地传递到 GDI 模拟。对

39、每个调用驱动程序 punt 回 GDI,驱动程序的大小缩减了(因为功能上的代码忽略了) 。然而,因为引擎拥有调用,驱 动程序在执行速度上没有控制。对一些复杂的情况,在驱动程序中提供支持也许没有实际 11 的优势。 可以可以 hookhook 的的 GDIGDI 图形输出函数图形输出函数 驱动程序能够 hook 的图形输出函数和相应的 GDI 模拟在下表中列出。 驱动程序图形输出函数相应的 GDI 模拟 DrvBitBltEngBitBlt DrvPlgBltEngPlgBlt DrvStretchBltEngStretchBlt DrvStretchBltROPEngStretchBltROP

40、 DrvTextOutEngTextOut DrvStrokePathEngStrokePath DrvFillPathEngFillPath DrvStrokeAndFillPathEngStrokeAndFillPath DrvLineToEngLineTo DrvCopyBitsEngCopyBits DrvAlphaBlendEngAlphaBlend DrvGradientFillEngGradientFill DrvTransparentBltEngTransparentBlt 2.32.3 GDIGDI 支持的服务支持的服务 GDI 输出许多服务例程,能简化驱动程序的设计。驱动程

41、序能够直接调用这些例程。 通常图形引擎服务例程的名字以Eng开头。与特殊的对象相关的服务例程总是用对象的名 字开头;例如,CLIPOBJ_cEnumStartCLIPOBJ_cEnumStart 是一个 CLIPOBJ 服务。 注意注意 第一个参数是用户对象的指针的任务例程,是用户对象的方法和使用通常的 C+惯例调用。因此,用 C+写的驱动程序能作为方法访问服务例程。 这些服务例程有以下几类: 表面管理 调色板服务 路径服务 绘图服务 字体和文本服务 第 3 章“支持 DDI”描述了 DDI 的入口点,并解释许多这些服务例程能用来帮助驱动 程序实现入口点。每个服务函数的详细描述参见在线 DDK

42、。 2.3.12.3.1 GDIGDI 对表面的支持对表面的支持 对每个 PDEV,驱动程序必须支持 DrvEnableSurface 函数。DrvEnableSurface 建立 要绘制的表面并将其和 PDEV 相关。驱动程序也必须支持 DrvDisableSurface 函数停止创建 的表面。因为 GDI 创建和维护表面,驱动程序依赖几个 GDI 服务函数(在下页的表中列出) 实现启用和禁止表面。 函数名用途 12 EngAssociateSurface 用 PDEV 相关一个表面并定义驱动程序编写者要 hook 的那个表面的绘图操作。它使用 PDEV 缺省的调色板 和方式步骤。驱动程序在

43、 DrvEnableSurface 的执行 过程中必须对主表面进行调用。当驱动程序在锁定 表面进行写之前启用第二个表面时,也必须进行这 个调用。 EngCheckAbort (仅针对打印机)使打印机驱动程序能够测定打印机 的工作是否已经结束。 EngCreateBitmap 创建一个标准格式 DIB。在这种类型表面上 GDI 能够 执行所有绘图操作。 EngCreateDeviceBitmap 创建一个 DDB,驱动程序在上面绘图是可靠的(虽然 也可创建一个 DIB,在这种情况下驱动程序能够回调 以使 GDI 在上面绘图。 EngCreateDeviceSurfac e 创建一个设备管理表面。

44、驱动程序为这个表面管理 某些绘图操作是可靠的。此函数又返回一个驱动程 序管理句柄。 EngDeleteSurface 删除一个表面(DIB,DDB,或设备管理表面) EngEraseSurface 在表面上用给定的颜色填充指定的矩形,有效地清 除表面。调用这个函数仅可清除一个 GDI 位图表面。 EngLockSurface 通过创建表面的一个用户对象(SURFOBJ)使驱动程 序访问已创建的表面。 (源表面是不锁定的。 ) EngMarkBandingSurface (仅针对打印机)标记表面为相关的表面。 EngUnlockSurface 当驱动程序已完成一项绘图操作时释放一个表面 (禁止第

45、二个表面时调用此函数) 这些函数更详细的内容,请参考在线 DDK。 2.3.22.3.2 GDIGDI 支持的调色板支持的调色板 GDI 可以做大多数有关调色板管理的工作。当 GDI 调用 DrvEnablePDEV 函数,驱动程 序把缺省的调色板作为 DEVINFO 结构的一部分返回到 GDI。驱动程序必须用 EngCreatePalette 函数创建这个调色板。 调色板有效地把 32 位颜色索引映射到 24 位 RGB 颜色值,这是 GDI 使用调色板的方 法。驱动程序指定其调色板,这样 GDI 能确定不同的颜色索引如何在设备上出现。 驱动程序只要使用 GDI 提供的 XLATEOBJ,就

46、不需要处理大多数调色板操作和计算。 如果设备支持可改变的调色板,必须实现 DrvSetPalette 函数。当应用为设备改变 调色板并把作为结果的新调色板传递给驱动程序时,GDI 调用 DrvSetPalette。驱动程序要 设置内部的硬件调色板,尽可能地匹配新调色板。 可以用下表列出的两种格式为 GDI 定义调色板。 调色板格式描述 Indexed 一个颜色索引是 RGB 值的数组的一个索引。这一数 组可以是小的,例如,包括 16 个颜色索引;或者是 大的,例如,包括 4096 个颜色索引,甚至更多。 Bit Fields 颜色索引里的位域依据每一种颜色里 R、G 和 B 的数 量指定颜色。

47、例如,5 位能够用来为每一种颜色提供 13 0 和 31 之间的一个值。当转换为 RGB 时,每个部分 的 5 位的值将放大到包括 0255 的范围。 (通常 RGB 代表自己是由位域定义的) 相反,GDI 一般使用调色板映射。也就是说,应用指定一个 RGB 颜色进行绘图,并且 GDI 必须指定设备显示的颜色索引的地址。就像下表指出的,GDI 提供两种主要的调色板服 务函数用来创建和删除调色板,以及一些与 PALOBJ 和 XLATEOBJ 有关的服务函数用于在两 个调色板之间转换颜色索引。 函数描述 EngCreatePalette 创建一个调色板。驱动程序通过给 DEVINFO 结构里 的

48、调色板返回一个句柄使设备和调色板相联系。 EngDeletePalette 删除给定的调色板。 PALOBJ_cGetColors 允许驱动程序从从一个索引的调色板下载 RBG 颜色。 它由显示驱动程序在 DrvSetPalette 函数中调用。 XLATEOBJ_iXlate 从一个源颜色索引转换到目的颜色索引 XLATEOBJ_piVector 从一个索引的源调色板中检索转换向量。驱动程序 能使用这个向量完成其自身从源索引到目的索引的 转换。 XLATEOBJ_cGetPalette 在一个索引的源调色板中检索 24 位 RGB 颜色或颜色 的位域格式驱动程序能使用这个函数从调色板获得 信

49、息执行颜色混合。 这些函数更详细的内容,请参考在线 DDK。 2.3.32.3.3 路径的路径的 GDIGDI 服务服务 为帮助矢量设备填充复杂的区域,驱动程序能调用创建、修改和计算路径的引擎函 数;这些函数在下表列出。驱动程序通过 PATHOBJ 结构访问路径。 GDI 路径服务函数描述 EngCreatePath 为驱动程序的临时使用分配一个路径。驱动程序在 从当前的绘图调用返回 GDI 之前要删除这个路径。 EngDeletePath 删除通过 EngCreatePath 函数创建的路径。 PATHOBJ_vGetBounds 返回路径的一个混合矩形。 PATHOBJ_vEnumStar

50、t 通知 PATHOBJ 驱动程序将调用 PATHOBJ_bEnum 用指 定的路径计算曲线。这个函数假设计算重新开始时 必须要调用。 PATHOBJ_bEnum 从路径检索下一个 PATHDATA 记录。每个记录描述了 一个子路径的全部或部分。 PATHOBJ_vEnumStartClipLines 允许驱动程序请求相对一个 PATHOBJ 要裁剪的直线。 当裁剪区比一个矩形更复杂时是有用的。 PATHOBJ_bEnumClipLines 从路径计算已裁剪的直线段 PATHOBJ_bMoveTo 在一个已定义的 PATHOBJ 路径里改变现有的位置 PATHOBJ_bPloyLineTo 在

51、一个已定义的 PATHOBJ 路径里绘制直线 PATHOBJ_bPloyBezierTo 在一个已定义的 PATHOBJ 路径里绘制贝塞尔曲线 PATHOBJ_bCloseFigure 通过正绘制的一条直线回至起始点关闭路径 这些函数更详细的内容,请参考在线 DDK。 14 2.3.42.3.4 GDIGDI 绘图服务及其他绘图服务及其他 为了支持 CLIPOBJ,BRUSHOBJ,和 XFORMOBJ 结构,GDI 提供几种绘图服务(在下页 的表中列出)此外 GDI 模拟在前面 hooking 对 punting 中描述。 GDI 绘图服务函数描述 EngCreateClip 为驱动程序的临

52、时使用分配一个 CLIPOBJ。当不再需要它 时驱动程序调用 EngDeleteClip 函数删除它。 EngDeleteClip 用 EngCreateClip 函数删除已分配的 CLIPOBJ EngBitBlt DrvBitBlt 函数的 GDI 模拟 EngCopyBits DrvCopyBits 函数的 GDI 模拟 EngStretchBlt DrvStretchBlt 函数的 GDI 模拟 EngFillPath DrvFillPath 函数的 GDI 模拟 EngStrokeAndFillPath DrvStrokeAndFillPath 函数的 GDI 模拟 EngStrok

53、ePath DrvStrokePath 函数的 GDI 模拟 EngLineTo DrvLineTot 函数的 GDI 模拟 BRUSHOBJ_pvAllocRbrush 为实现驱动程序的画刷分配存储器。 BRUSHOBJ_pvGetRbrush 为实现驱动程序的画刷返回一个指针;如果还没有实现画 刷就实现画刷。 CLIPOBJ_cEnumStart 在已裁剪的全部或部分区域里为矩形的计算设定参数。 (没 有调用这个函数时能够计算一次这个区域,但是随后的计 算需要使用这个函数。 ) CLIPOBJ_bEnum 从裁剪区域恢复大量矩形。 CLIPOBJ_ppoGetPath 作为路径用来恢复复杂

54、的区域。 这些函数更详细的内容,请参考在线 DDK。 2.3.52.3.5 GDIGDI 字体和文本服务字体和文本服务 GDI 提供对字体管理和文本输出的支持。FONTOBJ 结构和相关函数允许驱动程序访问 一个字体的特定实例。为了支持文本输出,驱动程序访问 STROBJ 结构和相关函数。下表列 出了 FONTOBJ 和 STROBJ 相关的函数。 函数描述 EngT ExtOut GDI 模拟 DrvTextOut 函数 FONTOBJ_cGetAllGlyphHandles 允许驱动程序恢复 GDI 字体的每一个字形句柄。驱动程序 使用这个服务下载全部字体。 FONTOBJ_vGetInf

55、o 返回描述已分配字体的信息。 FONTOBJ_cGetGlyphs 为字体使用者把字形句柄翻译成指针给已分配的字形数据。 到下一次调用 FONTOBJ_cGetGlyphs 之前这些指针均有效。 FONTOBJ_pQueryGlyphAttrs 返回有关字体字形的信息。 FONTOBJ_pxoGetXform 为相关的字体恢复从抽象到设备的转换。这个转换要求驱 动程序实现一个驱动程序提供的字体。 FONTOBJ_pifi 取得一个到描述相关字体的 IFIMETRICS 结构的指针。 FONTOBJ_pvTrueTypeFontFile 取得一个到与 TrueType 字体相关的 ROM 映射

56、 TrueType 文 件的指针。 15 STROBJ_vEnumStart 为指定的 STROBJ 结构重新计算 GLYPHPOS 数组。驱动程序 要在随后的计算之前调用这个函数。 STROBJ_bEnum 在指定的 STROBJ 中计算字体轮廓一致性和位置。 STROBJ_dwGetCodePage 返回与指定的 STROBJ 相关的代码页。 这些函数更详细的内容,请参考在线 DDK。 2.3.62.3.6 GDIGDI 支持的服务及其他支持的服务及其他 GDI 给驱动程序编写者提供了多种一般的支持服务,包括装载、读取、操作数据文件 的能力,以及分配内核模式和用户模式的存储器。 2.42.

57、4 浮点数支持浮点数支持 内核模式图形驱动程序在调用 GDI 提供的 EngSaveFloatingPointState 和 EngRestoreFloatingPointState 例程之间必须进行所有的浮点操作。 如果硬件有一个浮点处理器,驱动程序能够直接做浮点操作。另外,驱动程序能使 用 GDI 的 FLOATOBJ 服务来计算浮点操作。不考虑处理器类型,当声明浮点值时,驱动程序 要使用 FLOAT 数据类型。 2.52.5 数据类型数据类型 下表中定义的数据类型在设备驱动程序接口里出现。这些数据类型中的几个在前面 GDI 用户对象里描述过。指针型数据类型用星号(*)标记。 DDI 数据

58、类型变量前缀名定义 BOOLb 可以是 TRUE 或 FALSE 的 32 位值 BYTEj 8 位无符号整数 BRUSHOBJ*pbo 指向画刷对象的指针 CLIPLINEcl 裁剪线对象 CLIPOBJpco 裁剪对象的指针 DHPDEVdhpdev 由设备驱动程序定义的 32 位句柄。它识别一个物理设备。 DHSURFdhsurf 由设备驱动程序定义的 32 位句柄。它识别一个设备管理 表面。 FIXfix 定点数 FLOATLe 浮点数 FLOAT-LONGel 32 位溢出值,依据上下文解释成 LONG 或 FLOAT FLONGfl 32 位标志的设定 FONTOBJ*pfo 字体

59、对象的指针 FSHORTfs 16 位标志的设定 HBMhbm 由 GDI 定义能识别位图的 32 位句柄 HPALhpal 由 GDI 定义能识别调色板的 32 位句柄 HSURFhsurf 由 GDI 定义能识别表面的 32 位句柄 16 LONGl 32 位有符号整数 MIXmix 32 位数量,它的低 16 位定义前景和背景的混合模式 PALOBJ*ppalo 调色板对象指针 PATHOBJ*ppo 路径对象指针 POINTEpte 由FLOAT x,y;组成的小数点结构 POINTFXptfx 由FIX x,y;组成的小数点结构 POINTLptl 由LONG x,y;组成的小数点结构 PWSZpwsz 以 0 结束的 Unicode 字符串的指针 PVOIDpv 没有定义数据类型的 VOID 指针 RECTLrcl 由LONG xLeft,yTop,xRight,yBottom;组成的矩形结构 RECTFXrcfx 由FIX xLeft,yTop,xRight,yBottom;组成的矩形结构 ROP4rop4 指定如何混合源、目标、图形以及屏蔽像素的 32 位值 SHORTs 16 位有符号整数 SIZELsizl 由ULONG Cx,Cy;组成的二维结构 STROBJ*pstro 文本字符串对象指针 SURFOBJ*p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论