一. Windows NT 和 2000驱动程序的基本层次结构

  1. 目的:

明确从应用程序到驱动程序一层层的函数调用的实现方式
2. Windows体系结构:

体系结构中还有一个Pnp Manager(即插即用管理器):所有即插即用事件

PnP配置管理器为驱动程序将基本的系统资源分类为:I/O端口、内存地址、DMA通道和中断。

1) 检测到新设备,通知Pnp Manager

   2)  Pnp根据这个设备的INF文件查找到注册表和SYS文件

   3)  Pnp向设备栈(Device Stack中只有PDO) 发送IRPs,由总线驱动程序响应,获得设备信息,分配硬件资源;调用设备驱动程序中的DriverEntry和AddDevice函数(创建FDO);向设备发送IRP_MN_START_DEVICE请求.

   4)  Pnp还可以向设备发送其他即插即用请求,例如:

IRP_MN_QUERY_CAPABILITIES,

IRP_MN_QUERY_DEVICE_RELATIONS request for BusRelations(设备驱动程序返回子设备列表), and IRP_MN_REMOVE_DEVICE.

5) 支持网络连接设备.


I/O管理器

(1)、Windows的I/O管理结构灵活,它将磁盘I/O、网络I/O等抽象成IRP(I/O请求包)。所以I/O管理器是一个用于传递IRP的框架,通过IRP控制了所有I/O操作的处理过程(唯一的例外:快速I/O不使用IRP)

(2)、I/O管理器工作过程:

为每个I/O操作创建一个IRP

把IRP传递给正确的驱动程序

当I/O操作完成时删除IRP

(3)、驱动程序与I/O管理器的关系:

向I/O管理器登记必要的信息

接收IRP

执行IRP指定的操作

把IRP传回给I/O管理器,或者通过I/O管理器传递给另一个驱动程序以便进一步处理。

从图中,可以看出用户态应用程序使用Win32API函数向操作系统发出请求,通过win32子系统到达核心态的具体的系统服务中的I/O管理器,由I/O管理器将请求抽象成IRP (I/O Request Packet)传递给设备驱动程序进而控制硬件设备.如下图:

图表 1应用程序访问硬件流程

另外Windows的设备可以看做是一个文件来访问,即通过Win32API: ReadFile/WriteFile 即可读写设备(具体见)

Windows (自己的PCI总线驱动程序)为我们做的事:

1) 枚举总线上的所有设备.

   2) 向OS报告总线上的动态事件.

   3) 响应即插即用和电源管理.

   4) 管理总线设备.

3. WDM驱动程序介绍

特点:

面向对象 每一个硬件都有一个DEVICE_OBJECT数据结构栈(PDO,FDO)描述硬件

分层 需要厂商开发的只是设备驱动程序.