与其他驱动程序注入方法结合使用时,$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)的一种方法,并使其可用于安装操作系统:可以使用本文档中进一步的信息来使用其他方法。
设置技术人员的计算机:
- 将 OPK/AIK 安装到受支持的技术人员计算机。
- 复制要修改到本地 HDD c:\bin 的 Windows 位。
- 找到/下载/提取要包含在媒体的驱动程序。
为每个网页准备 USB 设备,确保将设备命名为“INSTALL_WIN7”。 此名称稍后使用,如果更改此名称,则必须更改步骤 6 中所述的示例脚本和以下示例中的名称(文档末尾列出了网页链接)
创建 WinPE 文件以复制到 USB 设备,打开管理命令提示符并运行:
Copype.cmd <arch> <path>
Copy <pathto> winpe.wim to \ISO\sources\boot.wim
装载 boot.wim:
Dism /get-wiminfo /wimfile:\<pathto>\boot.wim
Dism /mount-wim /wimfile:<pathto>\boot.wim /index:1 /mountdir:<pathto>\Mount
打开管理命令提示符并编辑 \mount\windows\system32\startnet.cmd(使用Notepad.exe或类似)。
以下示例脚本标识 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
保存StartNet.cmd并关闭它。
使用以下命令卸载和提交对 boot.wim 的更改:
Dism /unmount-wim /mountdir:<pathto>mount /commit
将 \ISO 文件夹中的所有文件复制到 USB 闪存设备(应格式化 FAT32 并标记为活动)。
在名为 $WinpeDriver$ 的 USB 闪存设备的根目录中创建文件夹。
将驱动程序复制到此文件夹中(例如 <USB_drv>\$WinpeDriver$\DriverX)。
打开管理 cmd 提示符并创建文件 <USB_drv>\InstallOS.bat,将以下行剪切并粘贴到批处理文件中:
drvload %usbdrv%\$winpedriver$\<device>\filename。INF若要包括 DVD 中的 Windows OS 安装源文件,请:
- 在 USB 操纵杆上创建以下文件夹: <USB_drv>\<OS>\Sources(例如 e:\Win2008r2x64\Sources)。
- 选择 DVD\sources\* 以 <USB_drv>\<OS>\sources(可能排除 boot.wim)
- 若要在启动到 WinPE 时手动启动setup.exe,请选择<USB_drv>\OS>\<Sources\Setup.exe并根据需要添加任何适当的开关。
- 对于完全自动化的部署,请将以下行添加到InstallOS.bat文件,并添加任何适当的开关:
%usbdrv%\OS>\<Sources\Setup.exe
通过启动到测试计算机上的 USB 设备进行测试
使驱动程序可供 WinPE 使用的方法
将驱动程序包括到 WinPE 中的方法包括:
映像生成时间注入通过 DISM.exe - 将驱动程序置于 WinPE 映像的 Driverstore 中,并在 WinPE 启动时通过 即插即用 进行选择。 它不会传播到已安装的 OS。 对于此方法,必须装载 WIM 文件以供访问,注入驱动程序,然后保存并提交到 WIM 的更改。
收集信息、装载、注入和卸载 WIM 的步骤:
DISM /get-wiminfo /wimfile:<pathto>boot.wim
DISM /mount-wim /wimfile:<pathto>boot.wim /index:n /mountdir:<pathto>mount
DISM /add-driver /image:<pathto>mount / driverpath:<pathto>driverINF
[如果需要,/remove-driver
则相反]DISM /unmount-wim /commit /mountdir:<pathto>mount
通过Drvload.exe加载运行时驱动程序 - 将驱动程序加载到内存中并启动设备。 不会将驱动程序传播到已安装的 OS。
通过 Devcon.exe 运行时驱动程序加载 - Devcon 通过 Windows 设备驱动程序工具包(DDK)/Windows 驱动程序工具包(WDK)中的示例源代码提供。 必须创建并编译自己的副本。 Devcon 用于操作驱动程序,例如将驱动程序加载到内存和启动设备。 不会将驱动程序传播到已安装的 OS。 (“参考链接”部分)
$WinPEDriver$ 文件夹 - Setup.exe将尝试将 $WinPEDriver$ 目录中的所有驱动程序加载到内存中,并将计划这些驱动程序注入到安装 OS 中。
必须在 unattend.xml 中提供带 DriverPath 的运行时应答文件 (unattend.xml) - 路径(和凭据)。必须提供。 它用于访问可位于网络共享或本地的中央存储库中的文件。 安装程序将尝试加载unattend.xml中提供的驱动程序存储中的所有驱动程序,并将计划这些驱动程序注入到已安装的 OS 中。
启动 Windows 安装
可通过多种方法从 WinPE 启动操作系统安装,包括:
- 将安装包注入 boot.wim。
- 自定义 WinPE 可以修改为自动启动 Windows Setup.exe。
- 还可用于语言包和脚本支持。
- 从startnet.cmd或winpeshl.ini启动setup.exe。
- 定位 USB 摇杆/Hdd
- 启动 \path\setup.exe </开关>
- 自定义前端以替换cmd.exe(请参阅参考部分中的 Windows RE 链接)。
- 从常规 Windows 安装程序媒体启动,该媒体首先启动到 WinPE(Boot.wim),可以从附加的 USB 设备或网络存储获取输入。 本文未讨论此方法。
将驱动程序添加到 Windows 的方法
接下来,按照从安装到包含现装驱动程序的进度,有一些方法可用于在 Windows 中包含现装驱动程序:
- Dism.exe
Dism /get-wiminfo /wimfile:<pathto>Install.wim
Dism /mount-wim /wimfile:<pathto>Install.wim /index:n /mountdir:<pathto>mount
Dism /add-driver [and conversely /remove-driver] /image:<pathto>mount /driverpath:<pathto>driverINF
Dism /unmounts-wim /commit /mountdir:<pathto>mount
- \$WinPEDriver$
- 在无人参与安装期间运行脚本
- 在 WinPE 和审核模式下unattend.xml(驱动程序存储)(详细信息位于“引用和链接”部分)。
- Setupcomplete.cmd可用于驱动程序注入,但建议不要因为用户体验不佳,并可能导致首次启动桌面时出现延迟。
- Drvload.exe
- 仅将驱动程序注入当前正在运行的 OS,如果 WinPE 通常是 RAM 磁盘。
- Drvload <pathto。INF> (可在startnet.cmd编写脚本(请参阅示例)
注意
如果使用的驱动程序的名称与内置驱动程序(本机包含在映像中)相同,则启动操作系统不会使用这些新注入的驱动程序,并且应联系驱动程序制造商以获取更新的驱动程序。 (如果熟悉Windows 徽标工具包(WLK),请参阅 Devfund0005)
如果在 WinPE 传递(初始启动)期间加载驱动程序,则在操作系统重新启动之前,没有任何本机机制可以删除该驱动程序。
在将驱动程序添加到 Windows 的过程中,每个步骤都有多个方法。 这些方法为可扩展且可缩放的部署方案提供。 你需要确定以下哪种方法最适合给定的情况。
有关在 WinPE 中包含开箱即用驱动程序的详细说明
必要的设置/工具:
- 技术人员计算机 - 用于生成/操作安装介质的计算机
- 已安装 OPK/AIK
- USB/UFD 或 DVD
使用DISM.exe:
- 安装 OEM 预安装工具包(OPK)或 Windows 自动安装工具包(Windows AIK)
- 单击“启动>程序>Windows OPK”(或 Windows AIK)并打开“管理工具”命令提示符。
- 将 boot.wim 复制到硬盘驱动器(例如 c:\Bin)。 还可以使用 Copype.cmd 生成新的 WinPE;但是,如果不进行其他自定义,则不会自动启动setup.exe。
- 使用 DISM 标识 boot.wim 中的索引数。 如果要从安装介质复制 boot.wim,它将有两个索引。 通常,我们将修改索引 #2;否则为 index #1。
dism /get-wiminfo /wimfile:<wim_file>
注意
注入到一个索引的文件将不适用于其他索引。
- 创建“Mount”文件夹(例如 c:\Bin\mount)
- 使用 DISM 装载 wim。
DISM /mount-wim /wimfile:c:\bin\boot.wim /index:1 /mountdir:c:\bin\mount
- 将驱动程序置于可定位文件夹中(例如 c:\bin\driver)。
- 使用 DISM 将驱动程序添加到装载的 WIM 映像。
dism /image:c:\bin\mount /Add-Driver /driverpath:<path to INF>
- 通过检查 DISM 日志或确保 DISM 在命令提示符处返回完成来确认成功。
- 卸载并提交对 Boot.wim 的更改。 在运行此命令之前,请关闭所有打开的窗口,这些窗口可能在 c:\bin\mount 下打开(此外请确保命令提示符位于 c:\bin 目录结构或上方)。
dism /unmount-wim /mountdir:c:\bin\mount /commit
- 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 时执行以下操作之一:
- 运行脚本以:
- 标识安装介质(通常是 USB 设备)。
- 添加现装驱动程序
- 配置硬盘驱动器和恢复分区
- 根据需要启动setup.exe或应用 WIM。
- WIM 验证的部署/应用后,如果开发人员想要创建自己的工具来注入或操作驱动程序,DevCon.exe可能是一个有用的实用工具。 有关DevCon.exe的详细信息,请参阅“引用和链接”部分。
示例startnet.cmd
作为脚本/自动安装的方法,需要识别 USB 设备,因为这是其他驱动程序的位置。 此示例使用 WinPE 中的脚本,该脚本在启动时自动运行以检测 USB 驱动器。 此脚本启动另一个脚本,以在 WinPE 安装阶段使用Drvload.exe安装驱动程序。 该脚本位于 WIM 文件之外,因此可以轻松对其进行修改。
使用 WinPE Startnet.cmd识别安装媒体的方法(默认 WinPE 中启动的第一个文件):
首先,需要一种方法来自动识别 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 闪存设备上的指定位置。
将文件包含在startnet.cmd中使用的 boot.wim 中。 然后,这会将文件放入 X: 驱动器,通过 X:\<file name> 访问这些文件。 将文件添加到 boot.wim 时,这将增加 WIM 内存占用。
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。 但是,出于本文档的目的,不会讨论其他脚本详细信息。
此时,%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 站点下载文件。