在 Windows 10/11 ISO 镜像中同时注入 USB 4 驱动和 NVMe 驱动,并且 不仅要注入到 Windows 安装系统本体(install.wim),还要注入到 Windows PE(WinPE,通常是 boot.wim),这样在安装过程中,WinPE 阶段也能识别 NVMe 和 USB 4 硬件

使用时间线模型分析 Intel VMD(Intel Volume Management Device)有助于理解它的发展、演变以及在存储技术中的角色。时间线模型将帮助我们从技术发展的角度清晰地追溯 Intel VMD 的各个关键节点、技术演变及其对 NVMe 存储管理的影响。

Intel VMD 时间线模型分析

1. 起源阶段:早期的 NVMe 和 PCIe 存储(2010s)

  • 2011年: NVMe(Non-Volatile Memory Express)标准发布。

    • NVMe 是一个设计用于通过 PCI Express(PCIe)总线访问固态硬盘(SSD)的协议,旨在解决传统 SATA 接口带宽和延迟限制。
    • NVMe 的出现标志着存储行业向高速 SSD 和 PCIe 存储过渡的开始。
  • 2012-2014年: 第一代 PCIe 控制器和 SSD 出现。

    • 随着 SSD 和 PCIe 存储设备的流行,性能提升成为焦点,数据中心和高性能计算(HPC)系统开始大规模部署 NVMe SSD。

2. Intel VMD 的推出与发展(2017-2020)

  • 2017年: Intel VMD 技术的初次亮相。

    • Intel VMD 是 Intel 的存储技术解决方案,旨在增强 NVMe SSD 的管理功能,尤其是在使用多个 NVMe 驱动器时。VMD 允许通过一组控制器集中管理多个存储设备,从而简化和优化存储管理。
    • VMD 在硬件层面提供支持,使得系统能够更好地管理 PCIe NVMe 存储设备,提供更高效的资源分配和设备初始化。
  • 2019年: VMD 成为高端 Intel 芯片组(如 Intel Xeon 系列)的一部分。

    • 在 2019 年,Intel 推出了带有 VMD 支持的更高端服务器芯片组,特别是面向企业和数据中心市场的 Intel Xeon 可扩展处理器。
    • VMD 技术帮助更好地支持多驱动器配置,减少延迟并提升稳定性,特别是在高端服务器和存储解决方案中。

3. Intel VMD 的扩展与普及(2020-2023)

  • 2020年: VMD 集成到更多 Intel 平台中,特别是 10nm 处理器架构。

    • 随着 Intel 11 代及后续平台的推出,Intel VMD 成为支持 NVMe 存储的关键技术。
    • 在此阶段,VMD 的应用范围不仅限于服务器领域,部分高端消费级平台(如 Intel Core 系列)也开始支持 VMD 功能,尤其是针对存储密集型应用(例如 3D 渲染、大数据处理等)。
  • 2021年: VMD 与 PCIe 4.0 的结合。

    • 随着 PCIe 4.0 的普及,VMD 技术的带宽和性能要求得到进一步提升。PCIe 4.0 提供的双倍带宽支持了更多高速 NVMe 驱动器的并行工作。
    • 对于数据中心和企业级存储设备,VMD 成为支持更高并发性能、减少延迟的关键组成部分。

4. 当前及未来发展(2023+)

  • 2023年: Intel VMD 技术持续优化并与 PCIe 5.0 兼容。

    • PCIe 5.0 的发布为存储带来了更大的带宽和更低的延迟,进一步增强了 VMD 对 NVMe 存储的支持。
    • 未来,随着 Intel VMD 的持续更新,预计它将在高端服务器、存储阵列以及超级计算应用中发挥更大的作用,特别是在需要大规模存储和高速 I/O 性能的环境中。
  • 未来发展:

    • 支持更多存储协议: Intel VMD 可能会扩展支持其他存储协议或与其他硬件架构(如 ARM)兼容,以增强其在数据中心和超大规模计算环境中的作用。
    • 智能化管理: Intel VMD 可能集成更多智能化存储管理功能,如动态负载均衡、高级故障检测和自愈功能。

Intel VMD 技术的发展历程体现了存储和 NVMe 控制技术的不断进化。从最初的 NVMe 标准发布到 Intel VMD 技术的推出,再到与更高带宽的 PCIe 4.0 和 PCIe 5.0 配合,Intel VMD 逐步解决了多驱动器配置和存储管理的问题,为大规模存储系统提供了更高效、稳定的解决方案。随着技术的发展,Intel VMD 在企业级应用、数据中心和高性能计算领域的影响力将持续增强,未来可能会进一步支持多种存储协议,并提高智能化管理能力。


 


