windriver 第16章:动态加载驱动程序
16.1 为何需要可动态加载的驱动程序?
添加新驱动程序时,通常需要重启系统才能将其加载到系统中。而WinDriver是一款可动态加载的驱动程序,能让用户在安装应用程序后立即启动使用,无需重启系统。
无论你创建的是用户模式驱动程序还是内核模式驱动程序(详见第12章“了解内核插件”中的内核插件相关内容),都可以对其进行动态加载。
若要成功卸载驱动程序,请确保不存在指向WinDriver服务(windrvr1630.sys或你重命名后的驱动程序)的打开句柄,且没有已连接并启用的即插即用设备注册到该服务。
16.2 Windows系统下的动态驱动加载
Windows 7及更高版本使用Windows驱动程序模型(WDM)驱动程序,这类驱动程序的文件扩展名为*.sys(例如windrvr1630.sys)。WDM驱动程序通过安装INF文件进行部署(详见下文)。
WinDriver的Windows内核模块windrvr1630.sys是一款完全兼容WDM的驱动程序,可使用wdreg工具进行安装,具体操作将在以下章节详细说明。
⚠ 注意
x64版本WinDriver中包含的
wdreg.exe工具与ARM64版本WinDriver中包含的wdreg.exe工具不同。若要在ARM64平台上运行x64版本的wdreg.exe,需在命令中添加-compat参数。
16.2.1 wdreg工具
WinDriver提供了动态加载和卸载驱动程序的选项,该选项可替代通过Windows设备管理器进行的手动操作(设备INF文件仍可通过设备管理器进行操作),且速度更快。此功能通过两个独立的工具实现:wdreg和wdreg_gui。
这两个工具均可在WinDriver\util目录中找到,支持通过命令行运行,且功能完全一致。二者的区别在于:wdreg_gui以图形化方式显示安装信息,而wdreg则在控制台模式下显示相关信息。
本节将介绍在Windows操作系统中wdreg/wdreg_gui的使用方法。
以下说明和示例均以wdreg为例,但所有提及wdreg的地方都可替换为wdreg_gui。
16.2.1.1 WDM驱动程序
本节将介绍如何在Windows系统中使用wdreg工具安装WDM驱动程序windrvr1630.sys,或安装用于注册即插即用设备以配合该驱动程序工作的INF文件。你可以按照17.2.1“Windows驱动程序重命名”中的说明,对windrvr1630.sys内核模块进行重命名,并修改设备INF文件以注册到你重命名后的驱动程序。
若要使用wdreg安装修改后的INF文件,只需将以下所有提及windrvr1630的地方替换为你的新驱动程序名称即可。
本节内容不适用于内核插件驱动程序,因为内核插件驱动程序不属于WDM驱动程序,且不通过INF文件进行安装。有关如何在Windows系统中使用wdreg安装内核插件驱动程序的说明,请参阅16.2.1.2“非WDM驱动程序”。
使用方法:wdreg工具支持以下两种使用格式,示例如下:
wdreg -inf <filename> [-silent] [-log <logfile>] [install | preinstall | uninstall | enable | disable]
wdreg -rescan <enumerator> [-silent] [-log <logfile>]
选项:wdreg支持多个基本选项,你可以选择其中一个、多个或不选择任何选项:
| 选项 | 描述 |
|---|---|
-inf |
要动态安装的INF文件路径。 |
-rescan <enumerator> |
重新扫描指定的枚举器(如ROOT、ACPI、PCI、USB等)以检测硬件变化。每次只能指定一个枚举器。 |
-silent |
抑制所有信息的显示(可选)。 |
-log <logfile> |
将所有信息记录到指定的日志文件中(可选)。 |
操作:wdreg支持以下多个基本操作:
| 操作 | 描述 |
|---|---|
install |
安装INF文件,将相关文件复制到目标位置,并动态加载INF文件中指定的驱动程序(如需,将替换旧版本)。 |
preinstall |
为未连接的设备预安装INF文件。 |
uninstall |
从注册表中移除驱动程序,使其在下次系统启动时不再加载(详见下方说明)。 |
enable |
启用驱动程序。 |
disable |
禁用驱动程序,即动态卸载该驱动程序,但该驱动程序会在系统重启后重新加载(详见下方说明)。 |
若要成功禁用/卸载驱动程序,请确保不存在指向WinDriver服务(windrvr1630.sys或你重命名后的驱动程序)的打开句柄,且没有已连接并启用的即插即用设备注册到该服务。 |
16.2.1.2 非WDM驱动程序
本节将介绍如何在Windows系统中使用wdreg工具安装非WDM驱动程序(即内核插件驱动程序)。
在开发阶段,可使用wdreg_frontend图形界面工具快速安装/卸载内核插件,这会非常便捷。
使用方法:
wdreg [-file <filename>] [-name <drivername>] [-startup <level>] [-silent] [-log <logfile>] Action [Action ...]
选项:wdreg支持多个基本选项,你可以选择其中一个、多个或不选择任何选项:
| 选项 | 描述 |
|---|---|
-startup |
指定驱动程序的启动时机。需指定以下参数之一:-boot:表示由操作系统加载程序启动的驱动程序,仅适用于加载操作系统所必需的驱动程序(例如Atdisk)。-system:表示在操作系统初始化期间启动的驱动程序。-automatic:表示在系统启动时由服务控制管理器启动的驱动程序。-demand:表示在需要时(即设备插入时)由服务控制管理器启动的驱动程序。-disabled:表示无法启动的驱动程序。-startup选项的默认设置为automatic。 |
-name |
设置驱动程序的符号名称。用户模式应用程序通过该名称获取驱动程序的句柄。你必须提供该驱动程序的符号名称(不带*.sys扩展名)作为此选项的参数。该参数应与内核插件项目的KP_Init函数中设置的驱动程序名称一致,即strcpy(kpInit->cDriverName, XXX_DRIVER_NAME)。 |
-file |
wdreg允许你将驱动程序以与物理文件名不同的名称安装到注册表中。此选项用于设置驱动程序的文件名。你必须提供该驱动程序的文件名(不带*.sys扩展名)作为参数。wdreg会在Windows安装目录(windir%\system32\drivers)中查找该驱动程序。因此,在尝试安装驱动程序之前,请确保驱动程序文件已放置在正确的目录中。 |
使用方法:
wdreg -name <Your new driver name> -file <Your original driver name> install
| 标志 | 描述 |
|---|---|
-silent |
抑制所有类型信息的显示。 |
-log <logfile> |
将所有信息记录到指定的日志文件中。 |
操作:wdreg支持以下多个基本操作:
| 操作 | 描述 |
|---|---|
create |
将驱动程序添加到注册表中,使Windows在下次启动时加载该驱动程序。 |
delete |
从注册表中移除驱动程序,使其在下次系统启动时不再加载。 |
start |
将驱动程序动态加载到内存中以供使用。启动驱动程序之前必须先创建该驱动程序。 |
stop |
将驱动程序从内存中动态卸载。 |
快捷操作:为方便使用,wdreg支持以下几个快捷操作:
| 快捷操作 | 描述 |
|---|---|
install |
创建并启动驱动程序。此操作等同于先执行wdreg的stop操作(如果当前已加载该驱动程序的某个版本)或create操作(如果当前未加载该驱动程序的任何版本),然后执行wdreg的start操作。 |
preinstall |
为未连接的设备创建并启动驱动程序。 |
uninstall |
将驱动程序从内存中卸载,并从注册表中移除该驱动程序,使其在下次系统启动时不再加载。此操作等同于先执行wdreg的stop操作,然后执行wdreg的delete操作。 |
16.2.2 动态加载/卸载windrvr1630.sys的INF文件
使用WinDriver时,你会开发一个用户模式应用程序,该应用程序通过通用的windrvr1630.sys驱动程序(WinDriver的内核模块)来控制和访问硬件。因此,你可能需要动态加载和卸载windrvr1630.sys驱动程序,而这一操作可通过wdreg工具完成。
此外,在兼容WDM的操作系统中,你还需要为即插即用设备动态加载INF文件。wdreg工具可在Windows系统中自动完成此操作。本节包含wdreg工具的使用示例,这些示例基于上一节中对wdreg工具的详细描述。
示例:
- 加载
windrvr1630.inf并启动windrvr1630.sys服务:
wdreg -inf <path to windrvr1650@.inf> install
- 加载位于
c:\tmp目录下名为device.inf的INF文件:
wdreg -inf c:\tmp\device.inf install
你可以将上述示例中的install选项替换为preinstall,为当前未连接到电脑的设备预安装设备INF文件。
如果安装失败并提示ERROR_FILE_NOT_FOUND错误,请检查Windows注册表,确认HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion路径下是否存在RunOnce键。Windows即插即用功能需要此注册表键才能通过INF文件正确安装驱动程序。如果RunOnce键缺失,请创建该键,然后重新尝试安装INF文件。
若要卸载驱动程序/INF文件,可使用相同的命令,只需将上述示例中的install替换为uninstall即可。
16.2.3 动态加载/卸载内核插件驱动程序
如果使用WinDriver开发了内核插件驱动程序,则必须在加载通用的WinDriver驱动程序(windrvr1630.sys)之后,再加载该内核插件驱动程序。
卸载驱动程序时,需先卸载内核插件驱动程序,再卸载windrvr1630.sys。
内核插件驱动程序支持动态加载,即无需重启系统即可加载和卸载。若要加载/卸载内核插件驱动程序(XXX_DRIVER_NAME.sys),可使用上述针对windrvr1630的wdreg命令,但需添加name参数,并在该参数后指定内核插件驱动程序的名称。
⚠ 注意
驱动程序名称后不应添加*.sys扩展名。
💡 建议
在开发阶段,可使用
wdreg_frontend图形界面工具快速安装/卸载内核插件。
示例:
- 加载名为KPDriver.sys的内核插件驱动程序,运行以下命令:
wdreg -name KPDriver install
- 加载名为MPEG_Encoder、文件名为MPEGENC.sys的内核插件驱动程序,运行以下命令:
wdreg -name MPEG_Encoder -file MPEGENC install
- 卸载名为KPDriver.sys的内核插件驱动程序,运行以下命令:
wdreg -name KPDriver uninstall
- 卸载名为MPEG_Encoder、文件名为MPEGENC.sys的内核插件驱动程序,运行以下命令:
wdreg -name MPEG_Encoder -file MPEGENC uninstall
16.3 wdreg_frontend工具
在Windows系统中,WinDriver提供了一款图形界面前端工具wdreg_frontend,该工具旨在简化开发阶段WinDriver和内核插件驱动程序的安装/卸载操作。
wdreg工具可执行的所有操作,wdreg_frontend工具均支持,且二者的输出结果完全一致。wdreg_frontend工具会打印出所执行的完整wdreg命令,方便开发人员复制所需命令并将其集成到自己的安装脚本中。
⚠ 注意
在Windows系统中安装驱动程序需要管理员权限。
启动wdreg_frontend工具
![]()
可通过以下两种方式启动wdreg_frontend工具:
-
点击DriverWizard窗口中的
wdreg_frontend图标; -
直接运行
WinDriver/util/wdreg_frontend.exe。
安装/卸载INF文件
-
点击“文件”|“打开”,选择要操作的INF文件;
-
若文件加载成功,所有适用于.inf文件的操作将被激活:安装驱动程序、卸载驱动程序、启用驱动程序、禁用驱动程序、预安装驱动程序。
加载/卸载内核插件
如果驱动程序文件未位于Windows系统目录中,将弹出以下对话框:

