Win9X外 设 驱 动 程 序 的 开 发

鬼谷子
Win9X
外 设 驱 动 程 序 的 开 发
西 安 电 子 科 技 大 学 外 部 设备 研 究 所
马 越 王 厚 生 路 红
--------------------------------------------------------------------------------
---- Win9X 环 境 下 的 外设 驱 动 程 序 的 开 发 是 外 设 产 品 开 发 的主 要 工 作 之 一。 我 们 在XD IJP
001 彩 色 喷墨 打 印 机 的 研 制 过 程 中, 设 计 和 开 发了 该 打 印 机 的 驱 动 程 序。
Win95 打 印 驱 动 程 序 的
实 质 及 开 发 必 要 性
----长 期 使 用Windows、OS/2 和Unix 的 用 户 已 习 惯 于 依 赖 目 的 操 作 系统 的 动 态 链 接 功 能 为
要 执 行 的 应 用 程序 做 准 备。Windows 本 身 在 很 大 程 度 上 可 以说 是DLL 的 大 集 成, 系 统 依 靠
运 行 时 刻 的名 称 辨 别 函 数 来 实 现 其 各 种 元 件 的 内部 链 接。 如 打 印 驱 动 设 备 程 序 支 持 一
个 标 准 的 入 口 点 系 列, 当GDI 模 块 调 用 打印 机 驱 动 程 序 时, 它 就 会 引 用 一 种 可通 过 运 行
时 刻 的 动 态 链 接 来 分 辨 的 函数。 无 论 辨 别 出 的 是 哪 种 打 印 机, 每 一个 打 印 驱 动 程 序 都
会 支 持 同 一 入 口 点系 列。 安 装 一 台 新 打 印 机 时, 无 需 重 新链 接 操 作 系 统, 而 只 需 简 单
地 换 上 含有 设 备 驱 动 程 序 代 码 的 文 件, 这 样, 新的 驱 动 程 序 就 会 满 足 同 一 系 列 的 动 态
链 接。
----Windows 95 广 泛 地 采用 了 保 护 模 式 驱 动 程 序, 这 使 系 统 的性 能 和 可 靠 性 都 得 到 了 提
高。 磁 盘 设备 采 用 从 Windows NT 借 鉴 来 的 新 的 驱 动 程序 结 构, 以 保 证 所 有 硬 盘 都 能 使 用
保护 模 式 驱 动 程 序。 此 外,CD ROM、 串 行 端口 和 鼠 标 的 新 保 护 模 式 驱 动 程 序 使 需要 使
用 实 模 式 驱 动 程 序 来 支 持 设 备 的可 能 性 大 大 减 少 了。 设 备 驱 动 程 序 可以 是 虚 拟 设 备 驱
动 程 序VxDs (Virtual Device Drivers) 或16/32 位 的 保 护 模 式 程 序。Windows 95 不 但“ 虚 拟” 机 器,
而 且“ 虚 拟” 设 备,设 备 驱 动 程 序 结 构 中 最 为 重 要 的 一 个方 面 就 是 它 具 有“ 虚 拟” 设 备 的 功
能。Windows 95 的 基 本 系 统 代 码 构 成 了 大 量 的Windows VxDs, VxD 无 需 与 任 何 硬 件 设 备 发
生 关系, 一 个VxD 就 是 一 个 运 行 于 处 理 器 最 高特 权 级 的32 位 保 护 模 式 模 块, 而 有 些VxD 负
责 处 理 硬 件 设 备, 有 些 只 提 供 与 硬件 毫 无 直 接 关 系 的 操 作 系 统 功 能, 它是Windows 这 种
多 任 务 环 境 下 的 一 种 重 要机 制, 使 不 同 的 虚 拟 机 器 之 间 可 以 共享 设 备。VxD 的 设 计 结 构
已 成 为32 位 保 护模 式 模 块 的 标 准 格 式。
----打 印 设 备 驱 动 程序 是 打 印 子 系 统 的 一 个 部 件, 属 于16 位保 护 模 式 程 序, 不 是VxD, 而
且 与 大 多 数Windows 95 设 备 驱 动 程 序 不 同, 打 印 驱 动 程 序 一般 不 负 责 与 打 印 机 硬 件 的
通 信( 信 号 的收 发、 中 断 处 理 等)。 它 是 由 一 组 图 形函 数 组 成 的 动 态 链 接 库, 这 些 图 形 函
数 是 针 对 某 一 种 特 定 打 印 设 备 的。 这些 接 口 函 数 根 据 自 身 支 持 打 印 机 的 特性 把 与 设 备
无 关 的DDI 调 用 以 某 种 处 理方 式 转 换 成 与 设 备 相 关 的 指 令 和 数 据流, 进 而 经 过 打 印 假 脱
机 系 统 直 接 或间 接 地 送 往 打 印 机。 打 印 机 驱 动 程 序将 它 所 支 持 的 标 准 的 打 印 驱 动 程 序
接口 作 为 入 口 点, 提 供 给 GDI 调 用, 生 成 图形 对 象 在 相 关 打 印 机 上 的 生 成 指 令(打 印 命
令)。 一 种 打 印 机 驱 动 程 序 支 持一 种 特 殊 的 打 印 技 术, 例 如 光 栅 设 备( 如 点 阵 打 印 机)、
向 量 设 备( 如 绘 图 仪) 以及 具 有 高 层 语 言 的 设 备( 如 对 应 于Post Script 页 面 描 述 语 言PDL 的 设
备), 所 以, 打印 驱 动 程 序 是 与 打 印 技 术 密 切 相 关的。 在Windows 95 下 的 一 个 打 印 机 驱 动
程 序可 以 支 持 多 个 生 产 厂 家 的 各 种 型 号 的共 享 基 本 打 印 技 术 的 打 印 机。
----然 而, 由 于 我 们设 计 实 现 的 打 印 机 硬 件 所 采 用 的 特 殊技 术, 使 我 们 不 可 能 使 用 别 的
厂 家 的驱 动 程 序。 即 使 我 们 的 打 印 机 硬 件 接收 的 数 据 格 式 和 命 令 与 现 有 的 某 种 打印 机
的 格 式 完 全 兼 容( 事 实 上 我 们 选择 的 打 印 命 令 集 是PCL, 完 全 有 可 能 与HP 系 列 喷 墨 打 印
机 兼 容), 使 用 某 种 打 印机 的 驱 动 程 序 也 是 不 可 能 的, 因 为 厂家 对 自 己 的 图 像 处 理 技
术、 色 彩 管 理技 术 都 有 一 定 的 保 密 措 施。 同 时, 为 了提 高 打 印 质 量, 针 对 我 们 设 计 实 现
的打 印 机 硬 件 及 我 们 选 择 的 打 印 命 令集, 开 发 我 们 自 己 的 打 印 驱 动 程 序 是必 不 可 少 的
工 作。
“ 小 型 + 通 用” 模 型
----由 于 大 部 分 打 印机 几 乎 以 相 同 的 方 式 工 作, 因 此, 从Windows 3.X 开 始, 打 印 子 系 统
引 入 了 通 用 打 印机 驱 动 程 序。
----通 用 打 印 机 驱 动程 序 的 应 用 相 当 成 功。 微 软 曾 预 计Windows 95 将 支 持100 种 以 上 的 打
印 机, 而 事 实 上更 多, 并 且 将 小 型 驱 动 程 序 结 合 进 显示 驱 动 程 序 和 磁 盘 驱 动 程 序 中。
通 用打 印 驱 动 程 序 在 一 些 小 的 方 面 进 行 了增 强, 小 型 驱 动 程 序 的 设 计 则 没 有 大的 改
变, 原 则 上 通 用 驱 动 程 序 负 责 打印 输 出 过 程 的 大 部 分 操 作, 而 小 型 驱动 程 序 仅 负 责 与
设 备 相 关 的 操 作。
----打 印 字 体 再 现 的质 量 是 关 键 因 素 之 一。 Adobe Systems 公 司 通过 宣 扬 它 的 字 体 和Post
Script 打 印 技 术, 已建 立 了 非 常 成 功 的 基 于 计 算 机 的 打 印和 印 刷 标 准。 打 印 机 大 都 用 打
印 机 命令 来 处 理 散 布 的 数 据 流( 通 用 打 印 机驱 动 程 序 设 计 的 基 础), 但 是Post Script 是页
描 述 语 言, 其 打 印 机 驱 动 程 序 生 成要 打 印 的 页 的 描 述, 其 中 几 乎 没 有 实际 输 出 设 备 的
信 息。 这 种 设 备 无 关 性可 使Post Script 覆 盖 了 从500 美 元 的 激 光 打 印机 到 几 万 美 元 的 高 级
彩 色 胶 片 生 成 系统, 其 翻 译 程 序 驻 留 在 输 出 设 备 上, 负责 把Post Script 数 据 翻 译 成 实 际 的
硬 件 操作, 如 在 纸 上 或 胶 片 上 打 印 出 点 来。 通用 打 印 机 驱 动 程 序 模 型 不 能 满 足Post Script
的 需 要, 所 以, 小 型 驱 动 程 序 结 构也 不 能 用 于Post Script 打 印 机。
----在Windows 系 统 中 最流 行 的 激 光 打 印 机 是 HP Laser Jet 系 列。 微软 和 惠 普 公 司 在Windows
打 印 设 计 上 已 紧密 合 作 了 好 几 年, 包 括True Type 字 体 子 系统 的 设 计。HP 公 司 也 有 自 己 的
打 印 机 语言PCL, 这 对 所 有 的Laser Jet 型 号 都 是 通 用的。 许 多 打 印 机 的“Laser Jet 仿 真” 特 性 基
本 上 意 味 着PCL 仿 真。 我 们 开 发 的 打 印 机使 用 的 打 印 命 令 标 准 为PCL, 也 有 这 方 面的 考
虑。PCL 越 来 越 靠 近Windows 通 用 打 印 机驱 动 程 序 实 现 的 模 型, 因 此, 这 类 打 印机 可 以 使
用 小 型 驱 动 程 序 的 结 构。
----所 以, 在Windows 95 下存 在 着 两 种 驱 动 程 序 模 型, 一 种 是 小型 驱 动 程 序 + 通 用 驱 动 程
序 模 型, 一种 是 完 整 的 驱 动 程 序 模 型。 大 部 分 有实 力 的 公 司 都 采 用 后 者, 我 们 也 花 了相
当 长 的 时 间 尝 试 开 发 这 种 模 型, 试图 在Windows 3.1 DDK 提 供 的 例 程HP PCL 5A 模 型的 基 础
上, 增 加 自 己 的 功 能, 实 现 一 个完 整 的 驱 动 程 序, 但 结 果 很 不 理 想。 主要 问 题 是:
----(1) 该 例 程 的 编 写人 员 大 部 分 是 微 软 公 司 的, 他 们 在 实现 上 考 虑 操 作 系 统 要 比 考 虑
被 驱 动 的硬 件 和 使 用 驱 动 程 序 的 应 用 程 序 更 多一 些, 这 使 其 设 备 和 应 用 软 件 的 兼 容性
较 差。
----(2) 他 们 设 计 的 出发 点 是 说 明 一 个 驱 动 程 序 的 工 作, 而不 是 提 供 一 个 功 能 完 善 的 驱
动 程 序,所 以 其 实 现 比 较 粗 糙, 没 有 考 虑 图 像处 理 功 能、 色 彩 管 理 打 印 数 据 组 合 等一 些
影 响 打 印 输 出 质 量 的 关 键 因 素。
----在 开 发 初 期, 我们 摸 索 着 在 图 像 处 理 功 能 和 打 印 数 据组 合 上 对 其 进 行 完 善, 已 开 发
出 一 个Windows 3.X 下 完 整 打 印 驱 动 程 序 的 雏 形, 可 以与 硬 件 合 作 打 印, 但 存 在 速 度 慢、
资 源紧 张 等 问 题。 另 外, 如 何 使 其 在 各 种 应用 程 序 中 调 用、 在 各 种 版 本 的Windows 平 台上
运 行 正 常, 如 何 使 其 具 有 色 彩 管 理功 能, 由 于 缺 乏 第 一 手 资 料, 我 们 都 无法 解 决。 而 惠
普、 佳 能、 爱 普 生 等 大 公司 多 年 来 与 微 软 等 主 流 操 作 系 统 供 应商 有 着 较 密 切 的 合 作,
同 时 他 们 的 产品 也 具 有 继 承 性, 可 以 充 分 利 用 所 积累 的 开 发 经 验 和 成 果。
----所 以, 我 们 放 弃了 开 发 完 整 驱 动 程 序 的 方 案, 转 而 进行 小 型 驱 动 程 序 + 通 用 驱 动 程
序 的 开发。 这 是 微 软 向 广 大 开 发 商 极 力 推 荐的 模 型, 因 为 这 种 模 型 是 最 支 持 Windows 操
作 系 统 结 构 的 模 型。 一 些 特 殊 的 功能 可 通 过 编 写 小 型 驱 动 程 序 的 回 调 函数 来 实 现。
----这 种 模 型 虽 然 较完 善, 却 也 有 许 多 不 足 之 处。 由 于 对 通用 驱 动 程 序 的 依 赖, 使 新 界
面、 新 功 能的 增 添 异 常 困 难, 如 果 欲 增 加 的 功 能在 回 调 函 数 提 供 的 功 能 接 口 范 围 之外,
那 么, 增 加 一 项 功 能 的 难 度 和 工 作量 与 前 述 我 们 修 改HP  PCL 5A 相 当, 而 且还 要 考 虑 许
多 不 可 控 制 的 因 素。 因 为编 写 一 个 完 整 的 驱 动 程 序, 所 有 的 控制 权 都 在 编 程 者 手 中,
在 小 型 驱 动 程序 中 强 行 修 改 通 用 驱 动 程 序 的 某 些 功能, 势 必 会 打 乱 整 个 驱 动 程 序 的 工
作时 序, 同 时, 微 软 并 未 公 开 其 通 用 驱 动程 序 实 现 的 细 节, 所 以, 一 般 在 增 加、修 改 功
能 的 同 时, 有 些 工 作 仍 需 调 用通 用 驱 动 程 序 提 供 的 接 口 函 数 来 完成, 使 驱 动 程 序 的 处
理 时 间 变 长。
主 要 模 块
----编 写 打 印 驱 动 程序 时, 要 根 据 打 印 机 设 备 驱 动 程 序 与GDI 之 间 接 口 的 规 定, 编 写 完
成 驱 动 程 序功 能 的 接 口 函 数DDI, 并 以 有 效 的 方 式 组织 它 们 生 成 一 个 动 态 链 接 库。
----· 打 印 机 驱 动程 序 主 要 完 成 以 下 功 能:
----· 初 始 化 打 印驱 动 程 序 及 打 印 结 束 的 现 场 恢 复;
----· 与GDI 通 信,提 供 打 印 机 特 征 和 能 力 信 息;
----· 提 供 一 些 用于 设 置 打 印 选 项 的 界 面 ( 如 对 话 框 等);
----· 实 现 图 形、图 像 操 作( 数 字 半 调、 图 形 处 理、 色 彩空 间 转 换 等)。
----其 主 要 的 功 能 模块 包 括:
----打 印 驱 动 程 序 初始 化 当Windows 或Windows 应 用 程 序 用KERNEL.95 中的LoadLibrary 函 数 装 载
打 印 驱 动 程 序 时, 需要 进 行 打 印 驱 动 程 序 的 初 始 化。
----GDI 信 息 数 据 结 构每 个 打 印 机 驱 动 程 序 必 须 有GDIINFO 结 构来 说 明 打 印 机 的 能 力 和 特
性,GDIINFO 结 构主 要 供GDI 来 使 用,GDI 利 用 其 中 的 信 息 来决 定 打 印 机 可 以 做 哪 些 事 以 及
需 要GDI 来 支 持 打 印 输 出 的 程 度。 此 结 构 包 含的 成 员 约40 多 个, 可 分 为 三 类: 驱 动 程 序管
理 信 息、 驱 动 程 序 能 力 信 息、 设 备 边界 信 息。
----使 打 印 机 有 效 或无 效 GDI 将 通 过 调 用 驱 动 程 序 的Enable 函 数使 打 印 驱 动 程 序 的 操 作 有
效。
----主 要 的 中 间 处 理模 块 包 括ExtDeviceMode、 RealizeObject、DeviceCapabilities、Control。
----另 外 还 有 一 些 根据 具 体 的 输 出 内 容 调 用 的 处 理 模 块。由 于 篇 幅 所 限, 模 块 的 具 体 功
能 和 数据 结 构 不 再 详 述。
图 形、 图 像 和 字 体 处 理
----在Unitools 中, 根 据打 印 技 术 和 打 印 命 令 集 选 择 一 种Windows 95 DDK 提 供 的 原 型, 在 此
基 础 上 可 以 增 添自 己 的 特 殊 功 能。 一 般Minidriver 的Callbackfunction 可 以 完 成 这 些 工 作, 但
图 像 处 理 功 能却 例 外, 我 们 是 通 过 修 改 图 像 处 理DDI 实体 来 改 进 图 像 处 理 功 能 的。
----对 于 图 形 的 处理, 有 些 打 印 机( 如HP Laser Jet 4L) 自 身 具 有向 量 图 形 处 理 能 力。 对 于 打
印 机 驱 动程 序 来 说, 一 些 图 形 对 象( 如 直 线、 椭圆 和 圆、 多 边 形 等) 的 输 出 可 以 有 两 种方
式: 一 种 是 直 接 给 打 印 机 发 送 绘 制 图形 对 象 的 向 量 命 令, 由 打 印 机 自 己 根据 这 些 向 量 命
令 完 成 由 向 量 图 形 到 光栅 图 形 的 转 换; 另 一 种 是 直 接 给 打 印机 传 送 光 栅 数 据。 前 一 种
方 式 数 据 传送 量 小, 后 一 种 方 式 由 主 机 完 成 转 换,数 据 传 输 量 大, 但 可 以 减 轻 打 印 机 负
担。 我 们 采 用 应 用 程 序 实 现 图 形 转 换功 能, 驱 动 程 序 实 现 黑 白 数 据 重 组、 彩色 数 据 套
色 功 能, 打 印 机 或 绘 图 机 只接 收 经 过 套 色 校 准 的 按 列 排 列 的 光 栅数 据。
----字 体 的 处 理 方 案有 三 种: 利 用 打 印 机 自 带 的 机 内 字 体、利 用 从 主 机 下 载 的 软 字 体 以
及 利 用 主机 上 的 字 体 并 直 接 接 收 光 栅 化 后 的 数据。 我 们 的 打 印 机 和 绘 图 机 采 用 第 三种
方 案。
----在Win9X 操 作 系 统下, 对 彩 色 喷 墨 打 印 机 驱 动 程 序 的 设计、 开 发, 目 前 国 内 还 没 有 资
料 可 以 借鉴, 开 发 工 作 相 当 艰 辛, 我 们 将 在 开 发过 程 中 积 累 的 经 验 介 绍 给 国 内 同 行,希
望 互 相 借 鉴, 共 同 提 高。

龙丘居士亦可怜
谈空说有夜不眠
忽闻河东师子吼
拄杖落手心茫然