与其他驱动程序注入方法结合使用时,$WinPeDriver$ 的限制

本文提供有关将驱动程序包含在 WinPE 中的指南,以及要安装的操作系统,以便驱动程序在安装的 WinPE 部分可用,并最终完成操作系统安装。

适用于:Windows 7 Service Pack 1、Windows Server 2012 R2、Windows Server 2008 R2 Service Pack 1
原始 KB 编号: 2686316

摘要

将驱动程序添加到安装媒体时,不要混合使用版本。 在整个媒体中使用每个驱动程序的相同版本。

有几种不同的方法可用于将现成的驱动程序添加到 Winpe (boot.wim) 和目标安装操作系统 (install.wim) 。 如果驱动程序版本不匹配,则无论 PNP 排名规则如何,都将使用加载到内存中的第一个驱动程序。 其他版本可能标记为“坏”驱动程序,这将阻止 PNP 稍后选择这些驱动程序。 这包括在启动到 WinPE (Winpe 阶段) 安装期间加载到内存中的任何驱动程序。 示例可能包括通过 DISM.exe 将驱动程序注入 boot.wim,或使用 Drvload.exe 加载驱动程序来手动加载驱动程序。

用途

请考虑以下方案:你正在创建自定义 Windows 预安装环境 (WinPE) 映像,以便在运行 Setup.exe 操作磁盘之前安装需要现成存储控制器驱动程序的 Windows 操作系统。 此外,你希望通过安装程序的 \$WinPEDriver$ 文件夹功能提供“最新”驱动程序以包含同一驱动程序的更高版本。

$WinPEDriver$ 功能旨在用作在安装时提供驱动程序的方法。 但是,这是 Setup.exe 的一项功能,因此在启动 Setup.exe 之前不会调用此功能。 使用 DISM 手动注入 WinPE boot.wim 驱动程序存储的当前设备的驱动程序会在启动时加载到内存中。 这两种机制是分开的,需要注意将它们一起使用。

WinPE 没有用于卸载已加载到内存中的驱动程序的内置机制,因此,一旦 setup.exe 启动,已加载的设备的任何驱动程序都不会重新加载,因为已加载设备的驱动程序已加载。 此错误将导致安装程序将 $WinPEDriver$ 文件夹中的驱动程序标记为错误的驱动程序,即使它比注入到 WinPE 中的驱动程序版本更新,否则会超过它。 安装程序对已加载到 boot.wim 中的驱动程序没有明确了解。

此行为是设计造成的;但是,本文将确定一种适应此方案的方法,以便这些驱动程序仍可以包含在可部署的操作系统中。

更多信息

鉴于上述情况,最好将 WinPE 放在可启动的 USB 闪存设备 (UFD) 硬盘驱动器或摇杆。

在本文档中,我们将重点介绍用于注入驱动程序和启动窗口的方法。 下图简要显示了包括驱动程序的方法和结果。

