《Programming the windows driver model》01
0x00 windows2000概述
以读取设备数据为例子,windows2000的执行流程是:
①应用程序调用win32 api, readfile
②win32子系统(用户模式)实现了该api,实现的方式NtReadFile, 这个函数调用系统服务接口
③系统服务接口调用内核模式的的服务例程
④该例程发出IRP,来请求驱动程序处理
⑤驱动程序要么逐级往下传递,要么到了硬件操作硬件
应用程序,不需要知道中间过程
0x01 windows2000驱动程序概述
上图是windows2000下驱动程序类型。我们开发的是WDM驱动。本质是遵循PnP(即插即用协议的)内核驱动程序。分成类驱动程序(class driver)和迷你驱动程序(minidirver)。前者是已经定义好的设备的驱动,后者是厂商的专有支持驱动。
驱动程序的属性:
①可移植性,使用c,且不使用编译器提供的运行时库,而是wdm提供的专门库
②可配置性,使用注册表,并且避免代码直接引用硬件
③可抢先和中断性,线程是多个执行流,驱动也是线程来运行的,线程是按时间分片的,可抢占的。中断是有优先级的,执行中断处理的时候,仍和执行更高优先级的中断。(也有说中断处理执行时,不会发生线程切换)
④多线程多处理器安全,要解决同步问题。
⑤基于对象,即使用了大量的数据结构,但是不透明,要调用指定方法修改。
⑥包驱动,想要让驱动程序工作,要向其发送IRP包
⑦异步,io操作通常比较慢,不等io操作完成后就返回给调用者,由调用者决定是否等待完成。
0x02 WDM驱动程序模型
在WDM驱动模型中,有以下三对概念。
设备驱动与总线驱动
设备驱动:直接与硬件交互,控制硬件工作。
总线驱动:用于发现设备,保持与硬件的交流通常。例如要驱动一个显示屏,他的接口是IIC的,得先要有IIC总线驱动,这样当屏幕接上的时候,才知道并能够与之交流,设备驱动才能起作用。
类驱动和迷你驱动
类驱动程序:是管理一设备的通用驱动程序。例如usb类驱动程序可以控制usb总线的各种设备。
迷你驱动程序:较小型的,专用的驱动程序,而不是整个设备类。
功能驱动程序和过滤驱动程序
功能驱动程序:位于设备链的最顶层,提供了对硬件设备的主要控制和管理,将设备的特定功能转化为通用的操作接口。
过滤驱动程序:通常不直接处理硬件设备,二十对数据进行修改处理,可以用于给驱动程序增加额外功能,或者优化。类似于对功能驱动程序包了一层。
0x03 当我们在写WDM驱动程序的时候,我们在写什么
一个完成的WDM驱动程序是一个容器,包含多个历程,在不同IRP来的时候,调用不同的例程。