本文主要是介绍系统怎样装入驱动程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
递归枚举
首先,PnP管理器有一个内建的驱动程序,它与一个实际不存在的根总线相对应。根总线概念性地把计算机与所有那些不能用电子方式声明自己存在的设备连接起来,这包括主硬件总线(如PCI)。根总线驱动程序从注册表中获取有关计算机的信息。而这些关于计算机本身的注册表信息是由系统安装程序初始化的。安装程序通过运行一个精心制作的硬件检测程序以及向用户提出一些适当的问题来获取这些信息。所以,根总线驱动程序有足够的信息为主总线创建PDO。
然后,主总线的功能驱动程序用电子方式枚举自己的硬件。例如,PCI总线提供了一种访问每个插入设备的硬件配置空间的方法,配置空间保存了设备的资源需求和描述信息。当总线驱动程序枚举硬件时,它的动作就象一个普通的功能驱动程序。检测完一个硬件后,它改变角色,变成总线驱动程序并为查到的硬件创建PDO。然后PnP管理器装入该PDO的驱动程序。有时,设备的功能驱动程序还要枚举其它硬件,如果是这样,整个过程将递归重复。结果将出现如下图的树形结构,总线设备堆栈将分叉成其它设备堆栈,每个设备堆栈代表着插入到该总线上的一个硬件设备:

注册表的角色
有三种注册表键负责配置。它们是硬件(hardware)键、类(class)键、服务(service)键。
硬件键包含单个设备的信息
类键涉及所有相同类型设备的共同信息
服务键包含驱动程序信息
硬件(或实例)键
设备的硬件键出现在注册表local machine分支的/System/CurrentControlSet/Enum子键上。通常你不能查看到该键的内部信息,系统只允许拥有系统帐号的用户访问该键。即只有内核模式程序和运行在系统帐号下的用户模式服务可以读写Enum键和其子键,但是即使是管理员也不应该直接修改这些键的内容。要想查看Enum键的内容,可以在Administrator特权级帐户下使用REGEDIT.EXE工具查看。
类键
所有设备类的类键都出现在HKLM/System/CurrentControlSet/Control/Class键中。它们的键名是由Microsoft赋予的GUID值。
服务(或软件)键
对设备驱动程序重要的最后一个键是服务键。它指出驱动程序执行文件的位置,以及控制驱动程序装入的一些参数。服务键位于HKLM/System/CurrentControlSet/Services键中。
驱动程序装入顺序
当PnP管理器遇到一个新设备时,它打开设备的硬件键和类键,然后按如下顺序装入驱动程序:
- 硬件键中指定的任何低层过滤器驱动程序。由于LowerFilter值的类型是REG_MULTI_SZ,所以它可以指定多个驱动程序,其装入顺序由它们在串中的位置决定。
- 类键中指定的任何低层过滤器驱动程序。同样,它也可以指定多个驱动程序,装入顺序同1。
- 硬件键中Service值指定的驱动程序。
- 硬件键中指定的任何高层过滤器驱动程序,同样,它也可以指定多个驱动程序,装入顺序同1。
- 类键中指定的任何高层过滤器驱动程序,同样,它也可以指定多个驱动程序,装入顺序同1。
当我说系统“装入”一个驱动程序时,是指系统把驱动程序的映像映射到虚拟内存中,并重定位内存参考,最后调用驱动程序的主入口点。主入口点通常命名为DriverEntry。我将在本章后面讲述DriverEntry函数。如果驱动程序已经在内存中,则装入过程仅仅是增加驱动程序映像的参考计数。
驱动程序的装入顺序并不是很重要。系统以PnP管理器装入驱动程序的顺序调用驱动程序的AddDevice函数,而这个顺序与设备对象在设备堆栈中出现的顺序完全一致。
引自: http://hi.baidu.com/cg%5Fjane/blog/item/f007922b076df9305343c1f7.html
这篇关于系统怎样装入驱动程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!