如何控制设备驱动程序的加载顺序

ArchLinux下用Wine运行钉钉全攻略:从字体配置到中文输入法避坑 本文详细介绍了在ArchLinux系统上使用Wine运行钉钉的完整配置流程。从最新的WoW64架构环境准备、中文字体配置与DPI优化,到钉钉安装、关键系统库替换,再到解决中文输入法失效等核心难题,提供了实战避坑指南。旨在帮助Linux用户在企业办公场景下,获得接近原生的稳定使用体验。 阅读详情
设计 Windows NT 时所采用的概念是:第一个提出占有某设备的驱动程序获得该设备的所有权。这个所有权可以共享,也可以独占,这由提出占有要求的设备驱动程序决定。如果设备驱动程序对设备提出了独占占有要求,则由以后加载的设备驱动程序对该设备尝试提出的任何占有要求都将失败。因此,设备驱动程序的加载顺序必须可以由设备驱动程序的作者进行修改。本文介绍可用于控制设备驱动程序加载顺序的两种方法。

更多信息

有两种方法可以用于控制设备驱动程序的加载顺序。这两种方法都利用了位于 /HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control 的注册表项。第一种方法是修改 ServiceGroupOrder。第二种方法是根据 GroupOrderList 分配用于决定驱动程序加载顺序的 Tag 值。Tag 值、起始值、类型值和组名称都位于 HKLM/SYSTEM/CurrentControlSet/Services/<drivername> 项中,必须先添加此项,然后这些值才能在组名称列表中列出。

这两种方法仅对起始值为 0 (SERVICE_BOOT_START) 或 1 (SERVICE_SYSTEM_START) 的设备驱动程序有效。在所有情况中,起始值为 0 的设备驱动程序都将在起始值为 1 的所有设备驱动程序尝试加载之前先加载。

方法 1:ServiceGroupOrder

ServiceGroupOrder 包含按加载顺序排列的组名称列表。下面原样列出 ServiceGroupOrder 的内容:

SCSI miniport
port
Primary disk
SCSI class
SCSI CDROM class
filter
boot file system
Base
Pointer Port
Keyboard Port
Pointer Class
Keyboard Class
Video Init
Video
Video Save
file system
Event log
Streams Drivers
NDIS
TDI
NetBIOSGroup
SpoolerGroup
根据 ServiceGroupOrder,“SCSI class”组中的设备驱动程序将在“Primary disk”组中的所有设备驱动程序之后,及“SCSI CDROM class”组中的设备驱动程序之前加载。设备驱动程序所在的组在列表中的位置越高,越先加载它。ServiceGroupOrder 列表将被扫描两次。首先加载所有起始值为 0 的设备驱动程序,然后加载所有起始值为 1 的设备驱动程序。因此,无论起始值为 0 的设备驱动程序在 ServiceGroupOrder 列表中处于什么位置,它都会在所有起始值为 1 的设备驱动程序之前加载。

设备驱动程序的作者可以编辑 ServiceGroupOrder。这样就可以在列表中的任意位置创建新组。名为“SAMPLDRV”的 SCSI class 设备驱动程序就是个很好的示例,因为“SCSIDISK”正在提出占有 SAMPLDRV 需要提出占有的设备,所以 SAMPLDRV 需要在 SCSIDISK 之前加载。下面是 SCSIDISK 的注册表项:
/registry/machine/system/currentcontrolset/services/scsidisk
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000000
Group = SCSI class
ErrorControl = REG_DWORD 0x00000000
DependOnGroup = REG_MULTI_SZ "SCSI miniport"
				

可以将名为“Load Me First”的新组添加到 ServiceGroupOrder 中,并将 SAMPLDRV 设置为 Load Me First 组的成员。下面是经过修改的 ServiceGroupOrder:

SCSI miniport
port
Primary disk
Load Me First
SCSI class
SCSI CDROM class
filter
boot file system
.
.
.
下面是 SAMPLDRV 的注册表项:
/registry/machine/system/currentcontrolset/services/sampldrv
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000000
Group = Load Me First
ErrorControl = REG_DWORD 0x00000000
DependOnGroup = REG_MULTI_SZ "SCSI miniport"
				

根据该配置,SAMPLDRV 将在 SCSIDISK 之前加载。

方法 2:GroupOrderList 和 Tag 值

称为 Tag 的可选项可以包括在设备驱动程序的注册表中。Tag 的值可以帮助决定某个组内设备驱动程序的加载顺序。加载顺序不必按数字顺序排列,相反,可以按照由 GroupOrderList 定义的顺序排列。GroupOrderList 中每个组的第一项都是 Tag 值的数值。接下来是要加载的 Tag 值的数字顺序。组中的设备驱动程序首先按照其由 GroupOrderList 所定义的 Tag 值进行加载。如果设备驱动程序没有 Tag 值,或者 Tag 值不在 GroupOrderList 中,则这些设备驱动程序将在加载具有有效 Tag 值的设备驱动程序之后进行加载。对于这些设备驱动程序,无法保证加载顺序,只能保证组中的所有设备驱动程序都在下一组加载之前进行加载。

