WinPE中需要配置语言支持中文,否则在后面显示中文的时候会出现乱码问题。
执行以下命令添加中文支持
添加中文语言包
dism /Add-Package /Image:E:\Win10PE\media\sources\boot /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation
Environment\amd64\WinPE_OCs\zh-cn\lp.cab"
dism /Add-Package /Image:E:\Win10PE\media\sources\boot /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation
Environment\amd64\WinPE_OCs\zh-cn\WinPE-HTA_zh-cn.cab"
添加中文字体包
dism /Add-Package /Image:E:\Win10PE\media\sources\boot /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation
Environment\amd64\WinPE_OCs\WinPE-FontSupport-ZH-CN.cab"
区域设置更改为使用中文
dism /Set-AllIntl:zh-CN /Image:"E:\Win10PE\media\sources\boot"
安装完成后,查看winpe中安装的包,语言包已经安装成功。
修改WinPE启动后调用程序默认情况下,Winpeshl.exe 是 Windows PE 启动时运行的第一个进程。Winpeshl.exe 在System32下搜索名为 Winpeshl.ini 的文件。Winpeshl.ini 可以控制是否将自定义shell程序加载到 Windows PE而不是默认的“命令提示符”窗口。 如果该文件不存在,Winpeshl.exe 会启动一个执行 Startnet.cmd 脚本的 Cmd.exe 进程。 如果 Winpeshl.ini 存在并且包含要启动的应用,则会执行这些应用而不是 Cmd.exe2。
ADK中的boot.wim挂载后,在 E:\Win10PE\media\sources\boot\Windows\System32 目录下没有 Winpeshl.ini 文件,需要手动创建,注意编码格式为utf8。
Winpeshl.ini的用法可以参考官方文档:Winpeshl.ini 参考:启动 WinPE 时启动应用
因为我只需要加载一个应用,所以在Winpeshl.ini中仅设置[LaunchApp]这一个条目就够了。CustomSetup.exe是我写的安装程序。
Winpeshl.ini 文件内容:
[LaunchApp]
AppPath = %SYSTEMDRIVE%\Program Files\Custom\CustomSetup.exe
开发 Windows 安装程序
Windows PE 包含非常多的功能支持(Windows PE 功能支持),安装程序的实现主要用到 "Windows 应用程序编程接口(API)" 和 "映像管理和维护(DISM)工具"。
这里的 Windows 安装程序主要适用于执行自定义安装,也就是干净安装。这个阶段包含两个最基本的操作,一个是配置磁盘(分区和格式化)。另外一个就是将 Windows 的映像复制到磁盘。此外,还可以添加接受License以及一些其他的配置,为用户提供更丰富的控制接口。
我将在安装程序中实现这两个最基本的操作。因为是在 Windows PE 环境下执行,所以采用基本的WIN32编程来实现,不依赖于任何现有的框架。简单添加几个基本页面,具体的代码就不贴了。主要实现两个基本功能:对硬盘驱动器进行分区和拷贝、应用系统镜像。
硬盘分区的实现:
微软提供了一个 CreatePartitions-UEFI.txt 脚本,它将磁盘分为系统分区(S)、MSR保留分区、Windows分区(W)和恢复分区(R)。为了简化实现,安装程序首先查询用户硬盘驱动器总大小,根据用户输入的C盘和D盘大小,以脚本文件中内容作为模板,生成需要执行的脚本。然后执行脚本,实现硬盘分区和格式化。
镜像拷贝和应用的实现:
镜像的拷贝和应用主要利用dism工具实现,同时,还需要设置 Windows 的引导程序以及隐藏恢复分区。
应用映像(install.wim中内容)到 Windows 分区
dism /Apply-Image /ImageFile:"$drive\sources\install.wim" /Index:1 /ApplyDir:"$windowsDrive"
使用bcdboot工具配置系统分区
$windowsDrive\Windows\System32\bcdboot $windowsDrive\Windows /s $systemDrive
将 Windows 恢复环境(winre)工具复制到恢复工具分区中
mkdir $recoveryDrive\Recovery\WindowsRE
xcopy /h $windowsDrive\Windows\System32\Recovery\Winre.wim $recoveryDrive\Recovery\WindowsRE\
注册恢复工具的位置,然后使用 Diskpart 隐藏恢复分区
$windowsDrive\Windows\System32\Reagentc /Setreimage /Path $recoveryDrive\Recovery\WindowsRE /Target $windowsDrive\Windows
$windowsDrive\Windows\System32\Reagentc /Info /Target $windowsDrive\Windows
这里有一点要注意:因为在winpe环境中,除了‘x’是留给winpe虚拟盘的盘符,其他盘符是临时分配的。所以,以上这些命令中的drive信息都是通过枚举所有盘符获得对应的分区。
将两部分内容封装到安装程序中,将开发好的CustomSetup.exe按照Winpeshl.ini文件中的内容到放到指定位置。
至此,Windows 安装工具开发基本完成。通过dism /unmount-image /mountdir:"E:\Win10PE\media\sources\boot" /commit命令,卸载winpe并提交修改。
利用镜像编辑工具,将ISO文件中sources目录下的的boot.wim替换为制作好的boot.wim文件。同时,将ISO中与安装无关的文件删除。如下是原始ISO文件中的目录结构和定制安装程序之后ISO的目录结构:
原ISO的文件布局
新ISO的文件布局
定制镜像的安装效果在hyper-v中安装新的镜像文件,系统引导进入winpe并调用前面开发的 Windows 安装程序,以下为安装过程截图。
首页模拟了windows 10 原生的安装程序,添加了两个logo。