本文地址:http://www.tongxinmao.com/Article/Detail/id/317
開發打印機驅動程序通常有兩種途徑:一是開發一個完整的驅動程序,二是利用微軟提供的通用打印機驅動程序( Unidrv )
開發小型驅動程序( Minidriver )
。開發一個完整的驅動程序工作量大且過程複雜,因此我們採用通用打印機驅動程序+ 小型驅動程序來開發打印機驅動程序。
在Windows中,打印機驅動的作用是編寫一組接口。應用程序調用的GDI函數會變成相應的DDI函數,打印機驅動提供的這組接口負責將DDI函數轉變爲打印機識別的的指令。至於是通過網口、串口等接口與真實打印機相連接,這是Printer Moniter的職責,而不是Printer Driver的職責。
打印機驅動一般分爲兩個部分。
1.printer graphics DLL
2.Printer Interface DLL
printer graphics DLL和Printer Interface DLL都已經編號,並留有plugin的接口。程序員可以編寫相應的plugin。
由於Microsoft提供了Universal Printer Driver,所以編寫驅動變得比較簡單。
增強Universal Printer Driver可以分爲三個部分:
1.增加一個叫做GPD的文件,這個文本定義了一些參數,Universal Printer Driver會讀取這個文件,這個文件又被稱作是Mini Driver。
2.printer graphics DLL相關的plugin被稱爲Rendering Plug-Ins。
3.Printer Interface DLL相關的plugin被稱爲User Interface Plug-Ins。
打印機驅動需要完成如下接口:
DevQueryPrintEx
DrvConvertDevMode
。。。
DrvUpgradePrinter
這幾個函數在Universal Printer Driver中分別在UNIDRVUI.DLL和UNIDRV.DLL分別實現。
這部分介紹如何編寫Rendering Plug-Ins。
這個plug-in是一個COM組件,需要向系統提供一個IPrintOemUni2接口的COM組件。
其中比較重要的函數是:
1.EnableDriver
2.DisableDriver
在EnableDriver中需要註冊一組函數指針數組,這些函數用來hook中相應的DDI解釋部分。這樣就可以改變默認Universal Printer Driver的行爲。
3.
EnablePDEV創建打印機廠商自定義的數據結構,然後初始化這個數據結構。
4.
DisablePDEV負責回收這個數據結構的所佔用的內存。
重要數據結構
typedef struct _DEVOBJ {
DWORD dwSize;//這個數據結構的大小
PDEVOEM pdevOEM; //自定義OEM數據結構的指針
HANDLE hEngine;//物理設備的handle
HANDLE hPrinter;//打印機句柄
HANDLE hOEM;
PDEVMODE pPublicDM ;
PVOID pOEMDM;
PDRVPROCS pDrvProcs;
} DEVOBJ;
5.
GetInfo函數是負責得到一些打印機的一些信息。
6.PublishDriverInterface
這個函數可以在其中得到IPrintOemDriverUni接口指針,這個指針非常有用,可以調用Universal Printer Driver提供的一些功能。
如向打印機輸出命令,DrvWriteSpoolBuf。