Windows 打印流程

Windows 打印流程_第1张图片

 

(1)应用程序通知打印池开始一个新的打印任务
(2)打印池调用打印驱动dll,显示打印对话框,并将打印设置信息传给它
(3)应用程序调用GDI进行图形绘制
(4)GDI将应用程序的绘图调用保存在EMF文件中,记录完毕将之发送给打印池
(5)GDI返回,应用程序完成一次假脱机打印过程,可以进行其他任务
(6)打印池调用GDI,把EMF文件中的绘图命令一条条分解到打印机上下文中
(7)GDI通过系统调用,调用GDI引擎实现绘图
(8)GDI引擎将GDI绘图命令分解组合,在打印驱动dll的帮助下,完成各种图形的绘制
(9)打印驱动dll将绘图解码后的数据发往打印池
(10)打印池把打印机数据发往打印机

DDI entry points 通过钩入(Hooking)和踢回(Punking)机制决定绘图操作有谁完成。
Hooking: 绘图操作由自定义的驱动程序图形绘制函数完成,这种函数一般为DrvXxx形式
Hooking: 绘图操作由GDI模拟函数完成,这种函数一般为EngXxx形式

Punting the callback to GDI means to put in a call to the corresponding GDI simulation. 
In general, for every DrvXxx graphics call, 
there is a corresponding GDI EngXxx simulation call that takes the same arguments.

Driver Graphics Output Function          Corresponding GDI Simulation
DrvBitBlt                                                EngBitBlt
DrvPlgBlt                                               EngPlgBlt
DrvStretchBlt                                         EngStretchBlt
DrvStretchBltROP                                 EngStretchBltROP
DrvTextOut                                            EngTextOut
DrvStrokePath                                       EngStrokePath
DrvFillPath                                             EngFillPath
DrvStrokeAndFillPath                            EngStrokeAndFillPath
DrvLineTo                                              EngLineTo
DrvCopyBits                                          EngCopyBits
DrvAlphaBlend                                      EngAlphaBlend
DrvGradientFill                                      EngGradientFill
DrvTransparentBlt                                 EngTransparentBlt

DrvEnableDriver
打印驱动dll的入口点,相当于一般dll的dllMain,用自定义的DDI table初始化DRVENABLEDATA,
Print driver host for applications(C:\Windows\splwow64.exe)或者GDI引擎(e.g. chrome)将会加载打印驱动dll.

DrvEnablePDEV
(1)设置打印机句柄
(2)获取DEVMODE中的相关数据(.e.g UI中可能追加了一些额外profile),留给Device后续使用
(3)初始化DevInfo
(4)初始化GDIINFO

DrvCompletePDEV
设置GDI Device句柄,用来通知相关驱动,GDI Device已经Ready

DrvEnableSurface
为GDI引擎提供绘图所需的surface,通过EngCreateDeviceSurface创建一个device-dependent bitmap(DDB),
调用EngAssociateSurface,使GDI device与surface关联,并指定驱动程序将HOOK哪些GDI函数

DrvStartDoc
开始打印时调用

DrvEndDoc
结束打印时调用

DrvStartPage
GDI引擎准备把物理页contents发给打印驱动去render

DrvSendPage
物理页已经完成了绘画,打印驱动将它发给打印机

DrvAlphaBlend
实现位块透明度转换

DrvBitBlt
实现位块数据传输

DrvCopyBits
复制位图

DrvFillPath
填充闭合路径

DrvGradientFill
绘制阴影

DrvLineTo
划线

DrvNextBand
在一个物理页绘制完后调用

DrvStretchBlt
缩放位块

DrvStrokePath
用画笔绘制Path

DrvTextOut
绘制文本

 

你可能感兴趣的:(windows,编程)