Intel VMD(Intel Volume Management Device)是一个硬件控制器,用于通过 PCIe(外围组件互联快车)总线管理存储设备,尤其是在支持 NVMe 存储设备的系统中。Intel VMD 驱动程序是与这些设备通信的关键,特别是在使用 Intel 芯片组并需要通过 PCIe 设备进行 NVMe 存储管理时。

如果你要将 Intel VMD 驱动程序注入到 Windows 安装镜像(例如,boot.wiminstall.wim),可以按照以下步骤操作:

1. 下载 Intel VMD 驱动程序

首先,你需要下载适用于你的硬件平台的 Intel VMD 驱动程序。通常可以从 Intel 官方网站或者主板制造商的支持页面找到适合的驱动程序。

2. 了解驱动程序文件

Intel VMD 驱动程序可能以 .inf 文件格式提供,这是 Windows 驱动程序安装的标准格式。你需要确定你下载的驱动程序包含 .inf 文件,并且该驱动程序适用于 NVMe 控制器。

3. 注入驱动程序到 Windows 安装镜像(boot.wim 和 install.wim)

如果你已经准备好 Intel VMD 驱动程序文件,接下来的步骤就是将驱动程序注入到 Windows 的镜像文件中。可以使用 DISM 工具进行操作,下面是一个 PowerShell 脚本,它会将 Intel VMD 驱动程序注入到 boot.wiminstall.wim 文件中:

PowerShell 脚本:注入 Intel VMD 驱动程序

powershell
# 设置变量
$isoPath = "C:\path\to\your\Windows.iso"   # 设置你的 Windows ISO 文件路径
$usbDriveLetter = "E:"                      # 设置你的 USB 驱动器字母
$intelVmdDriverPath = "C:\path\to\intel_vmd_driver"  # 设置 Intel VMD 驱动程序路径

# 挂载 ISO 文件
Write-Host "挂载 ISO 文件..."
Mount-DiskImage -ImagePath $isoPath

# 获取挂载的 ISO 驱动器号
$isoDriveLetter = (Get-DiskImage -ImagePath $isoPath | Get-Volume).DriveLetter
$isoPath = "$($isoDriveLetter):\"

# 获取 boot.wim 和 install.wim 的路径
$bootWimPath = "$isoPath\sources\boot.wim"
$installWimPath = "$isoPath\sources\install.wim"

# 创建临时目录用于挂载
$mountDirBoot = "C:\mount\boot"
$mountDirInstall = "C:\mount\install"
New-Item -ItemType Directory -Force -Path $mountDirBoot
New-Item -ItemType Directory -Force -Path $mountDirInstall

# 挂载 boot.wim 文件
Write-Host "挂载 boot.wim..."
Dism /Mount-Wim /WimFile:$bootWimPath /index:1 /MountDir:$mountDirBoot

# 挂载 install.wim 文件
Write-Host "挂载 install.wim..."
Dism /Mount-Wim /WimFile:$installWimPath /index:1 /MountDir:$mountDirInstall

# 添加 Intel VMD 驱动到 boot.wim 和 install.wim
Write-Host "注入 Intel VMD 驱动程序..."

# 注入 Intel VMD 驱动到 boot.wim
Dism /Image:$mountDirBoot /Add-Driver /Driver:$intelVmdDriverPath /Recurse

# 注入 Intel VMD 驱动到 install.wim
Dism /Image:$mountDirInstall /Add-Driver /Driver:$intelVmdDriverPath /Recurse

# 提交更改并卸载
Write-Host "提交更改并卸载镜像..."

# 提交 boot.wim 更改
Dism /Unmount-Wim /MountDir:$mountDirBoot /Commit

# 提交 install.wim 更改
Dism /Unmount-Wim /MountDir:$mountDirInstall /Commit

# 清理临时目录
Remove-Item -Recurse -Force $mountDirBoot
Remove-Item -Recurse -Force $mountDirInstall

# 完成
Write-Host "Intel VMD 驱动程序成功注入到 boot.wim 和 install.wim。"

# 拷贝文件到 USB 驱动器
Write-Host "拷贝文件到 USB 驱动器..."
Copy-Item "$isoPath\*" -Recurse -Destination $usbDriveLetter

Write-Host "操作完成!"

解释:

  • $isoPath: 这是 Windows ISO 文件的路径,需要修改为你自己 ISO 文件的路径。
  • $usbDriveLetter: 这是你想要将 Windows 系统安装到的 USB 驱动器的盘符。
  • $intelVmdDriverPath: 这是 Intel VMD 驱动程序文件的路径,通常是 .inf 文件所在的目录。