启动wdreg_frontend成功后加载sys文件

操作步骤:
-
点击“文件”|“打开”,选择要操作的sys文件;
-
若该sys文件未位于Windows系统目录中,将弹出对话框,询问是否希望
wdreg_frontend将该sys文件复制到Windows系统目录; -
若文件加载成功,所有适用于.sys文件的操作将被激活:安装驱动程序、卸载驱动程序、启动驱动程序、停止驱动程序、创建驱动程序、删除驱动程序以及启动级别的选择。
有关这些操作的更多信息,请参阅本文档16.2.1.2“非WDM驱动程序”中关于wdreg工具的相关内容。
wdreg_frontend安装内核插件驱动成功

安装未签名驱动时window的错误信息

要使驱动程序在Windows系统中正确加载并工作,你可能需要对sys文件进行数字签名,或禁用数字签名强制验证功能。
16.4 Linux系统下的动态驱动加载
⚠ 注意
以下命令必须以root权限执行。
动态加载WinDriver
运行以下命令:
# <path to wdreg> windrvr1650
动态卸载WinDriver
运行以下命令:
# /sbin/modprobe -r windrvr1650.
wdreg工具位于WinDriver/util目录中。
若要在每次系统启动时自动加载WinDriver,需在目标设备的Linux启动文件(例如/etc/rc.local)中添加以下行:
<path to wdreg> windrvr1650
16.4.1 动态加载/卸载内核插件驱动程序
如果使用WinDriver开发了内核插件驱动程序,则必须在加载通用的WinDriver驱动程序(windrvr1630.o/.ko)之后,再加载该内核插件驱动程序。
卸载驱动程序时,需先卸载内核插件驱动程序,再卸载windrvr1630.o/.ko。
内核插件驱动程序支持动态加载,即无需重启系统即可加载和卸载。可使用以下命令动态加载或卸载内核插件驱动程序。
⚠ 注意
以下命令必须以root权限执行。
命令中的xxx代表你所选的内核插件驱动程序项目名称。
动态加载内核插件驱动程序
运行以下命令:
# /sbin/insmod <path to kp_xxx_module.o/.ko>
在开发机器上构建内核插件驱动程序时,内核插件驱动程序模块将生成在你的内核插件项目的kermode/linux/LINUX.<内核版本>.<CPU>目录中(详见13.8.2“Linux内核插件驱动程序编译”)。在目标发行版机器上构建驱动程序时,驱动程序模块通常生成在xxx_installation/redist/LINUX.<内核版本>.<CPU>.KP目录中(详见15.3.3“在目标设备上构建和安装内核插件驱动程序”)。
动态卸载内核插件驱动程序
运行以下命令:
# /sbin/rmmod kp_xxx_module
若要在每次系统启动时自动加载内核插件驱动程序,需在目标设备的Linux启动文件(例如/etc/rc.local)中,在WinDriver驱动程序模块(windrvr1630)的加载命令之后添加以下行(将<kp_xxx_module.o/.ko的路径>替换为你的内核插件驱动程序模块的路径):
/sbin/insmod <path to kp_xxx_module.o/.ko>
原文链接:https://windriver.jungo.com/manual/ch16_dynamically_loading_your_driver.html
(注:文档内容由 AI 生成,翻译正确性不做保证,只做参考,请参对比原文进行浏览,对于由翻译引起的问题不负任何责任 By chencarl)

浙公网安备 33010602011771号