《Programming the windows driver model》01

0x00 windows2000概述

​ 以读取设备数据为例子,windows2000的执行流程是:

①应用程序调用win32 api, readfile

②win32子系统(用户模式)实现了该api,实现的方式NtReadFile, 这个函数调用系统服务接口

③系统服务接口调用内核模式的的服务例程

④该例程发出IRP,来请求驱动程序处理

⑤驱动程序要么逐级往下传递,要么到了硬件操作硬件

应用程序,不需要知道中间过程

0x01 windows2000驱动程序概述

image-20240316143550850

上图是windows2000下驱动程序类型。我们开发的是WDM驱动。本质是遵循PnP(即插即用协议的)内核驱动程序。分成类驱动程序(class driver)和迷你驱动程序(minidirver)。前者是已经定义好的设备的驱动,后者是厂商的专有支持驱动。

驱动程序的属性:

①可移植性,使用c,且不使用编译器提供的运行时库,而是wdm提供的专门库

②可配置性,使用注册表,并且避免代码直接引用硬件

③可抢先和中断性,线程是多个执行流,驱动也是线程来运行的,线程是按时间分片的,可抢占的。中断是有优先级的,执行中断处理的时候,仍和执行更高优先级的中断。(也有说中断处理执行时,不会发生线程切换)

④多线程多处理器安全,要解决同步问题。

⑤基于对象,即使用了大量的数据结构,但是不透明,要调用指定方法修改。

⑥包驱动,想要让驱动程序工作,要向其发送IRP包

⑦异步,io操作通常比较慢,不等io操作完成后就返回给调用者,由调用者决定是否等待完成。

0x02 WDM驱动程序模型

在WDM驱动模型中,有以下三对概念。

设备驱动与总线驱动

设备驱动:直接与硬件交互,控制硬件工作。

总线驱动:用于发现设备,保持与硬件的交流通常。例如要驱动一个显示屏,他的接口是IIC的,得先要有IIC总线驱动,这样当屏幕接上的时候,才知道并能够与之交流,设备驱动才能起作用。

类驱动和迷你驱动

类驱动程序:是管理一设备的通用驱动程序。例如usb类驱动程序可以控制usb总线的各种设备。

迷你驱动程序:较小型的,专用的驱动程序,而不是整个设备类。

功能驱动程序和过滤驱动程序

功能驱动程序:位于设备链的最顶层,提供了对硬件设备的主要控制和管理,将设备的特定功能转化为通用的操作接口。

过滤驱动程序:通常不直接处理硬件设备,二十对数据进行修改处理,可以用于给驱动程序增加额外功能,或者优化。类似于对功能驱动程序包了一层。

0x03 当我们在写WDM驱动程序的时候,我们在写什么

​ 一个完成的WDM驱动程序是一个容器,包含多个历程,在不同IRP来的时候,调用不同的例程。

image-20240316152412330