4. 使用脚本的步骤:

  1. 准备工作

    • 下载并解压你的 Intel VMD 驱动程序,确保它包括 .inf 文件。
    • 获取 Windows ISO 文件路径。
    • 设置 USB 驱动器的盘符。
  2. 执行脚本

    • 打开 PowerShell,并以管理员身份运行。
    • 将上述脚本复制并粘贴到 PowerShell 窗口中。
    • 运行脚本后,它将自动挂载 boot.wim 和 install.wim 文件,并注入 Intel VMD 驱动程序。
  3. 完成

    • 驱动程序将被注入到镜像中,之后可以将修改后的 ISO 文件内容复制到 USB 驱动器,准备好进行安装。

小贴士:

  • 请确保你的 NVMe 硬盘支持 Intel VMD 技术,并且你下载的驱动程序与硬件兼容。
  • 在安装过程中,如果你的系统没有自动识别硬盘,可能需要使用 F6 加载驱动程序,或者在 BIOS 中启用相应的 NVMe 设置。

这样,你就能够成功地将 Intel VMD 驱动程序注入到 Windows 安装镜像中。


Windows 10/11 ISO 镜像中同时注入 USB 4 驱动和 NVMe 驱动,并且 不仅要注入到 Windows 安装系统本体(install.wim),还要注入到 Windows PE(WinPE,通常是 boot.wim),这样在安装过程中,WinPE 阶段也能识别 NVMe 和 USB 4 硬件。下面我给你整理一个完整、可操作的流程:


1. 准备工作

  1. 下载 ISO 镜像并解压:

    • 使用 7-Zip 或其他工具,将 ISO 解压到 C:\WinISO
    • ISO 中主要涉及两个 WIM 文件:
      • sources\boot.wim → WinPE 镜像,用于安装启动环境
      • sources\install.wim → Windows 系统本体
  2. 准备驱动:

    • USB 4 驱动 → 例如 C:\Drivers\USB4
    • NVMe 驱动 → 例如 C:\Drivers\NVMe
    • 确保是 .inf 驱动,并且文件夹中包含所有必需的 .sys.cat 文件。

2. 挂载 WIM 镜像

你需要分别挂载 boot.wim 和 install.wim。

2.1 创建挂载目录

cmd
mkdir C:\mount\boot
mkdir C:\mount\install

2.2 挂载 boot.wim

cmd
dism /Mount-Wim /WimFile:C:\WinISO\sources\boot.wim /index:1 /MountDir:C:\mount\boot

注意:boot.wim 通常有两个索引(Index 1 和 2),分别对应 WinPE x86 和 x64,如果你安装的是 x64 系统,一般修改 index 2。

2.3 挂载 install.wim

cmd
dism /Mount-Wim /WimFile:C:\WinISO\sources\install.wim /index:1 /MountDir:C:\mount\install

如果 install.wim 中有多个版本(Home/Pro/Enterprise),选择你要修改的版本对应的 index。


3. 注入驱动

使用 DISM 的 /Add-Driver 参数,将驱动注入挂载的镜像。

3.1 注入到 WinPE (boot.wim)

cmd
dism /Image:C:\mount\boot /Add-Driver /Driver:C:\Drivers\USB4 /Recurse
dism /Image:C:\mount\boot /Add-Driver /Driver:C:\Drivers\NVMe /Recurse

3.2 注入到系统 (install.wim)

cmd
dism /Image:C:\mount\install /Add-Driver /Driver:C:\Drivers\USB4 /Recurse
dism /Image:C:\mount\install /Add-Driver /Driver:C:\Drivers\NVMe /Recurse

4. 卸载并保存修改

4.1 卸载 boot.wim

cmd
dism /Unmount-Wim /MountDir:C:\mount\boot /Commit

4.2 卸载 install.wim

cmd
dism /Unmount-Wim /MountDir:C:\mount\install /Commit

5. 重新生成 ISO

使用 oscdimg 或其他工具重建 ISO:

cmd
oscdimg -bC:\WinISO\boot\etfsboot.com -u2 -m -o -lWIN10ISO C:\WinISO C:\Win10_Custom.iso

参数说明:

  • -b → 指定启动扇区文件(bootable)
  • -u2 → 使用 UDF 文件系统
  • -m → 忽略最大文件大小限制
  • -o → 压缩文件路径
  • -l → ISO 标签

6. 注意事项

  1. boot.wim 的 Index

    • x64 WinPE 系统通常是 Index 2,如果你只注入 Index 1,启动安装可能无法识别硬件。
    • 可以先用 dism /Get-WimInfo /WimFile:C:\WinISO\sources\boot.wim 查看索引。
  2. 驱动签名

    • Windows 安装镜像要求驱动是签名的,否则 WinPE 可能无法加载驱动。
  3. USB 4 驱动

    • 对于最新的 Intel/AMD USB 4 控制器,有时需要在 WinPE 阶段预加载,否则安装程序可能无法识别 USB 设备。

 


