2024年3月23日发(作者:)

打印机驱动程序的基础知识

1. 什么是打印机驱动?

打印机驱动是一种基于操作系统的DDI接口而开发的,用于将各种Application数据翻

译成打印机能解释的数据,并输出到打印机而开发的程序。

2. 为什么要做打印机驱动?

打印机的语言有很多种(如ps,lips,pcl等),各个厂商开发的打印机所能解释的打印

机数据也是各不相同的。如果没有打印机驱动,那么每个Application就需要针对每一种打

印机开发不同的输出程序,这显然是不可能的。为解决该问题,操作系统就制定了一套机制

DDI(device driver interface),基于这套机制,Application无需考虑输出设备的具体信息

(如打印机语言等),只需要调用相应的GDI(graphics device interface)函数,就可以将数

据输出到不同的输出设备上,也就是说设备无关的。同时GDI会调用OS提供的相应的DDI

接口,而这些DDI接口的实现,就是打印机驱动。在打印机驱动内部,需要针对不同的设备,

作相应的处理,从而减少了Application开发输出程序的负担。

3. Application,GDI,打印机驱动之间的关系

Application

graphics requests

GDI32

User Mode

Kernel Mode

Graphic Engine(GDI)

DDI CallGDI Call

Graphics Driver

Graphics Driver and GDI Interaction

在上面的图中,需要注意的是Application是不能直接调用DDI接口的,必须通过调用

GDI函数来实现对DDI接口的调用。

4. 打印机驱动的结构

打印机驱动主要由两大部分组成,即图形部分和界面部分。

图形部分的功能为通过GDI将打印机参数传给Application,同时将GDI传过来的数据

翻译成打印机可以解释的数据,并且发送到print spooler。其流程结构如下图:

Application

Spool

File

Spooler

EMF Print

Processor

Port

Monitor

Write Printer

GDI User_Mode

Client

Yes

User_Mode Printer Graphics

DLL

Output Format =

EMF?

No

RAW data stream

User Mode

Kernel Mode

GDI Rendering

Engine(GRE)

Kernel_Mode Port

Driver Stack

Callbacks to GRE

Printer

Print Job Data Flow, Using a User-Mode Printer Graphics DLL

上面是USER MODE打印数据流程,与之相对的也有KERNEL MODE打印数据流程,

这个以后再说。

图形部分内部流程的详细说明:

DrvCopyBits

DrvEnablePDEV

(DEVMODE and registry

-> GDIINFO,DEVINFO)

(Entrance)

DrvEnableDriverDrvCompletePDEV

DrvStartDoc

(Start Job Control

Command)

DrvStartPage

(Start Page Control

Command)

Banding

DrvBitBlt

DrvStretchBlt

DrvRealizeBrush

(No Band)

DrvStartBanding

DrvEnableSurface

(Render a print job)

DrvPaint

Render Functions

DrvDisableDriver

(Exit)

DrvResetPDEV

DrvNextBand

(Last Band?)

(Yes)

DrvDisableSurface

DrvSendPage

(End Page Control

Command)

DrvDisablePDEV

DrvEndDoc

(End Job Control

Command)

DrvStrokePath

其中的DDI接口在DDK帮助文档中都有详细的说明。

界面部分的功能为提供用户界面,用户可以根据自己的需要通过该界面设置不同的打印

参数,同时提供一个spooler为通知驱动打印相关的系统事件而能够调用的接口。

(No)

DrvFillPath

DrvStrokeAndFillPath

DrvDitherColor

DrvTextOut

DrvEscape

界面部分函数的说明:

DrvDocumentPropertySheet

s

DrvDevicePropertySheets

(Doucument Property Sheets function)

DrvDocumentEvent

(Device Property Sheets function)

DrvDriverEvent

DrvDeviceCapabilities(Printer’s Capabilities function)

DrvQueryJobAttributes

DrvPrinterEvent

(Driver Install functions)

DevQueryPrintEx

DrvUpgradePrinter

DrvConvertDevMode

(Other functions,OPtional)

其中的DDI接口在DDK帮助文档中都有详细的说明。