下面是 GroupOrderList 的部分输出:
/registry/machine/system/currentcontrolset/control/grouporderlist
Base = REG_BINARY 0d 00 00 00 01 00...
Extended base = REG_BINARY 04 00 00 00 01 00...
Filter = REG_BINARY 05 00 00 00 01 00...
Keyboard Class = REG_BINARY 01 00 00 00 01 00...
Keyboard Port = REG_BINARY 01 00 00 00 01 00...
Ndis = REG_BINARY 09 00 00 00 01 00...
Pointer Class = REG_BINARY 01 00 00 00 01 00...
Pointer Port = REG_BINARY 03 00 00 00 01 00...
          .
          .
          .
				

注意:没有为 SCSI class 定义值。并非每个组都出现在 GroupOrderList 中。如果 GroupOrderList 中没有某个组,则无法保证组内设备驱动程序的加载顺序。

与 ServiceGroupOrder 一样,GroupOrderList 也可以修改。以上示例可以添加 SCSI class 的 Tag 项:
/registry/machine/system/currentcontrolset/control/grouporderlist
SCSI class = REG_BINARY 02 00 00 00 02 00 00 00 01 00 00 00
Base = REG_BINARY 0d 00 00 00 01 00...
Extended base = REG_BINARY 04 00 00 00 01 00...
          .
          .
          .
				

在这个示例中,SCSI class 组识别出两个 Tag 值:00000001 和 00000002。Tag 值的加载顺序是先加载 00000002,其次是 00000001。如果 SAMPLDRV 在 SCSI class 组中(与 SCSIDISK 相同),则任一 Tag 值都可以保证 SAMPLDRV 在 SCSIDISK 之前加载,因为 SCSIDISK 没有 Tag 值,而没有作标记的驱动程序将在组中最后一个加载。

如果由于某种原因,SCSIDISK 分配的 Tag 值是 0x00000001,则当 SAMPLDRV 分配的 Tag 值是 00000002 时,SAMPLDRV 在 SCSIDISK 之前加载:
/registry/machine/system/currentcontrolset/services/sampldrv
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000000
Group = SCSI class
ErrorControl = REG_DWORD 0x00000000
DependOnGroup = REG_MULTI_SZ "SCSI miniport"
Tag = REG_DWORD 0x00000002
 
Halcon相机标定实战:从参数设置到精度优化全解析 本文详细解析Halcon相机标定的全流程,从基础概念到实战技巧,涵盖参数设置、精度优化及常见问题解决方案。通过实际案例和代码示例,帮助读者掌握工业视觉项目中相机标定的关键技术,提升测量精度和系统稳定性。 阅读详情

相关推荐

53、Windows 系统中设备驱动的即插即用与加载机制解析

本文深入解析了Windows系统中设备驱动的即插即用(PnP)机制与驱动程序加载、初始化和安装过程。详细阐述了PnP状态转换模型、驱动程序启动类型与加载顺序、设备树的构建与枚举流程,以及设备节点(Devnode)的组成结构和驱动加载优先级。结合!devnode调试命令和设备管理器实操,帮助读者掌握系统如何动态管理硬件设备,并提供故障排查思路与性能优化建议,是理解Windows设备驱动架构的核心指南。

qq_27496129的博客 110

实现驱动最早启动

内核驱动加载顺序 内核的驱动是分组的,系统启动时是根据组来加载的. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder 这个注册表项记录了组的启动顺序,可以从下图看出最早启动的组是System Reserved HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList 此注册表项记录了每一个组内不同服务的启动顺序 要让我们的驱动实现最早启动,

qq_41490873的博客 1037

pb703安装文件

pb703.zip安装文件,具体可见论坛http://www.sybasebbs.com/f

如何控制驱动加载顺序

转自:http://support.microsoft.com/kb/115486/zh-cn 有两种方法可以用于控制设备驱动程序加载顺序。这两种方法都利用了位于 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 的注册表项。第一种方法是修改 ServiceGroupOrder。第二种方法是根据 GroupOrderList 分配

trents的专栏 1738

驱动加载顺序

有两种方法可以用于控制设备驱动程序加载顺序。这两种方法都利用了位于\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control的注册表项。第一种方法是修改ServiceGroupOrder。第二种方法是根据GroupOrderList分配用于决定驱动程序加载顺序的Tag值。Tag值、起始值、类型值和组名称都位于HKLM\SYS...