在 ISO 镜像中注入 USB 4 驱动和 NVMe 驱动,您需要执行以下步骤:

准备驱动程序:首先,您需要获得所需的 USB 4 驱动和 NVMe 驱动的适当版本。这些驱动程序通常由硬件制造商提供,您可以从他们的官方网站或支持页面下载相应的驱动程序。

解压 ISO 镜像:使用适当的工具(如 PowerISO、UltraISO 等),打开 ISO 镜像文件并将其内容解压到一个临时目录。

定位驱动注入点:在解压后的 ISO 镜像文件夹中,找到包含 Windows 安装文件的文件夹,通常是 "Sources" 文件夹。

注入 USB 4 驱动和 NVMe 驱动:将下载的 USB 4 驱动和 NVMe 驱动复制到 "Sources" 文件夹。确保使用与您正在安装的 Windows 版本兼容的驱动程序。

更新和保存 ISO 镜像:使用相同的工具打开原始的 ISO 镜像文件,并将 "Sources" 文件夹中更新后的内容重新压缩到 ISO 镜像中。

创建可引导的 USB 安装介质:使用工具(如 Rufus、Windows USB/DVD Download Tool 等),将更新后的 ISO 镜像写入 USB 闪存驱动器中,以创建可引导的 USB 安装介质。

安装 Windows:使用创建的 USB 安装介质启动目标计算机,并按照常规方法安装 Windows。安装程序应该能够识别并加载 USB 4 驱动和 NVMe 驱动。

请注意,以上步骤是一般的指导,具体步骤可能会因个人需求、Windows 版本和硬件配置而有所不同。在执行上述步骤之前,建议您备份重要数据,并仔细阅读相关驱动程序和 ISO 镜像的文档和支持资料。

此外,某些 Windows 版本可能支持将驱动程序打包为 Windows 安装文件(如 .inf 文件)进行自动安装。您可以在制作自定义安装包时使用这些功能。

将驱动程序打包为 Windows 安装文件(.inf 文件)可以实现自动安装,以下是一般的步骤:

获取驱动程序:从硬件制造商官方网站或支持页面下载所需的驱动程序。确保选择与您的硬件和操作系统版本兼容的驱动程序。

解压驱动程序:将下载的驱动程序解压到一个临时目录,以便后续处理。

创建驱动程序信息文件(.inf 文件):使用文本编辑器(如Notepad++)创建一个新的文本文件,并将其保存为 .inf 文件。这个文件将包含有关驱动程序的信息,例如设备名称、硬件ID等。请参考 Windows 驱动程序开发工具包(Windows Driver Kit)的相关文档,了解正确的 .inf 文件结构和内容格式。

编辑 .inf 文件:在 .inf 文件中添加必要的驱动程序信息和配置。这可能包括设置设备属性、指定驱动程序文件路径等。

将驱动程序文件复制到指定位置:将驱动程序文件(.sys、.dll 等)复制到指定位置,以便安装程序能够访问它们。通常,这涉及将驱动程序文件复制到某个系统目录(如 System32 或 Drivers 文件夹)。

安装驱动程序:创建一个批处理脚本或使用其他自动化工具,以在安装过程中使用 .inf 文件安装驱动程序。您可以使用 Windows 命令行工具(如 Devcon)或其他第三方工具来执行安装操作。

测试驱动程序安装:使用自动化脚本或手动方法测试驱动程序的安装和功能。确保驱动程序正确安装,并且设备能够正常工作。

请注意,上述步骤是一般的指导,具体步骤可能会因驱动程序和设备类型而有所不同。建议您参考相关的驱动程序开发工具包和文档,了解更多详细信息和最佳实践。

此外,微软提供的工具集(如 Windows Driver Kit、DISM 工具等)可以帮助您创建和安装驱动程序。这些工具提供了更多高级选项和功能,可以满足更复杂的驱动程序部署需求。


一个可直接运行的批处理脚本(.bat),用于在 Windows 10 / 11 的 ISO 中 一次性注入 USB4 驱动 和 NVMe 驱动,并把驱动注入到 boot.wim(WinPE)和 install.wim(系统) 的所有索引(index)中,最后重建 ISO。脚本带有基本的错误检查、管理员权限检测、日志记录和备份步骤。请按说明准备好驱动和工具后直接运行。

