与其他驱动程序注入方法结合使用时,$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 操作系统,然后运行Setup.exe来操作磁盘,需创建一个自定义 Windows 预安装环境(WinPE)映像。 此外,还需要提供“最新”驱动程序,以便通过安装程序的 \$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 将在 OS 安装后进行,X2 将被忽略
如果 WinPE 使用 Drvload.exe 从 $WinPEDriver$ 安装驱动程序 X2 包含具有相同驱动程序名称的 X2 版本的驱动程序 X2 将在 OS 安装后进行
如果 WinPE 包含驱动程序 X1,则为非启动关键(内置本机) 不包含驱动程序 将使用内置本机驱动程序 X1。 操作系统安装后,该设备将无法使用现装的驱动程序

驱动程序限制

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

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

它只是将同一驱动程序纳入 Windows 预安装环境(WinPE)的一种方法,并使其可用于安装操作系统:可以使用本文档中进一步的信息来使用其他方法。

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

    1. 将 OPK/AIK 安装到受支持的技术人员计算机。
    2. 复制要修改到本地 HDD c:\bin 的 Windows 位。
    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. 打开管理命令提示符并编辑 \mount\windows\system32\startnet.cmd(使用Notepad.exe或类似)。

  6. 以下示例脚本标识 USB 设备,并使用 Drvload.exe 在 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. 在名为 $WinpeDriver$ 的 USB 闪存设备的根目录中创建文件夹。

  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 映像的 Driverstore 中,并在 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. 定位 USB 摇杆/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;否则为 index #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 可能在此处有所帮助。 有关在光学或 USB 闪存驱动器上创建可启动 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 中的脚本,该脚本在启动时自动运行以检测 USB 驱动器。 此脚本启动另一个脚本,以在 WinPE 安装阶段使用Drvload.exe安装驱动程序。 该脚本位于 WIM 文件之外,因此可以轻松对其进行修改。

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

  1. 首先,需要一种方法来自动识别 WinPE Startnet.cmd中的安装介质,这是默认 WinPE 配置中启动的第一个文件。 可通过以下两种方式之一实现此目的:

    • 使用磁盘卷标签“INSTALL_WIN7”创建可启动的 WinPE USB 闪存驱动器。 然后在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
      
    • 在媒体上创建“tag”文件作为用于比较的替代驱动器位置方法:

      :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:\<file name> 访问这些文件。 将文件添加到 boot.wim 时,这将增加 WIM 内存占用。

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

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

    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来加载 USB 闪存驱动器上 $WinPeDriver$ 文件夹中的特定驱动程序是可用的最灵活的方法。 此方法允许你在 WinPE 阶段加载驱动程序,该驱动程序会传递到已安装的操作系统中。 此外,它还允许维护驱动程序的中央存储库,以便灵活地更新这些驱动程序(以便维护驱动程序存储中的最新驱动程序)。

数据收集

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

注意

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