避免在设备和驱动程序汇报期间系统重启

若要避免设备安装期间系统重启,请使用以下规则:

  • 切勿在 INF DDInstall 节中使用“重新启动”或“重启”条目。 这些指令最初是为了与 Windows 9x/Me 兼容而提供的,不应用于 Windows 2000 及更高版本的 Windows。

  • 除非绝对必要,否则不要将COPYFLG_FORCE_FILE_IN_USE或COPYFLG_REPLACE_BOOT_FILE标志与 INF CopyFiles 指令一起使用。

  • 使 驱动程序包 中的所有文件都 从驱动程序存储运行

  • 如果驱动程序包中的文件不是从驱动程序存储运行,请为每个新版本的类安装程序、共同安装程序或服务 DLL 分配一个新文件名。 这样就无需在使用旧版本时重启系统。 (事实上,如果新文件名不用于更新的类安装程序或类共同安装程序,则这些新文件将不用于 installation.)

  • 若要更新设备的驱动程序,请遵循 更新驱动程序文件下列出的规则。

在更新文件支持的驱动程序时尽量减少重启

在Windows 10之前,所有内核模式驱动程序都由系统的分页文件提供支持。 因此,即使驱动程序正在运行,也可能覆盖磁盘上的驱动程序二进制文件。

为了提高性能,从 Windows 10 开始,大多数非启动驱动程序都由磁盘上的驱动程序二进制文件提供支持。

现在作为文件支持的驱动程序启动类型包括:

  • SERVICE_SYSTEM_START (0x00000001)

  • SERVICE_AUTO_START (0x00000002)

  • SERVICE_DEMAND_START (0x00000003)

启动启动驱动程序继续由分页文件提供支持。

若要更新文件支持的驱动程序,请使用以下最佳做法。 否则,更新可能需要两次重启,一次用于替换文件,另一次用于加载新版本的驱动程序。

如果使用 INF 文件,请执行以下步骤:

  1. 修改驱动程序 INF 文件的 CopyFiles 部分以使用 COPYFLG_IN_USE_RENAME,如下所示:

    [MyDriver_Install.NT]
    CopyFiles=MyDriverCopy
    
    [MyDriverCopy]
    MyDriver.sys,,,0x00004000  ; COPYFLG_IN_USE_RENAME
    

    如果使用此标志,Windows 会尝试替换磁盘上的驱动程序文件。 有关详细信息,请参阅 INF CopyFiles 指令

  2. 如果 INF 适用于 PnP 驱动程序,则设备安装期间,Windows 会尝试卸载正在运行的驱动程序并重启使用该驱动程序的设备,以便获取新版本的驱动程序。 如果失败,设备安装指示应重新启动系统。

  3. 如果 INF 不适用于 PnP 驱动程序,并且使用的是 InstallHInfSection 等方法来处理 INF,请手动停止并重启驱动程序:

    • 关闭驱动程序的所有打开句柄,然后使用以下方法之一停止驱动程序:

      • sc.exe stop <mydriver>

      • ControlService (SERVICE_CONTROL_STOP)

      有关详细信息,请参阅 ControlService 函数

如果未使用 INF 文件,请使用以下步骤:

  1. 如上所述,停止驱动程序。 将旧的驱动程序二进制文件替换为新文件。

  2. 如果无法停止驱动程序,请重命名现有文件,将新文件复制到原位,并将现有文件设置为在将来删除 (例如,将 MoveFileExMOVEFILE_DELAY_UNTIL_REBOOT 标志) 。 若要开始使用新版本的驱动程序,需要重启系统。

基于文件和基于页文件的节

确定驱动程序加载时间的内容