重要说明(运行前请读)

  • 驱动文件夹必须包含 .inf(以及 .sys.cat 等)文件,且结构正确。脚本使用 DISM 的 /Add-Driver /Recurse
  • oscdimg 用于重建 ISO;若未安装 Windows ADK(含 oscdimg),请安装或用你常用的 ISO 制作工具并修改脚本中重建 ISO 的部分。
  • 请在管理员权限下运行脚本(脚本会尝试自我提升)。
  • 建议先对原始 ISO 做完整备份(脚本会尝试自动备份解包目录)。
  • 若 boot.wim 有多个 index(通常有 2 个:x86/x64),脚本会为所有 index 注入驱动。install.wim 若包含多个 edition,也会为每个 index 注入驱动。
  • 驱动如为未签名,在目标机器上安装时可能需要禁用驱动签名强制或采用测试签名环境。

保存为 InjectDriversToISO.bat,在管理员模式下运行(双击可能会提示提升):

bat
@echo off
setlocal EnableDelayedExpansion

:: ----------------------
:: Configuration (可修改)
:: ----------------------
:: 源 ISO 文件路径(可直接改为 ISO 文件),或已解压的 ISO 文件夹(优先使用已解压目录)
set "SOURCE_ISO=C:\ISOs\Windows_Custom.iso"
:: 如果你已经解压 ISO 到文件夹,改为该文件夹路径并把 SOURCE_ISO 留空
set "SOURCE_ISO_FOLDER="

:: 临时工作目录(脚本会在此创建解包目录)
set "WORKDIR=%~dp0WinISOTemp"
set "MOUNTDIR=%WORKDIR%\mount"
set "MOUNT_BOOT=%MOUNTDIR%\boot"
set "MOUNT_INSTALL=%MOUNTDIR%\install"
set "EXTRACTDIR=%WORKDIR%\extracted_iso"
set "BACKUPDIR=%WORKDIR%\backup"

:: 驱动文件夹(可以是包含两个子文件夹的父文件夹,脚本会递归注入所有 .inf)
set "DRIVERS_DIR=C:\Drivers"

:: oscdimg 完整路径(如已在 PATH 则只需写 oscdimg.exe)
set "OSCDIMG_PATH=oscdimg.exe"

:: 输出 ISO 名称
set "OUTPUT_ISO=%~dp0Windows_Custom_DriversInjected.iso"

:: 日志
set "LOG=%WORKDIR%\inject_log.txt"
:: ----------------------
:: End config
:: ----------------------

:: Ensure admin
>nul 2>&1 "%SystemRoot%\system32\cacls.exe" "%SystemRoot%\system32\config\system"
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
    exit /b
)

:: Prepare directories
if exist "%WORKDIR%" (
    echo Removing previous workdir...
    rmdir /s /q "%WORKDIR%"
)
mkdir "%WORKDIR%" 2>nul
mkdir "%EXTRACTDIR%" 2>nul
mkdir "%MOUNTDIR%" 2>nul
mkdir "%MOUNT_BOOT%" 2>nul
mkdir "%MOUNT_INSTALL%" 2>nul
mkdir "%BACKUPDIR%" 2>nul

echo Log started at %date% %time% > "%LOG%"

:: If SOURCE_ISO_FOLDER provided, copy to work area; else extract ISO
if not "%SOURCE_ISO_FOLDER%"=="" (
    echo Using provided extracted ISO folder: %SOURCE_ISO_FOLDER% >> "%LOG%"
    echo Copying ISO folder to workdir...
    xcopy /e /h /k /y "%SOURCE_ISO_FOLDER%\*" "%EXTRACTDIR%\" >> "%LOG%" 2>&1
) else (
    if not exist "%SOURCE_ISO%" (
        echo ERROR: SOURCE_ISO not found: %SOURCE_ISO% >> "%LOG%"
        echo ERROR: SOURCE_ISO not found: %SOURCE_ISO%
        exit /b 1
    )
    echo Extracting ISO "%SOURCE_ISO%" to working folder... >> "%LOG%"
    :: Use 7z if available, else try mounting and copying
    where 7z >nul 2>&1
    if %errorlevel%==0 (
        echo Using 7z to extract...
        7z x "%SOURCE_ISO%" -o"%EXTRACTDIR%" >> "%LOG%" 2>&1
    ) else (
        echo 7z not found. Trying PowerShell Mount-DiskImage + copy (requires admin)...
        powershell -Command "Mount-DiskImage -ImagePath '%SOURCE_ISO%'"
        :: find mounted drive letter
        for /f "tokens=2 delims=:" %%D in ('powershell -Command "(Get-DiskImage -ImagePath ''%SOURCE_ISO%'').DevicePath"') do set "tmpdev=%%D"
        :: fallback: ask user to mount manually
        echo If automatic mount failed, please mount the ISO manually and cd to mounted drive to copy files. >> "%LOG%"
        echo Copying files from mounted ISO to %EXTRACTDIR%...
        :: try to detect drive letter
        for %%L in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
            if exist "%%L:\sources\boot.wim" (
                echo Found ISO mounted at %%L: >> "%LOG%"
                xcopy /e /h /k /y "%%L:\*" "%EXTRACTDIR%\" >> "%LOG%" 2>&1
                goto extracted
            )
        )
        echo Could not find mounted ISO. Please mount ISO and re-run. >> "%LOG%"
        echo Could not find mounted ISO. Please mount ISO and re-run.
        exit /b 1
        :extracted
        powershell -Command "Dismount-DiskImage -ImagePath '%SOURCE_ISO%'" >> "%LOG%" 2>&1
    )
)

