第4卷图形驱动程序设计指南 第1部分图形驱动程序 第2部分显示器及视频微端口驱动程序 第3部分打印机驱动程序及假脱机打印部件
1 第 4 卷 图形驱动程序设计指南 第 1 部分 图形驱动程序 第 2 部分 显示器及视频微端口驱动程序 第 3 部分 打印机驱动程序及假脱机打印部件
第1部分图形驱动程序 第1章图形系统概述 第2章GDI支持的图形驱动程序 第3章对DDI的支持 第1章图形系统概述 Microsoft windows nt@/ Windows2000提供了一个健壮的图形体系结构,使第三方 图形硬件公司能很容易地集成其视频显示器和打印设备。本书为编写有效的图形驱动程序提 供了设计指南。可分为以下几个部分: Part 1:图形驱动程序 Part1描述了图形驱动程序接口(GDI)和设备驱动程序接口(DI),讨论了显示器 和打印机驱动程序公共的设计和实现细节。 Part2:显示器和视频微端口驱动程序 Part2描述了 Windows nt/ Windows2000的视频显示器环境,为显示器和视频微端口 驱动程序编写者提供了设计和实现细节。 Part3:打印机驱动程序和假脱机打印部件 Part3描述了构成 Windows nt/ Windows2000打印环境的驱动程序和假脱机打印部件, 解释了如何提供驱动程序和假脱机打印部件的定制,以提供对新的打印机硬件和网络配置的 支持。 Part4:静态映像驱动程序 Part4可以在在线DK上找到,描述了用 Microsoft静态映像体系结构( Microsoft SITI)定义的COM接口,这对提供平板扫描仪和数字静态映像相机这些静态映像硬件的供应 商是有用的 图形驱动程序的术语表,在在线DDK上 Design Guide的结尾可以找到,对图形子系 统和驱动程序设计定义了详细的术语和缩略语。 图形驱动程序函数参考可以在在线DDK的 Graphics Driver Reference中找到 1.1文档约定 本书使用的字体约定和所有其他的 Microsoft Windows@2000DDK书中的约定是一样 的。这些约定在驱动程序编写者指南中描述 许多DK视频和打印机代码例子中使用了匈牙利命名规则。匈牙利命名规则在平台SDK 文档中描述
2 第 1 部分 图形驱动程序 第 1 章 图形系统概述 第 2 章 GDI 支持的图形驱动程序 第 3 章 对 DDI 的支持 第 1 章 图形系统概述 Microsoft Windows NT/Windows 2000 提供了一个健壮的图形体系结构,使第三方 图形硬件公司能很容易地集成其视频显示器和打印设备。本书为编写有效的图形驱动程序提 供了设计指南。可分为以下几个部分: ▪ Part 1:图形驱动程序 Part 1 描述了图形驱动程序接口(GDI)和设备驱动程序接口(DDI),讨论了显示器 和打印机驱动程序公共的设计和实现细节。 ▪ Part 2:显示器和视频微端口驱动程序 Part 2 描述了 Windows NT/Windows 2000 的视频显示器环境,为显示器和视频微端口 驱动程序编写者提供了设计和实现细节。 ▪ Part 3:打印机驱动程序和假脱机打印部件 Part 3 描述了构成 Windows NT/Windows 2000 打印环境的驱动程序和假脱机打印部件, 解释了如何提供驱动程序和假脱机打印部件的定制,以提供对新的打印机硬件和网络配置的 支持。 ▪ Part 4:静态映像驱动程序 Part 4 可以在在线 DDK 上找到,描述了用 Microsoft 静态映像体系结构(Microsoft STI)定义的 COM 接口,这对提供平板扫描仪和数字静态映像相机这些静态映像硬件的供应 商是有用的。 图形驱动程序的术语表,在在线 DDK 上 Design Guide 的结尾可以找到,对图形子系 统和驱动程序设计定义了详细的术语和缩略语。 图形驱动程序函数参考可以在在线 DDK 的 Graphics Driver Reference 中找到。 1.1 文档约定 本书使用的字体约定和所有其他的 Microsoft Windows 2000 DDK 书中的约定是一样 的。这些约定在驱动程序编写者指南中描述。 许多DDK视频和打印机代码例子中使用了匈牙利命名规则。匈牙利命名规则在平台SDK 文档中描述
第2章对图形驱动程序的GD支持 本章描述了 Microsoft Windows nt⑧/ Windows2000图形设备接口(GDI),详细说明 了GDI提供的对图形驱动程序的支持。 本书中术语“GDI”指的是核心模式GDI(也称作图形引擎);对 Microsoft@win32 DDI的引用是显式的。核心模式GDⅠ也称作图形引擎 在线 Windows2000 DDK Graphics Driver Reference中记录了GDI函数和结构参考 大多数GDI函数声明和结构定义在 window.h中。对于显示器驱动程序, DirectDraw堆管理 器函数在 dmemmgr.h中声明。这两个文件都和 Windows2000DK一起发布 2.1从驱动程序的观点看GDI GDI是 Windows nt@/ Windows@2000图形驱动程序和应用之间的中介支持。应用程序 调用Win32@GDⅠ函数进行图形输出请求,这个请求通过核心模式GDI发送。然后核心模式 GDI把这些请求发送到相应的图形驱动程序,如显示器驱动程序或打印机驱动程序。核心模 式GDⅠ是一个不能被替代的系统提供的模块。 GDⅠ通过一系列设备驱动程序接口(DDI)函数和图形驱动程序通信。这些函数用其前 缀Drv标识。信息通过这些入口点的输入/输出参数在GDI和驱动程序之间传递。驱动程序 必须支持某些Drvx函数用于GDI调用。在返回GDI之前,驱动程序通过执行在其相关硬 件上相应的操作来支持GDI请求 GDⅠ本身包括许多图形输出能力,去除驱动程序中支持这些能力的需求就能减小驱动 程序的大小。GDI也输出驱动程序能够调用的服务函数,进一步减小了驱动程序必须提供支 持的图形输出能力。GDI服务函数用其Bng前缀标识,而提供访问GDI维护的结构的函数用 YxxOBJ Xxx的形式命名。 图2.1显示了这个通信流 图2.1图形驱动程序和GDI的相互作用 2.1.1作为应用图形语言的GD Win32GDⅠ和图形引擎都是完全与设备无关的。因此,应用不需要直接访问硬件。基 于一个应用图形请求,GDI与设备无关的驱动程序一起工作,为一组图形设备提供高品质的 图形输出。打印和显示设备使用相同的GDI代码路径 2.1.2作为绘制引擎的GDI 对于绘图操作,驱动程序首先必须对每个已经有效的PDEV结构启用一个表面。PDEV 是一个物理设备的逻辑表示。如果硬件能够用GDI标准格式的位图建立,GDI就能用来进行
3 第 2 章 对图形驱动程序的 GDI 支持 本章描述了 Microsoft Windows NT/Windows 2000 图形设备接口(GDI),详细说明 了 GDI 提供的对图形驱动程序的支持。 本书中术语“GDI”指的是核心模式 GDI(也称作图形引擎);对 Microsoft Win32 DDI 的引用是显式的。核心模式 GDI 也称作图形引擎。 在线 Windows 2000 DDK Graphics Driver Reference 中记录了 GDI 函数和结构参考。 大多数 GDI 函数声明和结构定义在 winddi.h 中。对于显示器驱动程序,DirectDraw 堆管理 器函数在 dmemmgr.h 中声明。这两个文件都和 Windows 2000 DDK 一起发布。 2.1 从驱动程序的观点看 GDI GDI 是 Windows NT/Windows 2000 图形驱动程序和应用之间的中介支持。应用程序 调用 Win32 GDI 函数进行图形输出请求,这个请求通过核心模式 GDI 发送。然后核心模式 GDI 把这些请求发送到相应的图形驱动程序,如显示器驱动程序或打印机驱动程序。核心模 式 GDI 是一个不能被替代的系统提供的模块。 GDI 通过一系列设备驱动程序接口(DDI)函数和图形驱动程序通信。这些函数用其前 缀 Drv 标识。信息通过这些入口点的输入/输出参数在 GDI 和驱动程序之间传递。驱动程序 必须支持某些 DrvXxx 函数用于 GDI 调用。在返回 GDI 之前,驱动程序通过执行在其相关硬 件上相应的操作来支持 GDI 请求。 GDI 本身包括许多图形输出能力,去除驱动程序中支持这些能力的需求就能减小驱动 程序的大小。GDI 也输出驱动程序能够调用的服务函数,进一步减小了驱动程序必须提供支 持的图形输出能力。GDI 服务函数用其 Eng 前缀标识,而提供访问 GDI 维护的结构的函数用 XxxOBJ_Xxx 的形式命名。 图 2.1 显示了这个通信流。 图 2.1 图形驱动程序和 GDI 的相互作用 2.1.1 作为应用图形语言的 GDI Win32 GDI 和图形引擎都是完全与设备无关的。因此,应用不需要直接访问硬件。基 于一个应用图形请求,GDI 与设备无关的驱动程序一起工作,为一组图形设备提供高品质的 图形输出。打印和显示设备使用相同的 GDI 代码路径。 2.1.2 作为绘制引擎的 GDI 对于绘图操作,驱动程序首先必须对每个已经有效的 PDEV 结构启用一个表面。PDEV 是一个物理设备的逻辑表示。如果硬件能够用 GDI 标准格式的位图建立,GDI 就能用来进行
些或所有的位图表面的绘制。GDI也能处理高级的过渡调色技术。 对于启用PDE和表面的信息,参考图形驱动程序参考中的 Dryenablepdey和 Dry Enablesurface函数。 2.1.2.1GDI管理的位图 GDI全部用设备无关位图(DIB)格式管理位图,包括每个像素1位、4位、8位、16 位、24位和32位。在这些位图上,GDI能进行所有的绘制直线、填充、文本输出以及位块 传输( bitblt)操作。这使得驱动程序用GDI进行所有的图形绘制,或者使用实现函数都是 可能的,因为硬件提供了特别支持 如果设备在DIB格式中有帧缓冲区,GDⅠ能够直接把一些或所有的图形输出到帧缓冲 区,因而减小了驱动程序的大小。如果设备使用了非标准格式的帧缓冲区,驱动程序就必须 实现所有要求的绘图函数。GDI还能模拟大多数绘图函数,尽管提高了性能上的代价:像素 在被GDI操作之前必须拷贝到一个标准格式的位图中,并且在绘图完成后必须拷贝回原来的 格式 2.1.2.2GDI管理的直线和曲线 GD提供了改进的直线和曲线的定义。在 DEVICE坐标中直线端点的坐标不要求是整数, 就像 Windows3.x一样。这允许驱动程序不进行大致的取舍就传送图形对象。在GDI中基本 的曲线是贝塞尔曲线(立方体锯齿)而不是一个椭圆。所有的GDI内部操作是用贝塞尔曲线 处理的,它们被大多数高端的设备支持。对那些不处理贝塞尔曲线的设备,GDI在调用驱动 程序绘制它们之前把曲线分割成直线段。 GDⅠ能够下载用路径形式填充的区域,还有矩形的形式。驱动程序能够把路径分解成 梯形或区间进行填充 2.1.2.3cDI管理的属性:画刷 GDⅠ也管理所有的属性。GDI把属性作为画刷传递给驱动程序:驱动程序通过把画刷 转换成有用的内部格式来实现它们。GDI为驱动程序维护这些转换信息。GDI还维护画刷所 有的状态:包括范围、相关性、当前位置和线型。驱动程序能够缓存信息但不用来维护任何 状态。除了初始化和画刷实现,GDⅠ仅调用驱动程序在设备上绘图。在调用驱动程序之前, GDI关心转换、区域锁定以及指针与非操作 当驱动程序要求使用还未实现的画刷,就需要回调GDI。GDI为画刷分配存储器并调 用驱动程序来实现它,如果需要,可以进行抖动处理。 2.1.2.4GDI过渡调色功能 GDIⅠ的过渡调色功能产生了高品质的抖动或颜色过渡调色映像,提供给没有内置这些 功能的打印设备和显示设备。颜色过渡调色能提供
4 一些或所有的位图表面的绘制。GDI 也能处理高级的过渡调色技术。 对于启用 PDEV 和表面的信息,参考图形驱动程序参考中的 DrvEnablePDEV 和 DrvEnableSurface 函数。 2.1.2.1 GDI 管理的位图 GDI 全部用设备无关位图(DIB)格式管理位图,包括每个像素 1 位、4 位、8 位、16 位、24 位和 32 位。在这些位图上,GDI 能进行所有的绘制直线、填充、文本输出以及位块 传输(bitblt)操作。这使得驱动程序用 GDI 进行所有的图形绘制,或者使用实现函数都是 可能的,因为硬件提供了特别支持。 如果设备在 DIB 格式中有帧缓冲区,GDI 能够直接把一些或所有的图形输出到帧缓冲 区,因而减小了驱动程序的大小。如果设备使用了非标准格式的帧缓冲区,驱动程序就必须 实现所有要求的绘图函数。GDI 还能模拟大多数绘图函数,尽管提高了性能上的代价:像素 在被 GDI 操作之前必须拷贝到一个标准格式的位图中,并且在绘图完成后必须拷贝回原来的 格式。 2.1.2.2 GDI 管理的直线和曲线 GDI提供了改进的直线和曲线的定义。在DEVICE坐标中直线端点的坐标不要求是整数, 就像 Windows 3.x 一样。这允许驱动程序不进行大致的取舍就传送图形对象。在 GDI 中基本 的曲线是贝塞尔曲线(立方体锯齿)而不是一个椭圆。所有的 GDI 内部操作是用贝塞尔曲线 处理的,它们被大多数高端的设备支持。对那些不处理贝塞尔曲线的设备,GDI 在调用驱动 程序绘制它们之前把曲线分割成直线段。 GDI 能够下载用路径形式填充的区域,还有矩形的形式。驱动程序能够把路径分解成 梯形或区间进行填充。 2.1.2.3 GDI 管理的属性:画刷 GDI 也管理所有的属性。GDI 把属性作为画刷传递给驱动程序:驱动程序通过把画刷 转换成有用的内部格式来实现它们。GDI 为驱动程序维护这些转换信息。GDI 还维护画刷所 有的状态:包括范围、相关性、当前位置和线型。驱动程序能够缓存信息但不用来维护任何 状态。除了初始化和画刷实现,GDI 仅调用驱动程序在设备上绘图。在调用驱动程序之前, GDI 关心转换、区域锁定以及指针与非操作。 当驱动程序要求使用还未实现的画刷,就需要回调 GDI。GDI 为画刷分配存储器并调 用驱动程序来实现它,如果需要,可以进行抖动处理。 2.1.2.4 GDI 过渡调色功能 GDI 的过渡调色功能产生了高品质的抖动或颜色过渡调色映像,提供给没有内置这些 功能的打印设备和显示设备。颜色过渡调色能提供:
在给定的设备上提供最高品质的可再现的彩色和灰度级别 在一组有限的强度级别上提高可视分辨率 在不同的输出设备之间改进彩色相关性 传统的模拟过渡调色是一个使用过渡调色屏幕的单元过程。这个屏幕由相等大小的单 元组成,中心到中心是固定的单元间隔。固定单元间隔调节墨水的浓度,而点的尺寸可以改 变,用来产生连续色调的印记。 在计算机上大多数打印或屏幕阴影也使用固定单元的像素尺寸。为模拟点大小的变 化,用一束像素的组合来模拟过渡调色屏幕。在 Windows nt@/ Windows@2000中,GDI包 括提供一个好的第一近似的过渡调色缺省参数。额外的设备指定信息能加进系统以改进输 出 2.2GDI/驱动程序的分工 为了理解图形驱动程序设计,弄懂GDI和驱动程序的角色以及它们如何协调是重要的 具有增强能力的GDⅠ能够处理很多图形驱动程序预先要求的操作。GDI对于管理一些对图形 操作很关键的数据结构,例如表面,也是有效的,尽管每个图形驱动程序必须访问它们。 2.2.1GDI和驱动程序的通信 驱动程序对于GDI仅输出一个函数: DryEnableDriver。所有其他的驱动程序支持的 函数,包括 DrvDisableDriver函数,是GDI通过一个指针数组来输出的。GDI调用 DryEnableDriver初始化驱动程序并返回驱动程序支持的DDI函数列表。因为有一些驱动程 序必须支持的函数,所以GDI处理操作不包括在驱动程序的 Dry EnableDriver例程的函数表 中。当驱动程序被卸载时,GDI调用 DryDisabledriver。DDI函数在第3章“支持D/”中 深入讨论 GDI使大量的服务对于驱动程序是可用的。这些服务分为两类:用户对象和服务例程。 2.2.1.1GDI用户对象 GDⅠ保护重要的内部数据结构,但通过把它们作为用户对象传递使驱动程序能访问这 些结构的公共域。用户对象是中间数据结构,在GDI数据结构和需要访问这些结构内的信息 的驱动程序之间提供了接口。驱动程序能把指向用户对象的指针传递回GDI,用以询问消息 信息或请求各种服务。带有公共域的用户对象有下列优点 排除了直接访问内部GDI数据结构相关的问题 为驱动程序提供了一个空间保存GDⅠ数据。例如, PATHOBJ结构能保存计算一个 复杂对象(如路径)要求的所有额外数据 下列用户对象是可用的 对象 描述
5 ▪ 在给定的设备上提供最高品质的可再现的彩色和灰度级别 ▪ 在一组有限的强度级别上提高可视分辨率 ▪ 在不同的输出设备之间改进彩色相关性 传统的模拟过渡调色是一个使用过渡调色屏幕的单元过程。这个屏幕由相等大小的单 元组成,中心到中心是固定的单元间隔。固定单元间隔调节墨水的浓度,而点的尺寸可以改 变,用来产生连续色调的印记。 在计算机上大多数打印或屏幕阴影也使用固定单元的像素尺寸。为模拟点大小的变 化,用一束像素的组合来模拟过渡调色屏幕。在 Windows NT/Windows 2000 中,GDI 包 括提供一个好的第一近似的过渡调色缺省参数。额外的设备指定信息能加进系统以改进输 出。 2.2 GDI/驱动程序的分工 为了理解图形驱动程序设计,弄懂 GDI 和驱动程序的角色以及它们如何协调是重要的。 具有增强能力的 GDI 能够处理很多图形驱动程序预先要求的操作。GDI 对于管理一些对图形 操作很关键的数据结构,例如表面,也是有效的,尽管每个图形驱动程序必须访问它们。 2.2.1 GDI 和驱动程序的通信 驱动程序对于 GDI 仅输出一个函数:DrvEnableDriver。所有其他的驱动程序支持的 函数,包括 DrvDisableDriver 函数,是 GDI 通过一个指针数组来输出的。GDI 调用 DrvEnableDriver 初始化驱动程序并返回驱动程序支持的 DDI 函数列表。因为有一些驱动程 序必须支持的函数,所以 GDI 处理操作不包括在驱动程序的 DrvEnableDriver 例程的函数表 中。当驱动程序被卸载时,GDI 调用 DrvDisableDriver。DDI 函数在第 3 章“支持 DDI”中 深入讨论。 GDI 使大量的服务对于驱动程序是可用的。这些服务分为两类:用户对象和服务例程。 2.2.1.1 GDI 用户对象 GDI 保护重要的内部数据结构,但通过把它们作为用户对象传递使驱动程序能访问这 些结构的公共域。用户对象是中间数据结构,在 GDI 数据结构和需要访问这些结构内的信息 的驱动程序之间提供了接口。驱动程序能把指向用户对象的指针传递回 GDI,用以询问消息 信息或请求各种服务。带有公共域的用户对象有下列优点: ▪ 排除了直接访问内部 GDI 数据结构相关的问题。 ▪ 为驱动程序提供了一个空间保存 GDI 数据。例如,PATHOBJ 结构能保存计算一个 复杂对象(如路径)要求的所有额外数据。 下列用户对象是可用的: 对象 描述