wince的显示驱动和普通的设备驱动不一样.普通的设备驱动是由设备管理器device.exe加载和管理的;而显示驱动是由GWES.exe加载和管理的,类似的由GWES加载管理的还有键盘鼠标,触摸屏,打印机等驱动,这些叫本地驱动(内置驱动).所以,显示驱动ddi就不是常见设备驱动的ddi(流接口ddi).更具体说,它不是通过CreateFile这些文件系统api接口来访问.而是通过GDI接口,熟悉win32应用编程的会记起,GDI就是CreateDC,ReleaseDC等等这些api,可以在wingdi.h中找到这些接口.
一般的,显示驱动是分层实现的,mdd层一般会使用微软提供的GPE模块.如果要支持旋转,使用GPErotate,如果要支持ddraw,使用DDGPE模块.事实上,对wince5,GPErotate已经合并到GPE里面了,typedef GPE GPErotate.而DDGPE也是从GPE继承过来的类.在一些驱动中ddraw和rotate是不能同时使用的.)
tips:GPE是什么?一个简单的图形引擎.首先这是一个类,其次从显示驱动分层上说,使用GPE作为上层mdd,可以节省工作,因为它处理了和上层的接口,并且软件方式模拟了一些图形功能.
提供给GWES调用的接口一共大概20几个函数.GWES通过以下DDI和显示驱动交互,并向上提供GDI接口.
DrvAnyBlt 有扩展或透明位块传送(bit block transfers)
DrvBitBlt 有剪切和屏蔽的通常位块传送
DrvConstrostControl 允许软件、硬件对照调整
DrvCopyBits 发送GDI设计的打印段到打印驱动程序
DrvCreateDeviceBitmap 设计和管理位图
DrvDeleteDeviceBitmap 删除设计位图
DrvDisableDriver 通知驱动程序GDI不再需要它,并准备卸载它
DrvDisablePDEV 通知驱动程序GDI不再需要特殊打印或显示设备
DrvDisableSurface 通知驱动程序GDI不再需要特殊绘制表面
DrvEnableDriver 由驱动程序输出初始记录,为GDI的DDI函数返回指针
DrvEnablePDEV 为GDI返回一个PDEV,它是一个物理显示设备的逻辑表示
DrvEnableSurface 设计一个绘制界面,并把它与PDEV相连
DrvEndDoc 发送任何所需的完成打印文件控制信息
DrvFillPath 用毛刷填充路径
DrvGetMasks 为目前显示设备模式获取颜色屏蔽
DrvGetModes 列举、显示设备支持的显示模式
DrvMovePointer 移动指针,保证GDI不干涉
DrvPaint 用毛刷漆出一个特定区
DrvPowerHandler 调用处理、上电、掉电通知
//DrvAweryFont 获得字体公制信息
DrvRealizeBrush 创建由GDI指定参数毛刷
DrvRealizeColor 把一个RGB颜色,映射到由设备支持最可能获得颜色
DrvSetPalette 设置显示设备调色盘
DrvSetPointershape 对光标设置新形状并更新显示
DrvStareDoc 发送任意的开始打印文件信息
DrvStartPage 发送任意的打印新页的信息
DrvStrokePath 删除路径
DrvTransparentBlt 透明位块传送
DrvUnrealizeColor 将显示设备制式的颜色映成RGB值
但事实上,以上接口并非直接由显示驱动公开给GWES的.显示驱动只公开了一个接口DrvEnableDriver(),在这个接口中导出其他接口,具体的做法如下.
BOOL
APIENTRY
GPEEnableDriver(
ULONG iEngineVersion,
ULONG cj,
DRVENABLEDATA * pded,
PENGCALLBACKS pEngCallbacks)
BOOL APIENTRY DrvEnableDriver(
ULONG iEngineVersion,
ULONG cj,
DRVENABLEDATA *pded,
PENGCALLBACKS pEngCallbacks)
{
return GPEEnableDriver( iEngineVersion, cj, pded, pEngCallbacks );
}
GWES调用DrvEnableDriver(),而DrvEnableDriver()函数调用上面的GPEEnableDriver函数,其中第三个参数就是返回的其他接口的函数指针.在ddi_if.c中同时定义了全局函数指针数组如下:
const DRVENABLEDATA pDrvFn = {
{ DrvEnablePDEV },
{ DrvDisablePDEV },
省略
{ NULL /* DrvEndDoc */ },
{ NULL /* DrvStartDoc */ },
{ NULL /* DrvStartPage */ },
{ DrvEscape }
};
如此,上层获得下层的函数指针pded.即获得了所有接口函数的指针.此外,第4个参数pEngCallbacks是一个回调函数的指针入口,是上层提供给下层的回调函数.是系统提供给显示驱动调用的.它具体包括下面这些:
(BRVSHOBJ 代表一个执行用实线或网格删除填充操作的毛刷.)
BRVSHOBJ_pvAllocRbrush 为毛刷分配内存
BRUSHOBJ_pvGetRbrush 为特定毛刷返回指针
(CLIPOBJ 代表剪切区结构)
CLIPOBJ-bEnum 从剪切区,列举剪切矩形的函数
CLIPOBJ-cEnumStart 为列举剪切区的剪切矩形设置参数
EngcreateDericeBitmap 使GDI对设备位图进行处理
EngCreateDeviceBitmap 请求GDI创建一个位图,并返回句柄.
EngCreateDeviceSurFace 通过GDI创建一个显示驱动程序管理的设备界面
EngCreatePalette 请求GDI创建一个调色板.
EngDeleteSurface 通知GDI显示驱动程序不再需要设备界面
PALOBJ-cGetColors 将颜色复制到调色板上
(PATHDAT 存储部分绘制路径的结构)
PATHOBJ-bEenum 由绘制路径中列举PATHDATA记录
PATHOBJ-vEnumStart 一个绘制路径列举它的线性部分
PATHOBJ-vGetBounds 返回绘制路径的有限制矩形区
(XLATEOBJ 用来在调色板之间传送色彩)
XLATEOBJ-cGetPalette 由指定的调色盘返回颜色.