驱动开发(1)基础知识

http://blog.csdn.net/zuishikonghuan/article/details/48545623

驱动程序是操作系统和硬件通讯的桥梁,同时,驱动程序可以实现很多特殊功能,比如,虚拟光驱(虚拟设备),内核级hook,文件系统透明加密(过滤驱动),修改Windows内核等等

并非所有驱动程序都必须由设备的设计方编写。如果设备根据已发布的硬件标准来设计。这时驱动程序可以由 Microsoft 编写,设备设计者无须提供驱动程序。

并非所有的驱动程序都与硬件关联。某些驱动程序与任何硬件设备根本不关联。 例如,如果需要访问内核,或者实现虚拟设备,过滤设备等等,需要通过编写驱动程序实现。提供一个用户模式下运行且提供用户界面的应用程序,还需要在内核模式下运行且可以访问核心操作系统数据的驱动程序。这个驱动程序可以称为“软件驱动程序”。软件驱动程序与硬件设备不关联。还有个例子是一些屏幕录像软件通过驱动程序直接读取屏幕,而不是从应用层调用API截图,实现硬件加速。

在正式开始介绍驱动开发之前,我们需要先来了解一下基本的概念。

1。驱动程序的运行级别

以内核模式驱动程序为例,用户模式驱动是后来才有的。

其实intel 80x86提供了四个运行级别,R0,R1,R2和R3,现代主流操作系统,Windows自然也不例外,只用了R0和R3两个运行级别,分别为“内核模式”和“用户模式”。应用程序运行在用户模式,驱动程序运行在内核模式。

这也就是说,驱动程序在运行的那一刻,就是天道!驱动程序中的指令,就是天道法则!(打个比方),所以说驱动程序运行时理论上可以做任何事情,RootKit病毒和杀毒软件都是利用的驱动程序。

2。Windows驱动程序的种类

windows9x时代,是VxD驱动,从NT的第一代开始到现在的Windows 10,windows逐渐出现了三种驱动程序模型,它们分别是:

1。遗留驱动:NT驱动程序:这是基础的驱动模型,也是本系列博文着重介绍的驱动模型。

2。WDM驱动:为了支持设备的热插拔(比如USB设备),微软推出了WDM驱动,支持电源管理和即插即用

3。WDF驱动:有人说,如果WDM是Win32,WDF就是MFC。这个比喻还是比较恰当的。WDF驱动其实就是微软又封装了一些更方便的内核函数,使驱动开发更加便捷。另外WDF还提供了两套机制,一种是内核模式驱动程序,一种是用户模式驱动程序。

3。虚拟内存(虚拟地址空间)

驱动程序可以访问整个4GB的虚拟内存,用户程序只允许访问低2G。

关于虚拟内存的分页原理和Windows的内存管理机制,这里不再介绍,有兴趣的可以查阅相关资料

4。API的处理

在Win32子系统调用的API,会进一步调用在ntdll里的Native API,Native API进入内核,调用系统的服务例程,被I/O管理器生成IRP并发送到设备栈最上层的设备对象所在驱动程序的派遣函数中,有可能会进一步向下层的驱动程序继续发送(比如过滤驱动),驱动程序完成任务。

5。同步与异步

我对同步和异步的理解,可能不是很准确:
同步:调用一个接口后,一直等待到被调用者处理完毕,再返回
异步:调用一个接口后,不等待到被调用者处理完毕,直接返回,处理其他东西。

同步处理是驱动开发中的重要任务。Windows是支持异步操作的操作系统,编写驱动程序时,如果有必要,需要进行同步处理。

6。 设备对象和设备堆栈

“设备对象”为 DEVICE_OBJECT 结构的一个实例。设备堆栈是一系列设备形成的和栈结构类似的东西,简单说,磁盘设备之上可能有磁盘过滤设备,再上面是卷设备,再上面可能有文件系统过滤设备,等等,IRP总是z先发送到设备堆栈最上面一层的设备中。

7。符号连接

一般的,对于NT驱动而言,应用程序不直接访问设备,而是访问设备的符号连接,比如第一个磁盘卷的设备名是

“\Device\HarddiskVolume1”
  
  

其符号连接为:内核模式下
"\??\C:"
  
  


用户模式下:

而我们的应用程序访问的时候都是用符号连接。

对于WDM驱动,一般不使用符号连接,而是使用设备接口。



猜你喜欢

转载自blog.csdn.net/wxh0000mm/article/details/94719801