(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
绘制文本