:: Make backups of original WIMs
if exist "%EXTRACTDIR%\sources\boot.wim" (
    copy "%EXTRACTDIR%\sources\boot.wim" "%BACKUPDIR%\boot.wim.bak" /Y >> "%LOG%" 2>&1
) else (
    echo ERROR: boot.wim not found in extracted ISO >> "%LOG%"
    echo ERROR: boot.wim not found in extracted ISO
    exit /b 1
)
if exist "%EXTRACTDIR%\sources\install.wim" (
    copy "%EXTRACTDIR%\sources\install.wim" "%BACKUPDIR%\install.wim.bak" /Y >> "%LOG%" 2>&1
) else (
    echo ERROR: install.wim not found in extracted ISO >> "%LOG%"
    echo ERROR: install.wim not found in extracted ISO
    exit /b 1
)

:: Helper: get wim info and loop indices
echo Querying boot.wim indexes... >> "%LOG%"
for /f "tokens=*" %%I in ('dism /Get-WimInfo /WimFile:"%EXTRACTDIR%\sources\boot.wim" ^| findstr /R /C:"Index : [0-9]"') do (
    for /f "tokens=3" %%a in ("%%I") do (
        echo Found boot.wim index %%a >> "%LOG%"
        set "BOOT_INDEXES=!BOOT_INDEXES! %%a"
    )
)
echo Querying install.wim indexes... >> "%LOG%"
for /f "tokens=*" %%I in ('dism /Get-WimInfo /WimFile:"%EXTRACTDIR%\sources\install.wim" ^| findstr /R /C:"Index : [0-9]"') do (
    for /f "tokens=3" %%a in ("%%I") do (
        echo Found install.wim index %%a >> "%LOG%"
        set "INSTALL_INDEXES=!INSTALL_INDEXES! %%a"
    )
)

echo Boot indexes: %BOOT_INDEXES% >> "%LOG%"
echo Install indexes: %INSTALL_INDEXES% >> "%LOG%"

:: Function-like: Mount each index and add drivers
:: Mount and inject for boot.wim
for %%i in (%BOOT_INDEXES%) do (
    echo Mounting boot.wim index %%i ... >> "%LOG%"
    rmdir /s /q "%MOUNT_BOOT%" 2>nul
    mkdir "%MOUNT_BOOT%" 2>nul
    dism /Mount-Wim /WimFile:"%EXTRACTDIR%\sources\boot.wim" /index:%%i /MountDir:"%MOUNT_BOOT%" >> "%LOG%" 2>&1
    if %errorlevel% NEQ 0 (
        echo ERROR mounting boot.wim index %%i >> "%LOG%"
        echo ERROR mounting boot.wim index %%i
        goto :cleanup
    )
    echo Adding drivers from %DRIVERS_DIR% into boot.wim index %%i ... >> "%LOG%"
    dism /Image:"%MOUNT_BOOT%" /Add-Driver /Driver:"%DRIVERS_DIR%" /Recurse >> "%LOG%" 2>&1
    if %errorlevel% NEQ 0 (
        echo WARNING: DISM returned error while adding drivers to boot.wim index %%i (check log). >> "%LOG%"
    )
    echo Committing boot.wim index %%i ... >> "%LOG%"
    dism /Unmount-Wim /MountDir:"%MOUNT_BOOT%" /Commit >> "%LOG%" 2>&1
    if %errorlevel% NEQ 0 (
        echo ERROR committing boot.wim index %%i >> "%LOG%"
        goto :cleanup
    )
)

