昨天把流驱动看了一下,总体感觉相对还可以,其实大多数情况就是编写dll动态链接,这个不是太难,只要多练我想我应该能熟练掌握。话说回来,今天是著名的圣诞节,大家都过节了吧,我也过,在实验室,今天下午暖气停了,有点冷,不过写东西的时候感觉手还是挺灵活的,这要谢谢我散热不好的笔记本,现在才体会到,散热不好并非坏事,不用暖手垫嘛!呵呵,言归正传,继续我的驱动编程学习……
设备驱动程序架构:
内置与流安装机制:通常内置驱动程序根据注册键值安装在 GWES进程空间;
总线驱动由Device.exe根据键值进行安装;
可安装的流驱动或其它驱动由Device.exe根据总线驱动或注册检查器进行安装。
设备驱动程序的安装过程:Kernel—》DEVICE.EXE—》I/O Resource Manager (part of Device.exe)、REGENUM.DLL—》
PCIBUS.DLL
注册枚举器: 注册枚举器是RegEnum.dll
Device.exe根据HKEY_LOCAL_MACHINE/Drivers/RootKey安装注册枚举器
注册枚举器给每一个要安装的驱动程序扫描表项
注册枚举器是可重入的,并支持分级使用
当注册枚举器卸载时,同时也御载它安装的所有信息
注册枚举器根据Order,检查紧挨着传给它的键的下一级键值。
注册枚举器对每一个找到的子键调用ActivateDeviceEx
ActivateDeviceEx: 由Device.exe提供
总线驱动程序当安装设备驱动时调用ActivateDeviceEx
ActivateDeviceEx也在RAM工作区锁定流接口驱动程序
这可以防止代码页被丢弃
注册检查器对找到的每一个内置子键调用ActivateDeviceEx
ActivateDeviceEx安装驱动并更新注册表
接口类: 驱动程序的接口有以下特征
1.每一个Iclass有一个GUID,一个名字
2.GUID描述类设备接口
3.Name 描述接口的实例(COM1:, DSK1: 等等)
提供一个驱动接口
1.在注册表中的Iclass子键
2.驱动程序发布接口 – AdvertiseInterface
应用程序访问接口 – RequestDeviceNotifications
每个已有的接口的预定义GUID(例如:A32942B7-920C-486b-B0E6-92A702A99B35 )
I/O资源管理(IORM):IORM是设备管理器必备的部分
跟踪可用I/O资源 (IRQ与I/O基地址)
OEM为内置设备预分配的资源
当在总线上安装一个客户驱动时,总线驱动请求资源
1.ResourceRelease
2.ResourceRequest
3.ResourceCreateList
当存在冲突时IORM调用 ResourceRequest失败
注册表帮助例程:1.从注册表中读取资源初始化信息
OpenDeviceKey
DDKReg_GetIsrInfo
DDKReg_GetWindowInfo
DDKReg_GetPciInfo
在COREDLL的API
在<devload.h> and <ddkreg.h> 的函数原型
2.在public/common/oak/drivers中的例子
wavedev/pdd/es1371/wavepdd.cpp -> GetRegistryConfig
电源管理: 1.电源管理器:灵活的系统级与外设级电源管理
使设备智能化的管理它们的电源
在设备与系统或应用之间充当协调者
使OEM修改调用PowerOffSystem()的相关代码
2.系统电源状态:打开—>系统空闲; 用户空闲—>挂起;
3.设备(外设)级电源状态:D0全供电;D1降级模式;D2备用模式;D3睡眠;D4关闭;
内存管理函数:设备驱动程序是用户态模块 (必须将物理内存映射成虚拟内存)
VirtualAlloc, VirtualFree: 预留,释放虚拟内存(MEM_RESERVE)
VirtualCopy: 将一个物理内存区域映射到一个虚拟内存区域(PAGE_NOCACHE;PAGE_PHYSICAL)
驱动的内存访问与映射: MapPtrToProcess(将一个地址空间的指针映射成另外一个指针)
GetCurrentProcess / SetProcPermissions(重新找回进程ID用于MapPtrToProcess函数)
MmMapIoSpace(将一个物理地址空间映射成一个不分页的,由进程决定的地址空间)
说了以上这么多,应该到重点的DDk了。
CEDDK: CE v2.1x 以及后来的版本支持独立于平台的I/O配置
让OEM以及驱动开发人员使用它们
CEDDK.DLL: 总线管理
内存管理
I/O管理
从NTDDK拿来的CEDDK API(直到V2.12以后的版本才有文档;但在大多数V2.00版中都有)
硬件<—>CEDDK.DLL<—>设备驱动<—>设备管理器
设备驱动使用CEDDK;正常开发的驱动是跨平台二进制兼容的(跨CPU的源码兼容)
CEDDK 内容:部分 函示例
总线管理 HalGetBusDataByOffset()
HalGetBusData()
HalSetBusDataByOffset()
HalSetBusData()
HalTranslateBusAddress()
HalTranslateSystemAddress()
内存管理 MmMapIOSpace – MmUnmapIOSpace
HalAllocateCommonBuffer
I/O 存取
XXXX =>UCHAR/USHORT/ULONG READ_REGISTER_XXXX
WRITE_REGISTER_XXXX
READ_PORT_XXXX
WRITE_PORT_XXXX
先吃饭,后学习,身体是革命的本钱!饭是身体的保障!!