浅谈Windows中驱动加载顺序

在编写Windows传统驱动程序时,有一个驱动的注册表值“Start”某种程度上决定了驱动启动的时间或顺序。它有五个值,如下所示:

Boot(0)- 驱动程序在启动时加载,甚至在操作系统完全准备好运行之前就加载。
System(1)- 驱动程序在启动后加载,当内核已经完全可用时。
Automatic(2)- 在这个组中,驱动程序在子系统加载时加载。基本上是与User Mode的服务一起。
Manual(3)- 这里没有自动加载,驱动程序只有在有人或某个组件要求它的时候才会加载。
Disabled(4)- 即使需要该驱动程序,也会拒绝其加载。

实际上,用上述四个值来判定驱动的加载顺序还是粗放了些,因为可能有多个驱动使用同一值,如何保证它们的加载顺序呢?因此,在Windows中驱动又被分成组,每次只启动一组,直到所有驱动程序都被加载。

Windows通过驱动注册表键中的“Group”值来识别驱动所属的组。该键的值应是驱动程序所属组的名称。所有组的名称都可以在键HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder中找到,保存在一个名为“List”的REG_MULTI_SZ类型的值里,其中包含所有现有组的列表,按其加载顺序排列。

当启动一组驱动程序时,有一个注册表决定了组内驱动的加载顺序。即"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList" ,在它下面维护了一系列的值,每个值都是一个组的名称。这些值的类型为 "REG_BINARY",它们实际是一个四字节整型数组。第一个数字表示数组中包含多少个Tag,其余是每个Tag的数值表示。因此,下图所示有六个Tag,它们是:1、2、3、4、5和6

那什么是Tag呢?Tag是组内驱动的数值ID,虽然上图数组6个Tag值看起是顺序的,但并不说明驱动是按Tag值的大小顺序来加载的,而是按照它们在上图数组中的顺序来依次加载的。

用osrloader程序注册驱动时可以通过配置来调整驱动的加载顺序:

原文链接:,转发请注明来源!