全部博文(92)
分类: WINDOWS
2006-12-06 10:19:43
DriverEntry 初始驱动程序入口点,设置主要的回调例程。
AddDevice 一个新的即插即用设备(PnP)被添加。
I/O请求包处理例程 被调用用来处理希望处理的IRP
Unload 卸载驱动程序
StartIo 串行处理IRP的回调例程
ISR 中断服务例程
DpcForIsr 延时过程调用例程,完成一个I/O请求和开始另一
个中断驱动的传输
临界断例程 同步一个处理器上的中断执行。由低级IRQL的任务
调用来与硬件交互
Cancel 取消一个IRP
Completion 当一个低层驱动程序完成一个IRP的处理时被调用,
这允许当前的驱动程序作更多的工作
AdapterControl 当一个DMA通道适配器可用时调用
ControllerControl 当一个控制器空闲时调用
Timer 定时器回调例程
CustomerTimerDpc TimerDpc的回调例程
CustomerDpc 通常用于处理工作队列
即插即用通知 当设备PnP状态发生变化时被调用
电源通知 当设备Power状态发生变化时被调用
ConfigCallBack 查询设备硬件描述回调
B) I/O系统服务派发(Dispatch)例程
驱动程序的DriverEntry例程必须设置一系列的回调例程来处理IRP。下表列出了常见的Win32设备I/O函数和它们对应的IRP:
CreateFile "Create" IRP
CloseHandle "Close" IRP
ReadFile "Read" IRP
WriteFile "Write" IRP
DeviceIoControl "IOCTL" IRP
内部的IOCTL IRP
"Create", "Close", "Read", "Write", "IOCTL"和内部的IOCTL的处理程序通常称为分发例程,因为它们通常仅执行IRP的一些初始化处理,如检查所有的参数是否合法,然后把IRP分发到驱动程序的其它地方去处理。IRP通常需要串行处理,使得驱动程序以一种安全的方式与硬件打交道。
5. WDM驱动程序的工作流程分析
A) 创建设备
设备的创建一般在即插即用管理器发现设备时进行。类似的,在执行过程中,当驱动程序卸载或者PnP管理器告诉设备正在被删除时,我们要删除这些设备对象。
大多数的WDM设备对象都是在PnP管理器调用AddDevice入口点时创建的。这个例程在插入新设备和安装INF文件指示这个驱动程序是要运行的驱动程序时被调用。在此之后,一系列的PnP IRP被发送到驱动程序,指示设备应当何时启动和查询它的功能。最后,一个删除设备PnP IRP指示设备已经被删除,所以驱动程序删除设备对象。
NT式驱动程序在它们想创建设备的时候创建设备。它们的DriverEntry例程通常寻找自己的硬件,找到后创建设备对象。
在创建设备后,为了使Win32可见,我们必须为每个设备创建符号链接。可以采用两种方法创建符号链接:第一种方法是采用显示的"硬编码"符号链接名,
用户态程序必须类似的把设备名硬编码到源代码中。另外一种方法是使用设备接口,每个设备接口由一个全局唯一标志符标志。把设备注册为一个特定的设备接口就创建了一个符号链接。用户态设备可以取得拥有此GUID的设备。
B) 硬件资源分配
低层的驱动程序需要知道为他们分配了哪些硬件资源。最常见的硬件资源是I/O端口,存储器地址,中断和DMA线。
处理PnP IRP的WDM驱动程序在收到"启动设备"的PnP IRP时被告知设备的资源。NT式的驱动程序必须自己发现资源并请求使用这些资源。
C) 驱动程序的分层调用
WDM驱动程序花大量的时间访问其它驱动程序。一个即插即用设备是在一个设备对象栈中,把IRP沿设备栈传递到下一个驱动程序是很常见的。
一些类型的IRP(如即插即用,电源管理等)常常立即传递到设备栈中的下一个设备。
在另一些情况下,驱动程序的工作是通过调用设备栈中的下一个设备实现的。例如,USB客户驱动程序通常通过沿设备栈向下传递IRP来调用USB总线驱动程序。
D) 串行化处理
访问硬件的任何设备必须使用某种机制保证驱动程序的不同部分不同时访问相同的硬件。在一个多处理器系统中?quot;Write"IRP处理程序可以同时在两个不同的处理器上运行。如果它们两个都试图访问相同的硬件,则会出现不可预料的结果。同样,如果一个"Write"IRP正在试图访问硬件的同时发生了中断,那么,两个动作可能会相互影响。
内核采用两种机制来同步这些冲突操作:
第一种是采用临界段例程,使用这些临界段例程保证代码不会被中断处理程序中断。这些临阶段例程在内部使用了中断自旋锁,所以可以保证多处理器同步。
第二种是使用StartIo例程串行处理IRP,每个设备对象有一内部的IRP队列,驱动程序的派发例程将IRP插入这个队列中。内核I/O管理器从这个队列一个个的取出IRP,并把它们传递到驱动程序的StartIo例程。所以StartIo例程串行的处理IRP,保证不与其它的IRP处理例程冲突。
如果一个IRP已经在一个队列中,此时用户线程突然中止或其调用Win32函数取消了这次I/O,驱动程序必须取消这个IRP。这可以通过给每一个排队的IRP挂接一个取消回调例程来实现。
如果用户态程序关闭了设备的文件句柄,而这个设备有重叠请求在等待,则必须要有"清理"例程。清理例程负责取消与一个文件句柄关联的所有IRP。
E) 访问硬件
在取得了I/O端口和内存地址后,访问硬件就显得比较直接,但是由于Windows 是多任务系统,在一般情况下占用处理器的时间应小于50微秒,需要长时间的硬件访问应采用系统线程的方法。
因为中断服务例程的IRQL(中断请求级)很高,故在中断服务例程中应尽量减少访问硬件时间,而且很多内核例程在这个中断请求级上被禁止调用,故一些中断善后工作在延迟过程调用(DPC)中实现。
F) 即插即用支持技术
即插即用(PnP)是计算机系统自动识别和适应硬件配置的改变的技术,完全的即插即用不仅需要硬件的支持,同时也需要软件的支持。对用户来说,他可以自由的向计算机中添加和删除设备,而无需使用笨拙的手工配置同时不必深入了解复杂的计算机软硬件知识。
即插即用需要设备硬件,系统软件,和驱动程序的支持。PnP的发起者定义了关于易识别设备和基本系统组件的PnP工业标准。这些标准主要阐述了系统软件和驱动程序如何支持即插即用。
系统软件和驱动程序对即插即用的支持主要提供以下功能:
自动识别已安装的设备
硬件资源的动态重分配
自动加载正确的驱动程序
提供使得在硬件环境发生变化时,驱动程序和用户模式代码得到通知的机制
PnP驱动程序是对PnP支持很重要的部分。PnP驱动程序必须提供PnP调用入口,处理繁多的PnP IRPs,并且遵循PnP的设计规范。
PnP管理器由两部分组成:核心态PnP管理器和用户态PnP管理器。核心态PnP管理器负责同操作系统组件和WDM驱动程序交互来配置、管理和维护设备。用户态PnP管理器主要和用户态安装程序一起来简化设备的安装工作。同时,PnP管理器只有和WDM驱动程序紧密合作,才能使得系统对即插即用有完整的支持。WDM驱动程序遵循Windows 驱动模型规范并且可以不加修改的同时运行在Windows2000 和Windows98中。为支持PnP,WDM驱动程序的设计必须遵守以下原则:
WDM驱动程序必须遵循以设备为中心的即插即用驱动程序模型。PnP管理器在全局的基础上管理系统的设备,并调用驱动程序来服务它们的设备。当PnP管理器发现设备时,驱动程序的AddDevice例程将被PnP管理器调用来服务这个设备。
WDM驱动程序必须遵守Pn