WinPE (内置本机或注入) $WinPEDriver$) 中的 (现装驱动程序 os) 后的结果 (
如果 WinPE 包含通过 Dism.exe 注入的驱动程序版本 X1 包含具有相同驱动程序名称的 X2 版本的驱动程序 X1 将在操作系统安装后携带,X2 将被忽略
如果 WinPE 使用 $WinPEDriver$ 中的 Drvload.exe 安装驱动程序 X2 包含具有相同驱动程序名称的 X2 版本的驱动程序 X2 将在操作系统安装后携带
如果 WinPE 包含的驱动程序 X1 不是启动关键 (内置本机) 不包含驱动程序 将使用内置本机驱动程序 X1。 安装 OS 后,没有现装的驱动程序可用于该设备

驱动程序限制

请记住,某些驱动程序可以包含和/或加载,但在安装 WinPE 期间可能无法正常运行。 这将包括,但不受限制:视频驱动程序、无线适配器驱动程序和音频驱动程序。 本文档中所述的行为并不特定于 BootCritical 驱动程序, (驱动程序在启动期间需要,例如用于访问硬盘驱动器) 的控制器驱动程序,并且适用于在安装/部署期间加载的所有驱动程序。

演练从 StartNet.cmd 加载驱动程序

这只是将同一驱动程序添加到 Windows 预安装环境 (WinPE) 以及使其可用于安装操作系统的一种方法;可以使用本文档中进一步的信息来使用其他方法。

  1. 设置技术人员的计算机:

    1. 将 OPK/AIK 安装到受支持的技术人员计算机上。
    2. 将要修改的 Windows 位复制到本地 HDD c:\bin。
    3. 查找/下载/提取要包含在媒体的驱动程序。
  2. 为每个网页准备 USB 设备,请确保将设备命名为“INSTALL_WIN7”。 稍后会使用此名称,如果对此进行更改,则必须更改步骤 6 中所述的示例脚本中的名称,以下示例 (网页链接列在文档末尾)

  3. 创建 WinPE 文件以复制到 USB 设备,打开管理命令提示符并运行:

    1. Copype.cmd <arch> <path>
    2. Copy <pathto> winpe.wim to \ISO\sources\boot.wim
  4. 装载 boot.wim:

    1. Dism /get-wiminfo /wimfile:\<pathto>\boot.wim
    2. Dism /mount-wim /wimfile:<pathto>\boot.wim /index:1 /mountdir:<pathto>\Mount
  5. 打开管理命令提示符,并使用 Notepad.exe 或类似) 编辑 \mount\windows\system32\startnet.cmd (。

  6. 以下示例脚本使用 Drvload.exe 标识 USB 设备并使驱动程序在 WinPE 期间可用。 将脚本剪切并粘贴到已打开的 startnet.cmd 文件中。

    注意

    可能需要先将脚本复制到 notepad.exe 或其他文本编辑器中以删除格式。

    wpeinit
    :ChkVar
    :: Locating USB Device
    IF NOT DEFINED usbdrv (  
    ECHO list vol | diskpart | find "INSTALL_WIN7" > pt.txt  
    FOR /F "tokens=3" %%a IN (pt.txt) DO (  
    SET usbdrv=%%a^:  
    )  
    del pt.txt /f /q  
    IF EXIST %usbdrv%\InstallOS.bat call InstallOS.bat  
    
  7. 保存StartNet.cmd并将其关闭。

  8. 使用以下命令卸载并提交对 boot.wim 的更改:

    Dism /unmount-wim /mountdir:<pathto>mount /commit
    
  9. 将 \ISO 文件夹中的所有文件复制到 USB 闪存设备 (应格式化为 FAT32 并标记为活动) 。

  10. 在 USB 闪存设备的根目录中创建名为 $WinpeDriver$ 的文件夹。

  11. (将驱动程序复制到此文件夹中,例如 <USB_drv>\$WinpeDriver$\DriverX) 。

  12. 打开管理 cmd 提示符并创建文件 <USB_drv>\InstallOS.bat,将以下行剪切并粘贴到批处理文件中:
    drvload %usbdrv%\$winpedriver$\<device>\filename。Inf

  13. 若要包含 DVD 中的 Windows OS 安装源文件,请:

    1. 在 USB 操纵杆上创建以下文件夹: <USB_drv>\<OS>\Sources (例如 e:\Win2008r2x64\Sources) 。
    2. 选择 DVD\sources\* 并将其复制到 <USB_drv>\<OS>\sources, (可以排除 boot.wim)
    3. 若要在启动到 WinPE 时手动启动 setup.exe,请选择“ <USB_drv>\<OS>\Sources\Setup.exe 并根据需要添加任何适当的开关。
    4. 对于完全自动化的部署,请将以下行添加到 InstallOS.bat 文件,并添加任何适当的开关:
      %usbdrv%\<OS>\Sources\Setup.exe
  14. 通过启动到测试计算机上的 USB 设备进行测试

将驱动程序提供给 WinPE 的方法

将驱动程序包含在 WinPE 中的方法包括:

  1. 映像生成时间注入通过 DISM.exe - 在 WinPE 映像的驱动程序存储中Places驱动程序,并在 WinPE 启动时通过即插即用进行选择。 它不会传播到已安装的 OS。 对于此方法,必须装载 WIM 文件以供访问,注入驱动程序,然后保存更改并将其提交到 WIM。

    收集信息、装载、注入和卸载 WIM 的步骤:

    1. DISM /get-wiminfo /wimfile:<pathto>boot.wim
    2. DISM /mount-wim /wimfile:<pathto>boot.wim /index:n /mountdir:<pathto>mount
    3. DISM /add-driver /image:<pathto>mount / driverpath:<pathto>driverINF [如果需要, /remove-driver 则相反]
    4. DISM /unmount-wim /commit /mountdir:<pathto>mount
  2. 运行时驱动程序通过 Drvload.exe 加载 - 将驱动程序加载到内存中并启动设备。 不会将驱动程序传播到已安装的 OS。

  3. 通过 Devcon.exe 加载运行时驱动程序 - Devcon 通过 Windows 设备驱动程序工具包中的示例源代码提供, (DDK) /Windows 驱动程序工具包 (WDK) 。 必须创建和编译自己的副本。 Devcon 用于操作驱动程序,例如将驱动程序加载到内存和启动设备。 不会将驱动程序传播到已安装的 OS。 引用中的 (链接部分)

  4. $WinPEDriver$ 文件夹 - Setup.exe 将尝试将 $WinPEDriver$ 目录中的所有驱动程序加载到内存中,并将计划这些驱动程序注入到安装 OS 中。

  5. 运行时应答文件 (unattend.xml) 与 DriverPath - 路径 (和凭据(如有必要)必须在 unattend.xml 中提供) 。 它用于访问中央存储库中可以位于网络共享或本地的文件。 安装程序将尝试在 unattend.xml 中提供的驱动程序存储中加载所有驱动程序,并计划将它们注入到已安装的 OS 中。

启动 Windows 安装

有多种方法可用于从 WinPE 启动操作系统安装,包括:

  1. 将安装包注入 boot.wim。
    1. 可以修改自定义 WinPE 以自动启动 Windows Setup.exe。
    2. 还可用于语言包和脚本支持。
  2. 从startnet.cmd或 winpeshl.ini 启动 setup.exe。
    1. 定位 U 盘/Hdd
    2. 启动 \path\setup.exe </开关>
  3. 要替换的自定义前端 cmd.exe (请参阅参考部分) 中Windows RE的链接。
  4. 从常规 Windows 安装程序媒体启动,该媒体首先启动到 WinPE (Boot.wim) 并且可以从连接的 USB 设备或网络存储接收输入。 本文未讨论此方法。

将驱动程序添加到 Windows 的方法

接下来,随着从安装到包含现成驱动程序的过程,有一些方法可用于在 Windows 中包含现成的驱动程序:

  1. Dism.exe
    1. Dism /get-wiminfo /wimfile:<pathto>Install.wim
    2. Dism /mount-wim /wimfile:<pathto>Install.wim /index:n /mountdir:<pathto>mount
    3. Dism /add-driver [and conversely /remove-driver] /image:<pathto>mount /driverpath:<pathto>driverINF
    4. Dism /unmounts-wim /commit /mountdir:<pathto>mount
  2. \$WinPEDriver$
  3. 在无人参与安装期间运行脚本
    1. 在 WinPE 和审核模式下 unattend.xml (驱动程序存储) (详细信息,请参阅) 的引用和链接部分。
    2. Setupcomplete.cmd可用于驱动程序注入,但建议不要这样做,因为它用户体验不佳,并可能导致首次启动到桌面时出现延迟。
  4. Drvload.exe
    1. 仅将驱动程序注入当前运行的 OS,如果有 WinPE,则通常为 RAM 磁盘。
    2. Drvload <pathto。INF> (可以在 startnet.cmd (查看示例) )

注意

如果要使用的驱动程序与内置驱动程序同名, (映像中本机包含) 启动操作系统将不使用这些新注入的驱动程序,则应联系驱动程序制造商以获取更新的驱动程序。 (如果熟悉Windows 徽标工具包 (WLK) ,请参阅 Devfund0005)

如果在 WinPE 传递期间加载驱动程序 (初始启动) 则在操作系统重新启动之前,没有本机机制可删除该驱动程序。

将驱动程序添加到 Windows 的过程的每个步骤都有多种方法。 方法提供可扩展且可延展的部署方案。 你需要确定以下哪种方法最适合给定的情况。

有关在 WinPE 中包含现用驱动程序的详细说明

必要的设置/工具:

  • 技术人员计算机 - 用于生成/操作安装媒体的计算机
  • 已安装 OPK/AIK
  • USB/UFD 或 DVD

使用 DISM.exe:

  1. 安装 OEM 预安装工具包 (OPK) 或 Windows 自动安装工具包 (Windows AIK)
  2. 单击“ 启动>程序>”Windows OPK (或 Windows AIK) ,然后打开“管理部署工具”命令提示符。
  3. 将 boot.wim 复制到硬盘驱动器 (例如 c:\Bin) 。 还可以使用 Copype.cmd 生成新的 WinPE;但是,如果没有其他自定义项,此操作不会自动启动 setup.exe。
  4. 使用 DISM 标识 boot.wim 中的索引数。 如果要从安装媒体复制 boot.wim,它将有两个索引。 通常,我们将修改索引 #2;否则为索引 #1。
    dism /get-wiminfo /wimfile:<wim_file>

    注意

    注入到一个索引中的文件将不适用于其他索引。

  5. 创建“Mount”文件夹 (例如 c:\Bin\mount)
  6. 使用 DISM 装载 wim。
    DISM /mount-wim /wimfile:c:\bin\boot.wim /index:1 /mountdir:c:\bin\mount
  7. 将驱动程序放在可定位文件夹 (,例如 c:\bin\driver) 。
  8. 使用 DISM 将驱动程序添加到装载的 WIM 映像。
    dism /image:c:\bin\mount /Add-Driver /driverpath:<path to INF>
  9. 通过检查 DISM 日志或确保 DISM 在命令提示符处返回完成,确认成功。
  10. 卸载并提交对 Boot.wim 的更改。 在运行此命令之前,关闭任何打开的窗口的所有句柄,这些窗口可能在 c:\bin\mount 下打开 (同时确保命令提示符位于或高于 c:\bin 目录结构) 。
    dism /unmount-wim /mountdir:c:\bin\mount /commit
  11. DISM 成功卸载 WIM 后,我们可以设置迁移到 USB/DVD 的内容。 如果在卸载过程中遇到错误,可能需要重新装载 wim 以确认已注入包。 DISM 参数 /cleanup-wim/get-packages 可能在此处有所帮助。 有关在光学或 U 盘上创建可启动 WinPE 媒体的说明,请参阅本文档末尾的参考和链接部分。

使用 \$WinpeDriver$

$WinpeDrivers$ 是 Setup.exe 查找的附加文件夹结构,如果找到,将进行分析以拉取其他驱动程序。 安装程序将以递归方式分析此 \$WinpeDriver$ 文件夹下的文件和文件夹,查找 *。INF 文件和尝试将这些发现的驱动程序安装到驱动程序存储中。

在 USB 设备的根目录上,文件夹结构可能如下所示:

\$WinpeDriver$
\\WiFi
•\Wireless1
•Wireless.INF
、Wireless.SYS
操作系统) 所需的 Wireless.CAT (

注意

如果查看 \Windows\Panther\Setupact.log可以看到对此文件夹的引用: PnPIBS:检查预配置的驱动程序路径...
PnPIBS:检查预配置的驱动程序目录 C:$WinPEDriver$。
PnPIBS:检查预配置的驱动程序目录 D:$WinPEDriver$。
PnPIBS:检查预配置的驱动程序目录 E:$WinPEDriver$。
PnPIBS:检查预配置的驱动程序目录 X:$WinPEDriver$。

使用无人参与应答文件 (unattend.xml/autounattend.xml)

如果文件命名为 autounattend.xml,Windows 可以在已装载驱动器的根目录上自动查找无人参与的应答文件。 如果使用开关通过 Setup.exe 启动,Windows 还将选取无人参与的应答文件。 此答案文件可为安装操作系统提供驱动器配置、产品密钥、计算机名称和驱动程序存储路径、OEM 公司信息等信息。 有关如何将驱动程序添加到 unattend.xml 的文档,请参阅本文档的“参考和链接”部分的末尾。

下面是从 AIK Unattend.chm 使用 Drvstore 的 AutoUnattend.xml 的示例片段。 XML 输出指定设备驱动程序的其他位置的 UNC 路径以及用于访问网络路径的凭据。

<DriverPaths>
<!-- First PathAndCredentials list item -->
   <PathAndCredentials wcm:action="add" wcm:keyValue="1">
        <Path>\\myFirstDriverPath\DriversFolder</Path>
        <Credentials>
                <Domain>MyDomain</Domain>
                <Username>MyUsername</Username>
                <Password>MyPassword</Password>
        </Credentials>
   </PathAndCredentials>
<!-- Second PathAndCredentials list item -->
   <PathAndCredentials wcm:action="add" wcm:keyValue="2">
      <Path>C:\Drivers</Path>
      <Credentials>
         <Domain>MyComputerName</Domain>
         <Username>MyUsername</Username>
         <Password>MyPassword</Password>
      </Credentials>
   </PathAndCredentials>
</DriverPaths>

使用 Drvload.exe

Drvload 是 WinPE 中的一个工具,用于在启动到内置 WinPE 命令提示符后添加驱动程序。 使用 Drvload 时,需要识别驱动程序并将其放置在某个位置。 WinPE 的startnet.cmd可用于编写 Drvload 脚本,以及在启动或启动到 WinPE 时执行以下操作之一:

  1. 运行脚本以:
    1. 标识安装媒体,通常是 USB 设备。
    2. 添加现装驱动程序
    3. 配置硬盘驱动器和恢复分区
    4. 根据需要启动 setup.exe 或应用 WIM。
  2. 部署/应用 WIM 验证后对于想要创建自己的工具以用于注入或操作驱动程序的开发人员,DevCon.exe 可能是一个有用的实用工具。 有关 DevCon.exe 的详细信息,请参阅引用和链接部分。

示例startnet.cmd

作为安装脚本/自动化的一种方法,需要标识 USB 设备,因为这是其他驱动程序的位置。 此示例使用 WinPE 中的脚本,该脚本在启动时自动运行以检测 U 盘。 此脚本启动另一个脚本,以在设置的 WinPE 阶段使用 Drvload.exe 安装驱动程序。 脚本位于 WIM 文件外部,因此可以轻松修改。

使用 WinPE 标识安装媒体的方法Startnet.cmd (默认 WinPE) 中启动的第一个文件:

  1. 首先,需要有一种方法来自动识别 WinPE Startnet.cmd中的安装媒体,这是在默认 WinPE 配置中启动的第一个文件。 可通过以下两种方法之一执行此操作:

    • 创建磁盘卷标签为“INSTALL_WIN7”的可启动 WinPE U 盘。 然后在startnet.cmd开头放置以下行,查找“INSTALL_WIN7”磁盘卷标签:

      "INSTALL_WIN7" disk volume label:
      :ChkVar
      :: Locating USB Device
      IF NOT DEFINED usbdrv (
      ECHO list vol | diskpart | find "INSTALL_WIN7" > pt.txt
      FOR /F "tokens=3" %%a IN (pt.txt) DO ( 
      SET usbdrv=%%a^:
      )
      del pt.txt /f /q
      
    • 在媒体上创建“标记”文件作为备用驱动器位置方法进行比较:

      :SetOSvar
      @echo off
      IF NOT DEFINED usbdrv (
      ECHO locating OS drive
      FOR %%b IN ( C D E F G H I J K L M N O ) DO (
      IF EXIST %%b:\<specialfilename1> IF EXIST %%b:\ <specialfilename2>  (
      SET usbdrv=%%b^:
      )
      )
      )
      

      注意

      你需要确保 <specialfilename1 & specialfilename2> 存在于 USB 闪存设备上的指定位置。

  2. 将文件包含在startnet.cmd中使用的 boot.wim 中。 然后将文件放入 X: 驱动器,以便通过 X:\<文件名>访问这些文件。 将文件添加到 boot.wim 时,这将增加 WIM 内存占用量。

  3. USB 驱动器号已知后,可以启动用于注入驱动程序的其他脚本。 由于经常修改 boot.wim (每次) 时都必须装载/卸载并提交更改,因此在startnet.cmd之外运行脚本会更容易。 例如,如果在 U 盘的根目录中创建名为“InstallOS.bat”的脚本,我们可以轻松地修改此文件,根据需要对启动/自动化过程进行更改。

    下面是startnet.cmd文件中所需的文本示例,该文件将查找“InstallOS.bat”,如果找到,请启动它:

    IF EXIST %usbdrv%\InstallOS.bat call InstallOS.bat  
    Echo %time% %date%
    

    注意

    如其名称所示,InstallOS.bat 除了将驱动程序添加到 WinPE 之外,还可以执行更多操作。 但是,出于本文档的目的,不会讨论其他脚本详细信息。

  4. 此时,%usbdrv% 是使用 USB 闪存设备的驱动器号定义的,因此可以通过 InstallOS.bat 中的脚本注入 %usbdrv%\$WinpeDriver$ 文件夹中的驱动程序。

    例如,在 InstallOS.bat 添加 Drvload.exe %usbdrv%\$winpedriver$\<device>\filename.INF

使用此方法时,WinPE 首先会选取和使用可用于操作系统的驱动程序。

Windows 恢复环境 (WinRE)

WinRE 通常在硬盘驱动器上是静态的,在安装过程中自动安装,或者由 OEM 创建/自定义以用于恢复方案。 如果使用 WinRE 将计算机恢复到出厂默认值,则实际上没有方法将驱动程序动态更新到最新版本。 必须使用将驱动程序注入所有相关 WIM 文件(例如 WinRE.wim/Boot.wim)以及要应用于操作系统的映像来创建映像。 确保这些驱动程序都是相同的版本。

总结

如果你的要求是在运行 setup.exe 之前创建一个加载现成驱动程序的 WinPE 环境,请遵循本文档中所述的准则,以便在生成的已安装操作系统中最终获得所需的驱动程序。 编写利用 startnet.cmd 启动的 Drvload.exe 来加载位于 U 盘上 $WinPeDriver$ 文件夹中的特定驱动程序的脚本是最灵活的方法。 此方法允许你在 WinPE 阶段加载驱动程序,该驱动程序会传递到已安装的操作系统中。 此外,它还允许维护驱动程序的中央存储库,以便灵活地更新这些驱动程序 (以便维护驱动程序存储中的最新驱动程序) 。

数据收集

如果需要 Microsoft 支持方面的帮助,建议按照使用 TSS 针对与部署相关的问题收集信息中所述的步骤收集信息。

注意

需要一个帐户才能从 OEM 站点下载文件。