时间是一种很残酷的东西,它只会冲淡能够冲淡的,但也会洗尽铅华帮你留下该留下的。
1.3.4、Windows内置打印驱动程序
现在的Windows下的打印机驱动程序通常分为V4打印机驱动程序(V4 Printer Driver)、XPS打印机驱动程序(XPSDrv)、微软通用打印机驱动程序(Microsoft UniversalPrinter Driver)、微软PostScript打印机驱动程序(Microsoft PostScriptPrinter Driver)和微软绘图仪驱动程序(MicrosoftPlotter Driver)。
那么什么是Windows的驱动程序?
为术语“驱动程序”给出单一的准确定义比较困难。就最基本的意义而言,驱动程序是一个软件组件,可让操作系统和设备彼此通信。例如,假设应用程序需要从设备中读取某些数据。应用程序会调用由操作系统实现的函数,操作系统会调用由驱动程序实现的函数。驱动程序(由设计和制造该设备的同一公司编写)了解如何与设备硬件通信以获取数据。当驱动程序从设备获取数据后,它会将数据返回到操作系统,操作系统将数据返回至应用程序。
当然上面的定义严格上并不准确,并非所有驱动程序都必须由设计该设备的公司编写。在多种情形下,设备根据已发布的硬件标准来设计。这表示驱动程序可以由操作系统编写,设备设计者无须提供驱动程序。也并非所有驱动程序都直接与设备通信。对于给定的 I/O 请求(如从设备读取数据),通常有一些驱动程序(在堆栈中进行分层)参与该请求。可视化堆栈的传统方式是将第一个参与对象放在顶部,将最后一个参与对象放在底部,如此图所示。堆栈中的某些驱动程序可能通过将请求从一种格式转换至另一种格式来参与。这些驱动程序不会与设备直接通信;它们只操纵请求并将请求传递至堆栈下方的驱动程序。
1.3.4.1、V4打印机驱动程序(V4 Printer Driver)
微软在Windwos 8推出的时候在其系统中集成一个最新的打印机驱动程序,命名为V4打印机驱动程序?为什么命名V4打印机驱动程序呢?名为V4版本,主要是V4是Windows打印机驱动程序架构的第四代,其上一代V3主要用于从Windows 2000到Windows 7的历代版本中,而第一、二代则服务于Windows 1.0到Windows ME的各操作系统。最新V4打印驱动架构带来了更小、更快打印机驱动程序,它支持一个打印类(Print class)驱动框架--该系统允许用户在无需定位一款设备驱动的情况下安装打印机,从而使打印机更快的进入工作状态。对于更小的解读,是所指驱动程序的大小,比如说以前Windows Vista 的驱动程序所占空间为768MB,Win7下约446M的驱动,在V4的版本中减少到了184MB。
微软新开发的这个V4驱动程序,提供了支持 PostScript 和非 PostScript 打印机以及绘图仪的单个内置类驱动程序。该驱动程序可取代 Microsoft 绘图仪驱动程序、Microsoft 通用打印机驱动程序和 Microsoft PostScript 打印机驱动程序。该打印机驱动程序可通过自身提供基本的打印支持,无需任何修改。也就是说V4驱动程序将以前的这个驱动程序都包含在内,形成一个统一的驱动程序架构,同时现有的Windows系统因为需要兼容老旧打印机的需要,专业单独提供以前的Microsoft 绘图仪驱动程序、Microsoft 通用打印机驱动程序和 Microsoft PostScript 打印机驱动程序。共同形成了今天Window系统的打印机驱动程序种类。
下图显示了基于V4打印机驱动的架构:
上面是一个v4的打印驱动程序的架构图,在图中,除了渲染组件和用户界面的应用程序外,所有图中的其它功能块都由微软实现。其中蓝色框表示在V3的驱动程序模型中已经存在或利旧使用的现有文件,绿色框表示是V4模型中新的增加的功能模块。
旧驱动程序模型和 V4驱动程序模型之间的一个较大改变在于UI提供的方式。在旧打印机驱动程序模型中,配置UI内置于驱动程序之中。在V4驱动程序模型中,制造商的UI与他们的驱动程序完全分离。基于以下原因,这是一个更佳的体系结构决策:控制打印机的UI现在是一个可在从Metro风格应用程序或桌面应用程序打印时调用的应用程序。这可让打印机制造商为用户提供更丰富的体验。
借助 V4驱动程序模型,微软还大幅改变了打印机驱动程序的安装过程。在 Windows 7和Windows较早版本中,所有打印机驱动程序都存储于“驱动程序存储单元”中,这有点类似于所有驱动程序类型的数据库。当用户接入打印机时,微软将在驱动程序存储单元中查找适当的驱动程序,并将其复制到一个特定的位置,在此后台处理程序可与用户的打印机共同使用该驱动程序。而在 V4中,微软消除了额外的复制造作,从而显著减少了磁盘的 I/O。打印后台处理程序在V4中可以很容易的了解如何在驱动程序存储单元中查找驱动程序。
对于通过渲染将打印任务转化为打印设备的页面描述语言,V4的打印驱动程序模型使用的XPSDrv渲染模块。
下图显示了V4打印机驱动程序渲染架构图。
下文将说明上图中的流程进行简要说明,在图中,蓝色的部分就是需要打印机硬件厂家去开发或者说可以开发的功能模块。
对于XPS的应用程序,直接转入XPS Spool File里面进行存储,如果是基于GDI的应用程序,就需要经过MXDC模块的转换,从GDI转为XPS,再导入到XPS Spool File中,在之后有一个XPSDrv渲染组件,该模块有两个,一个是提供给打印机硬件厂家,打印机厂家可以自定义该组件的渲染处理器,然后将其渲染为自家的打印机PDL或者PCL、PS等,它可以使用XPS光栅或第三方RIP服务。RIP是“光栅图像处理器”(Raster Image Processor)的简写。第二个模块就完全定义好了XPS渲染模块的渲染PDL类型,比如将XPS渲染成PCL或者PS。
在图的左下角有一个颜色管理组件,颜色管理在v4的打印驱动程序提供支持,在之前的V3等版本中,这个颜色管理一般都是采用打印机自身的颜色管理组件。在V4打印驱动中,这个颜色管理和Windows的颜色系统(WCS)兼容并保持一致的颜色配置文件或遵循国际颜色联盟(ICC)颜色配置文件。同时V4打印驱动程序也可以使用特定设备颜色表的驱动程序属性包来进行颜色管理。Windows的颜色系统默认提供了 29种系统颜色以供各种显示使用。在登录系统,我们需要使用的颜色,其实就是颜色的后面跟着红、绿、蓝三种颜色的值(所有的色彩都是基于红、绿、蓝三种颜色变化而来),该值的变化范围是0到255,我们可以根据这三种颜色的值的不同而得到其他的颜色。而ICC就是InternationalColorConsortium(国际色彩协会),目前会员有70几个,全球几乎所有数字设备生产商都是其成员。该组织建立了色彩描述文件的标准格式,称为ICC 标准格式,它能跨平台、跨系统的应用在不同的成员公司的设备及软件系统中。
XPSDrv渲染还应该介绍的是,在V4的渲染架构中,添加了图形处理单元(GPU)来提供更快的XPS光栅化。
同时在V4驱动程序中,配置文件的格式还是使用通用打印机说明(GPD)和PostScript打印机描述(PPD)文件格式,与V3打印机驱动程序保持不变。现有的GPD和PPD文件是兼容的。
1.3.4.2、XPS打印机驱动程序(XPSDrv)
微软通过 XPS 打印机驱动程序 (XPSDrv) 为打印 XPS 文档格式提供支持。该驱动程序扩展了微软基于GDI的第 3 版打印机驱动程序体系结构,可支持消耗XML纸张规范(XPS)文档。通过XPSDrv打印机驱动程序,XPS文档格式可用作后台打印文件格式和文档文件格式。该XPSDrv打印机驱动程序可通过自身提供基本的XPS打印支持,无需任何修改。
XPSDrv打印机驱动程序主要由三个组成部分:
- XPSDrv渲染模块
- XPSDrv配置模块
- XPSDrv的安装
就拿其渲染模块来说,在前面其实我们已经在XPS驱动框架中讲述过XPSdrv的架构了:
如图,一个XPSDrv的渲染模块主要包含这三个模块:
- 过滤器管道管理
- 内过滤通讯
- 属性包
一个XPSDrv打印机驱动程序的渲染模块包含用于呈现XPS假脱机文件中的内容并过滤器输出到打印机。驱动程序是通过运行在一个过滤管道中的过滤器进行渲染。过滤器管道管理(FPM)管理器与各个过滤器通过Inter-FilterCommunicator(IFC)通讯,控制过滤器之间的相互作用。
其中过滤器管道管理必须:
- 加载并初始化过滤器。
- 管理过滤器之间的数据。
- 当打印作业完成后卸载过滤器。
详细的工作过程可以返回XPS驱动框架查看。
如果打印机使用XPS调用的是一种页面描述语言(PDL),并且不希望采用XPSDrv渲染模块进行渲染,那么XPSDrv就会采用“空管道”直接将数据发送到端口监视器并转发到打印机。
而如果想要开发一个XPS驱动程序,用户仅仅需要创建以下组件:
- XPS过滤器
- XPS过滤管道配置文件
如下图,我们可以看到XPSDrv的配置模块结构:
如图我们可以看见,XPSdrv的配置模块其实有三个对象组成,这三个对象是相互排斥的。
特别要注意的是,在安装XPSDrv的时候,后台处理程序需要正确安装XPSDrv的引用:
驱动INF文件的CopyFiles部分指令必须引用过滤管道配置文件。需求指令必须引用Xpsdrv.oem。如果配置模块是基于Unidrv的,需求指令必须引用Unidrv.oem和Xpsgpd.oem。同样,如果XPSDrv配置模块是基于PScript5的,需求指令必须引用Pscript.oem和Xpsppd.oem。
1.3.4.3、基于OpenXPS的支持
至于对OpenXPS的支持,主要是打印系统将使用名为 XPS(XML 纸张规范)的高质量中间格式作为内部内容格式。微软选择XPS作为打印系统的基础在于XPS是一种高度灵活的格式,而且非常类似于电子纸张。XPS可支持高保真的颜色,而且由于它是基于XML的描述,并且没有嵌入可执行的代码,因而是存档的最佳格式,而且相对于其它选项,其安全系数更高。OpenXPS是Microsoft 与 ECMA Internationa(欧洲计算机制造商协会)开展了通力合作,将其制定为一个开放的标准,是微软对抗Adobe PDF格式的利器。因此所有的打印机厂商都可以使用这个标准来进行打印机驱动程序的开发。
1.3.4.4、微软通用打印机驱动程序(Microsoft UniversalPrinter Driver)
微软通过通用打印机驱动程序 (Unidrv) 为非 PostScript 打印机提供支持。为增强非 PostScript 打印机的功能,用户可以创建由一个或多个通用打印机描述 (GPD) 文件组成的微型驱动程序。通用打印机描述 (GPD) 文件是指打印机描述的文本文件。每个微型驱动程序描述了一个制造商的一种打印机类型。这种基于文本的描述称为通用打印机描述语言(GPD),每一个文件称为GPD文件。微软通用打印驱动程序(Unidrv)也被称为v3的打印驱动程序。
Unidrv使用GPD文件描述打印机,包含以下功能:
- 通用的、标准的打印机特征,在大部分的打印机上会看到;
- 唯一的、自定义的打印机特征,由特定打印机提供;
- 安装打印机选项,安装以后能够被选择;
- 选项限制,允许指定不兼容的选项;
- 条件语句,允许指定一些打印特征依赖于其它打印特征;
- 打印命令规则,打印命令可以是从一个大的标准变量中选择的当前值,也可以是对那些变量执行算术运算的结果;
- 自定义的帮助文件,在unidrv提供的标准帮助文件之外,描述自定义的特征。
通常,微型驱动程序必须提供资源,例如字体、位图、本地化的文本字符串。这些资源都被封装在一个资源动态链接库中。
GPD文件用于创建unidrv的小驱动程序。该文件包含GPD文件项,这些项使用GPD语言提供以下类型的信息:
1 打印机属性,描述打印机的特征;
2 打印机命令,描述打印机的操作;
3 打印机特征,描述打印机中可被通用驱动程序控制的功能;
4打印机选项,代表可以指定给打印机的状态;
5 打印机字体描述,指定与hardware-resident及墨盒字体相关的特征;
6 条件语句,描述打印机属性和打印机配置之间的依赖关系;
GPD语言也定义GPD文件项控制以下的操作:
- 光栅数据压缩
- 颜色格式处理
- Unidrv的半色调
- 处理安装特征和选项
- 描述打印机内存配置
通用打印机驱动程序(Unidrv)提供了以下功能:
支持所有非PostScript打印机,使用描述每个打印机的特点的具体打印机UniDrv微型。
- 一个Unidrv的用户界面,基于TreeView控件和属性表,这对所有的打印机都是一致的。
- 一个单一的Unidrv渲染组件,随着GDI图形引擎一起,转换微软Win32 GDI应用程序到打印机语言并将其发送到后台打印程序。
其架构如下图所示:
图中的组件包括:
- 应用:一个用户应用程序,如文字处理软件,它向用户提供打印功能。
- GDI32.DLL:用户模式DLL导出的Win32 GDI函数。
- 内核模式图形引擎:实现GDI功能NT执行代码。
- 微型驱动程序的文本文件:基于文本的UniDrv微型驱动,通过使用GPD文件描述打印机。
- 二进制数据文件:临时文件(用.bud扩展名),是Unidrv解析包含微型驱动程序中的文本文件中的信息后生成的。
- unidrvui.dll:UNIDRV用户界面的DLL,所有Unidrv的支持的打印机提供通用的用户界面代码。
- 用户接口插件:可选,具体的打印机用户界面插件。
- compstui.dll:CPSUI用户界面打印机。
- UNIDRV.DLL:UNIDRV渲染组件在渲染后将图像和图像数据流发送到打印后台处理程序。
- 渲染插件:可选,不适用Windows提供的渲染组件,使用打印机专用的渲染组件时,需要在这里写入该打印机的渲染插件以支持打印机渲染。
Unidrvui.dll是通用打印机驱动程序的打印机接口动态链接库,它利用公用属性页用户接口(CPSUI)来创建打印驱动程序的用户界面。用户界面包含了 Unidrv Minidriver中定制的打印机的特性与选项,可以通过修改Minidriver的文件来更改这些选项。Unidrvui.dll中的代码和CPSUI一起决定了用户界面的内容。而且Unidrv还提供了可选的用户插件接口修改用户界面的内容。
Unidrv.dll是通用打印机驱动程序的打印机图形DLL,也就是图中的UNIDRV 处理程序,它负责输出所有的DDI函数。当应用程序调用GDI函数进行打印操作的时候,这些DDI函数帮助GDI来进行打印页内图像的描画工作。随后它会将处理后的数据发送给假脱机系统,存放在打印池中。同样 Unidrv也提供了可选的Render插件来修改驱动程序的处理操作。
Minidriver Text Files是小驱动程序文本文件,其利用GPD文件条目描述打印机。安装打印机时,Unidrv的GPD解析器会解析所有的GPD文件,并利用 GPD文件所包含的信息来创建打印机的临时二进制数据文件(Binary Data Files),所有的Unidrv用户接口都包含在这个二进制文件当中。
小驱动程序(Minidriver)主要是由一些描述打印机特性的文件组成,这是微软定义的一种文本文件 GPD(Generic PrinterDescription),GPD在Unidrv中主要为驱动提供一些关于打印机的信息:描述打印机性能属性;控制打印机操作的命令;描述Unidrv可控的打印机特性;指定与打印机字体相关的字体描述;描述打印机属性与打印机配置依赖性的条件语句等。
参考:微软通用打印机驱动程序参考手册
1.3.4.5、微软PostScript打印机驱动程序(Microsoft PostScriptPrinter Driver)
微软通过PostScript打印机驱动程序 (Pscript)为PostScript打印机提供支持。为增强PostScript打印机的功能,用户可以创建由一个或多个 PostScript 打印机描述(PPD)文件和字体(NTF)文件组成的微型驱动程序。
微软通过PostScript打印机驱动程序 (Pscript)支持所有PostScript打印机,并用特定打印机的基于PPD的Pscript小驱动程序描述每一种打印机的特征。该驱动中提供一个Pscript用户接口,基于树形视图控件及属性表单,对所有的打印机是一致的,但对每一种打印机的单独选项也是可以改变的。同时还有一个单独的Pscript渲染器,与GID图形引擎一起工作,将微软应用程序Win32 GDI的调用转换成可以发送到打印假脱机的的打印机命令。并且,该打印驱动支持Adobe提供PostScript Level 1,Level 2,Leve3的全部特性。
下图描述了该驱动程序的结构图:
图中组件说明如下:
- 应用程序:一个用户的应用程序,如可给用户提供打印能力的字处理程序。
- gdi32.dll:用户模式的DLL,导出Win32 GDI的函数。
- 内核模式的图形引擎:实现GDI功能的Windows NT代码执行。
- 小驱动程序文本文件:基于文本的Pscript小驱动程序,用PPD文件创建。
- 二进制数据文件:Pscript在解析包含于小驱动程序的文本文件中的信息后创建的临时文件(具有.bpd扩展名)。
- ps5ui.dll:Pscript用户接口的DLL,向所有的支持Pscript的打印机提供通用的UI代码。
- 用户接口插件:可选,特定打印机的用户接口插件。
- compstui.dll:为打印机的CPSUI用户接口
- pscript5.dll:pscript 渲染器,它处理文本输出并绘制图像,然后发送文本数据及图像数据到打印假脱机。
- 渲染插件:可选,特定打印机的绘制插件。
重点说明的是,Pscript的小驱动程序是从.ppd及.ntf文件创建的。【https://msdn.microsoft.com/en-us/library/windows/hardware/ff561810(v=vs.85).aspx】
PPD文件是基于文本的PostScript printerDescription(.ppd)文件,描述了PostScript打印机的特征。Pscript驱动程序对Windows 2000支持的.ppd文件是与Adobe Systems Inc公司的v4.3版的PPD规范说明相兼容的。Pscript读一个打印机的.ppd文件并将文本转换为二进制的格式,在本地存储为一个.bpd文件并在.ppd文件每一次改变时被重新生成。
NTF文件是Windows 2000字体文件(.ntf文件)是用于描述由Pscript支持的打印机的设备字体。微软提供了一个默认的.ntf文件,名为pscript.ntf,它包含有对遇到的US设备字体的通用描述。对Far East打印机,微软也提供了一个默认的.ntf文件,名称为pscriptfe.ntf,它包含对遇到的Far East打印机字体的通用描述。
另外,硬件厂商可以提供没有被pscript.ntf支持的设备字体描述。这些字体描述可以由转换AFM文件到NTF文件来被创建。定制的、特定模型的打印机可以通过将它们列为独立的打印机INF文件来安装。
Pscript根据最先检查到的特定打印机模型的.ntf文件来搜索字体的规格,然后用第一次发现的字体描述来检查pscript.nft文件。
因此在安装Pscript小驱动程序时需要一个打印机的printer.inf文件,它标识了小驱动程序的文件。如果一种打印机模式不被微软的打印机的inf文件、ntprint.inf文件所支持,就需要有厂商提供的.inf文件。.inf文件应当引用定义于ntprint.inf中的printer.inf文件数据部分及printer.inf文件的安装部分。
1.3.4.6、微软绘图仪驱动程序(Microsoft PlotterDriver)
微软通过 Microsoft 绘图仪驱动程序(Msplot)为支持惠普图形语言的绘图仪提供支持。为增强绘图仪的功能,用户可以创建由一个或多个绘图仪特性数据 (PCD)文件组成的微型驱动程序。这个驱动程序就是给专门HP的绘图仪使用的,并且支持所有的HP的绘图仪设备。我们在上文说过,绘图仪其实也是有着自己的打印语言的,绘图仪的打印语言就是HPGL和HPGL/2。
绘图仪是一种输出图形的硬拷贝设备。绘图仪在绘图软件的支持下课绘制出复杂、精确的图形,是各种计算机辅助设计不可缺少的工具。绘图仪的性能指标主要有绘图笔数、图纸尺寸、分辨率、接口形式及绘图语言等。
按照绘图方式可分为笔试和喷墨两种:
1、笔式绘图仪,用过绘图笔将纸样绘制在纸上,绘图时,绘图纸会来回的滚动所以对绘图纸张的要求就稍微高些。
2、喷墨绘图机是利用墨水将线条喷在纸上,有特制和使用HP通用喷头两种,由于是单方向的走纸,于是对纸张的要求就不是很高,如此绘图仪磨损也较小使用寿命更长。
而同样和打印机一样,对于绘图仪的驱动程序也是提供一个绘图仪驱动程序的用户界面,基于TreeView控件和属性表,所有绘图仪都是一致的。同时绘图仪驱动程序渲染模块随着GDI图形引擎一起工作,转换Win32 GDI应用程序到打印机命令并发送到后台打印程序。而且,为了提供一个新的HPGL/2兼容的设备类型的支持,都需要提供一个描述该设备的微型驱动。
其驱动的结构图下如下所示:
图中的组件包括:
- 应用:用户应用程序,为用户提供打印功能。
- GDI32.DLL:用户模式DLL下导出的Win32 GDI函数。
- 内核模式图形引擎:基于NT实现GDI功能操作系统执行的代码。
- 微型驱动程序:MSPlot微型驱动程序(.PCD文件)。
- 缓存.PCD文件数据:从微型驱动中读取数据的.PCD文件。
- plotui.dll:绘图仪驱动程序用户界面的DLL,为所有MSPlot支持的打印机提供通用的用户界面代码。
- compstui.dll:CPSUI用户界面打印机。
- plotter.dll:绘图仪驱动程序渲染,使得图像和图像数据流发送到假脱机程序。
对于绘图仪驱动程序微型驱动程序,微软绘图仪驱动程序特定型号的微型驱动程序是从HP创建并提供的描述设备特性的二进制文件.PCD。要生成.PCD文件,必须首先创建一个使用PCD源文件格式的文本文件。然后,必须运行plotgpc.exe,它是包含在Windows驱动程序工具包(WDK)中的程序。
如果我们需要新接入一款新的绘图仪,只需要设计一个新的数据文件.PCD给到Windows的绘图仪驱动,绘图仪驱动即可读取.PCD的文件并很好的和高绘图仪进行工作了。