:: Mount and inject for install.wim
for %%i in (%INSTALL_INDEXES%) do (
    echo Mounting install.wim index %%i ... >> "%LOG%"
    rmdir /s /q "%MOUNT_INSTALL%" 2>nul
    mkdir "%MOUNT_INSTALL%" 2>nul
    dism /Mount-Wim /WimFile:"%EXTRACTDIR%\sources\install.wim" /index:%%i /MountDir:"%MOUNT_INSTALL%" >> "%LOG%" 2>&1
    if %errorlevel% NEQ 0 (
        echo ERROR mounting install.wim index %%i >> "%LOG%"
        echo ERROR mounting install.wim index %%i
        goto :cleanup
    )
    echo Adding drivers from %DRIVERS_DIR% into install.wim index %%i ... >> "%LOG%"
    dism /Image:"%MOUNT_INSTALL%" /Add-Driver /Driver:"%DRIVERS_DIR%" /Recurse >> "%LOG%" 2>&1
    if %errorlevel% NEQ 0 (
        echo WARNING: DISM returned error while adding drivers to install.wim index %%i (check log). >> "%LOG%"
    )
    echo Committing install.wim index %%i ... >> "%LOG%"
    dism /Unmount-Wim /MountDir:"%MOUNT_INSTALL%" /Commit >> "%LOG%" 2>&1
    if %errorlevel% NEQ 0 (
        echo ERROR committing install.wim index %%i >> "%LOG%"
        goto :cleanup
    )
)

:: Rebuild ISO
echo Rebuilding ISO to "%OUTPUT_ISO%" ... >> "%LOG%"
:: Ensure boot\etfsboot.com exists - typical for Windows ISO
if exist "%EXTRACTDIR%\boot\etfsboot.com" (
    "%OSCDIMG_PATH%" -b"%EXTRACTDIR%\boot\etfsboot.com" -u2 -m -o -lWIN_CUSTOM "%EXTRACTDIR%" "%OUTPUT_ISO%" >> "%LOG%" 2>&1
) else (
    echo Warning: etfsboot.com not found. Trying alternate oscdimg command... >> "%LOG%"
    "%OSCDIMG_PATH%" -u2 -m -o -lWIN_CUSTOM "%EXTRACTDIR%" "%OUTPUT_ISO%" >> "%LOG%" 2>&1
)
if %errorlevel% NEQ 0 (
    echo ERROR: oscdimg failed. Check that oscdimg is installed and in PATH or adjust OSCDIMG_PATH in the script. >> "%LOG%"
    echo ERROR: oscdimg failed. Check %LOG%
    goto :cleanup
)

echo Done. Output ISO: %OUTPUT_ISO%
echo Done. See log: %LOG%

goto :end

:cleanup
echo Cleaning up (attempting to unmount any mounted WIMs) >> "%LOG%"
:: try to unmount without commit to avoid corruption if an error occurred
dism /Unmount-Wim /MountDir:"%MOUNT_BOOT%" /Discard >> "%LOG%" 2>&1
dism /Unmount-Wim /MountDir:"%MOUNT_INSTALL%" /Discard >> "%LOG%" 2>&1
echo Cleanup done. Check log: %LOG%
exit /b 1

:end
endlocal
exit /b 0

运行/使用步骤(快速参考)

  1. 把脚本保存为 InjectDriversToISO.bat
  2. 修改脚本开头的配置项:
    • SOURCE_ISO 指向你的 ISO 文件,或把 SOURCE_ISO_FOLDER 指向已解压的 ISO 文件夹(两者选其一)。
    • DRIVERS_DIR 指向包含 USB4 和 NVMe 驱动的目录(可把两个驱动放同一父文件夹,脚本会递归查找 .inf)。
    • 如 oscdimg.exe 未加入 PATH,写入其完整路径(通常安装 Windows ADK 后可找到)。
  3. 以管理员权限双击运行脚本。
  4. 完成后在脚本同目录会生成 Windows_Custom_DriversInjected.iso(或按你设定的 OUTPUT_ISO 路径)。同时查看 inject_log.txt 获取详细执行日志。

常见问题 & 建议

  • 如果 dism /Add-Driver 报错,先尝试把驱动目录拆分为单个驱动逐个注入,检查 .inf 中的 Class 和 Provider 信息。
  • boot.wim 的 Index 2(通常 x64) 一定要注入(某些 ISO index 位置不同),脚本会自动处理所有 index。
  • 若目标机器为新平台(特别是非常新的 NVMe 控制器或 USB4 控制器),请确保驱动是制造商官方最新版本并且为 WHQL 签名。
  • 若你用的是 install.esd(而不是 install.wim),请先把 ESD 转换为 WIM,或调整脚本使用 DISM 导出/转换步骤(如需我可以再给出 esd->wim 的脚本)。