weixin_30412167的博客 257

windows驱动加载顺序

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33709219的博客 1306

Windows启动阶段驱动程序加载顺序

驱动程序在注册表中键值的设置,可以定制驱动程序加载顺序。牵涉到的注册表的键值Type,Start,Tage,Group。其中Group,tag值的使用这里进行了详细的解释。type类型在前面的文章中已经有描述了,start类型应该就不用再多讲了。

wangjiabin2007的专栏 5800

限制USB延迟启动

阻止用户从未经授权的位置安装设备驱动程序。 组策略 。。。too long too see directly. what determins when a drivers i s load. specifying driver laod order./ load order group for file system 如何控制设备驱动加载顺序 DISM 驱动服务命令项 ...

weixin_34358092的博客 401

wince下如何加载驱动(摘录)

 设备管理器是Windows CE.Net设备管理的核心机构,它主要负责跟踪、维护系统的设备信息并对设备资源进行调配。(在%WINCEROOT%/PRIVATE/WINCEOS/COREOS /DEVICE/LIB里可以看到Windows CE设备管理器的代码) 设备管理器在Windows CE中主要表现为Device.exe的文件,Device.exe在系统启动的时候通过注册表里面的HKEY_L

wangyh专栏 2657

改变Windows服务的启动顺序

要改变Windows服务的启动顺序,只要修改Windows的注册表就可 以了。任何Windows服务的注册信息可以在注册表的HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Services\\键下找到。下面就介绍几个与服务启动顺序相关的服务的值:   Group值:一个REG_SZ类型的值。它用来描述服务属于那一个服务组。如果服务没有这一项,那么它

ALCAT的专栏 5846

windows无盘启动技术开发之传统BIOS(Legacy BIOS)引导程序开发之一

而如果,我们把 13H中断的中断服务函数给替换掉,替换成我们的常驻内存的函数入口, 而这个函数则通过PXE通信,把磁盘读写请求重定向到服务器端。 这样不管是 MBR引导程序,ntldr,bootmgr等,通过INT 13H读写磁盘的时候,其实是通过我们的函数重定向到了服务器端。 这个就是我们开发引导程序的最主要和核心的功能。 其实,从另一个角度去理解,这就是一个在16位的实模式下另类的虚拟磁盘而已。

fanxiushu的专栏 2579

如何改变Windows服务的启动顺序

要改变Windows服务的启动顺序,只要修改Windows的注册表就可 以了。任何Windows服务的注册信息可以在注册表的HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Services\\键下找到。下面就介绍几个与服务启动顺序相关的服务的值:   Group值:一个REG_SZ类型的值。它用来描述服务属于那一个服务组。如果服务没有这一项,那么它

MecrtLi的专栏 1583

IdeController 驱动

IDE 接口是作为一种连接存储设备与计算机的标准连接方式出现的,ATA 规范定义了 其物理特性, 传输层,协议层及ATA/ATAPI 命令集。 IDE 主控制驱动IDE 主控制器设备句柄上实现实安装了PI 规范所定义的 EFI_IDE_CONTROLLER_INIT_PROTOCOL 接口,这样上层驱动可通过获得并调用 该接口实例来得到此主控制器相关信息并配置主控制器硬件以支持不同的工...

Helping BIOSer become Awesome! 2553

IDEA-查看类加载加载类顺序

package cn.tedu; import com.sun.crypto.provider.DESKeyFactory; public class ClassLoadTest1 { public static void main(String args[]) { // 启动类加载器,使用C++语言编写,负责加载支撑JVM运行的位于jre的lib目录下的核心类库 System.out.println(String.class.getClassLoader()

weixin_43187081的博客 2208

[1]编程实现加载驱动

加载驱动的标准方法 只有一种,就是利用服务管理器函数加载----SCM 加载法。 WIN64驱动模板 //[0]包含的头文件。可以加入系统或自己定义的头文件 #include <ntddk.h> #include <windef.h> #include<stdlib.h> //[1]定义符号链接,一般来说修改为...

diheqiu3577的博客 319

linux chipidea usb,找到一篇关于Linux usb gadget 非常使用的说明和使用教程

按照上一篇文章对gadget_configfs.txt的翻译,以imx8qxp mek的板子做为验证,配置为mass storage进行验证。内核打开对应的宏1、必须打开CONFIG_CONFIGFS_FS和CONFIG_USB_LIBCOMPOSITE的宏,前者为用户空间提供访问配置内核驱动的configfs文件系统,后者提供usb gadget composite框架;2、必须打开UDC(US...

weixin_39611666的博客 1823
上一篇: 创建类似Visual Studio的界面
下一篇: 几个代码
aasa2
博客等级 码龄25年 4粉丝 25原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值