如果你要我:

  • 把脚本改为 PowerShell 版本(更强的错误处理和灵活性),或者
  • 添加 ESD 支持(自动识别 install.esd 并转换为 WIM 后再注入),或者
  • 为你 生成只注入特定 index(例如只注入 boot.wim index 2 和 install.wim 的 Pro 版本 index),

创建一个 PowerShell 脚本,可以将 Windows 10 或 Windows 11 ISO 注入 USB 驱动器的过程中,将 boot.wiminstall.wim 文件修改以支持 USB 4 和 NVMe 驱动器的驱动,您可以使用以下步骤。

  1. 准备工作:

    • 确保您已经下载了 Windows 10 或 Windows 11 ISO 文件。
    • 确保您的系统已安装 DISM(部署映像服务与管理工具)和 Mount-DiskImage
    • 下载并解压 NVMe 驱动程序,并将其路径记住,或者确保驱动程序已包含在 ISO 中。
  2. PowerShell 脚本内容: 该脚本将会:

    • 挂载 boot.wim 和 install.wim 文件。
    • 将所需的 NVMe 驱动程序注入到这些镜像中。
    • 使用 dism 工具进行操作。
powershell
# 设置变量
$isoPath = "C:\path\to\your\Windows.iso"   # 设置你的 Windows ISO 文件路径
$usbDriveLetter = "E:"                      # 设置你的 USB 驱动器字母
$nvmeDriverPath = "C:\path\to\nvme_driver"  # 设置 NVMe 驱动程序路径

# 挂载 ISO 文件
Write-Host "挂载 ISO 文件..."
Mount-DiskImage -ImagePath $isoPath

# 获取挂载的 ISO 驱动器号
$isoDriveLetter = (Get-DiskImage -ImagePath $isoPath | Get-Volume).DriveLetter
$isoPath = "$($isoDriveLetter):\"

# 获取 boot.wim 和 install.wim 的路径
$bootWimPath = "$isoPath\sources\boot.wim"
$installWimPath = "$isoPath\sources\install.wim"

# 创建临时目录用于挂载
$mountDirBoot = "C:\mount\boot"
$mountDirInstall = "C:\mount\install"
New-Item -ItemType Directory -Force -Path $mountDirBoot
New-Item -ItemType Directory -Force -Path $mountDirInstall

# 挂载 boot.wim 文件
Write-Host "挂载 boot.wim..."
Dism /Mount-Wim /WimFile:$bootWimPath /index:1 /MountDir:$mountDirBoot

# 挂载 install.wim 文件
Write-Host "挂载 install.wim..."
Dism /Mount-Wim /WimFile:$installWimPath /index:1 /MountDir:$mountDirInstall

# 添加 NVMe 驱动到 boot.wim 和 install.wim
Write-Host "注入 NVMe 驱动程序..."

# 注入 NVMe 驱动到 boot.wim
Dism /Image:$mountDirBoot /Add-Driver /Driver:$nvmeDriverPath /Recurse

# 注入 NVMe 驱动到 install.wim
Dism /Image:$mountDirInstall /Add-Driver /Driver:$nvmeDriverPath /Recurse

# 提交更改并卸载
Write-Host "提交更改并卸载镜像..."

# 提交 boot.wim 更改
Dism /Unmount-Wim /MountDir:$mountDirBoot /Commit

# 提交 install.wim 更改
Dism /Unmount-Wim /MountDir:$mountDirInstall /Commit

# 清理临时目录
Remove-Item -Recurse -Force $mountDirBoot
Remove-Item -Recurse -Force $mountDirInstall

# 完成
Write-Host "NVMe 驱动程序成功注入到 boot.wim 和 install.wim。"

# 拷贝文件到 USB 驱动器
Write-Host "拷贝文件到 USB 驱动器..."
Copy-Item "$isoPath\*" -Recurse -Destination $usbDriveLetter

Write-Host "操作完成!"

说明:

  • $isoPath: 您的 Windows 10/11 ISO 文件的路径。
  • $usbDriveLetter: USB 驱动器的盘符。请根据实际情况修改。
  • $nvmeDriverPath: NVMe 驱动程序所在的文件夹路径。
  • 脚本会通过 DISM 工具将 NVMe 驱动程序注入到 boot.wim 和 install.wim 文件。
  • 最后,脚本会将修改后的 ISO 文件内容复制到 USB 驱动器。

注意事项:

  • 请确保在操作之前备份您的数据,以防止意外丢失。
  • 脚本中使用的驱动程序路径需要是正确的,且驱动程序应支持您的硬件。
  • 如果您需要注入多个驱动程序,您可以修改脚本中的驱动路径,或者将多个驱动文件夹路径传递给 Add-Driver 命令。

 

posted @ 2023-06-23 14:35  suv789  阅读(2992)  评论(0)    收藏  举报