简介:HackBGRT-1.5.1.zip 是面向 Windows 10 用户的开机 LOGO 定制工具包,适合想替换启动画面并了解固件 BGRT 机制的技术爱好者与开发者,可用于个性化开机视觉与底层启动流程学习。压缩包共 20 个文件、约 73KB,以 C 与 C# 源码(.c、.cs、.h)为主体,并包含 Makefile 构建脚本、Doxyfile 文档配置、示例位图、config.txt 参数样例、LICENSE、README、CHANGELOG 等说明文档,构成从编译到配置的完整小型工程。已有 4785 人学习下载,可见该工具在开机画面修改这一细分方向上有一定参考价值。读者可获得可编译的工具源码、EFI 环境下的实现思路、图片规格与配置项说明及版本变更记录,便于在理解原理的前提下完成替换与排错。
1. 开机图标换掉之后,最先暴露的是固件和引导链
开机图标这件事听着像换张壁纸,实际动的是固件到操作系统之间那段最不该乱碰的路。HackBGRT-1.5.1.zip 干的事就一件:在 UEFI 固件和 Windows 的 bootmgfw.efi 之间插一层自己的引导程序,先把你要的那张图贴到屏幕上,再把执行权原样交还给微软的引导器。它解决的是样机、展厅机、整机定制里「开机第一屏永远是别人的 logo」这种尴尬,也顺带给多系统机器做一个一眼能认出来的入口。适合手上已经有 UEFI 机器、愿意为一张图去改 BCD 的人;只想换桌面壁纸的,看到第二章就可以关掉了。
2. 引导链拆解:HackBGRT 动的是 BCD 里那一个 path
动手之前得先知道它站在哪一层。很多人第一次装完发现图没出来,或者干脆进不了系统,问题不在图片,而在于没搞清楚「固件把谁当第一棒」这件事。这一章把引导链拆开看,顺带把回滚的退路先铺好。
2.1 从 BGRT 说起:固件画的那张图是怎么留下来的
开机按下电源之后,固件做内存训练、枚举设备,然后把厂商 logo 画进帧缓冲,同时把这个区域的位置、宽高、像素格式登记到 ACPI 的 BGRT 表里。Windows 的启动管理器加载后会去读这张表,于是它知道自己「盖」在谁头上:如果策略允许,就不清屏,直接在固件那张图上叠转圈动画;如果不允许,就整屏刷黑自己画。这也是为什么有些机器只改主板 logo,Windows 那一屏的图会跟着变——它复用的本来就是同一张。
HackBGRT 的切入点就在这里。它不去改 bootmgfw.efi 的二进制,而是注册一个先于 Windows 引导管理器执行的 UEFI 应用,由这个应用负责把 splash 图贴到帧缓冲,贴完再链式加载真正的 bootmgfw.efi。这个「插一层」的结构决定了三件事:图片必须在固件阶段就能被读到、引导链断在哪一环要能一眼看出来、卸载必须能干净地还原成原来的单层结构。
至于它到底改的是 BCD 里 {bootmgr} 的 path 元素,还是往固件 NVRAM 里加了一条引导项,不同小版本的实现有差别。别猜,装完立刻用下面两条命令各看一遍,输出比任何文档都可靠,这份输出也是你后面回滚的唯一依据:
bcdedit /enum {bootmgr} bcdedit /enum firmware第一条看 Windows 引导管理器对象的 path 指向哪个文件,第二条看固件层面到底登记了哪些引导项、顺序如何。参数说明就一句:{bootmgr}是 BCD 里固定存在的引导管理器标识符,不用你创建,firmware是枚举 NVRAM 里的固件条目而不是 BCD 条目。两条都要在管理员权限的终端里跑,普通权限会报拒绝访问。
2.2 卡在 UEFI 和 Secure Boot 两道门上
第一道门是引导模式。Legacy/CSM 模式下固件走的是一段 16 位实模式代码然后跳到 MBR,根本没有「加载一个 .efi 应用」这个流程,loader.efi 无从谈起。判断方法不用进固件界面翻菜单,三条命令就够:
bcdedit /enum {current}看输出里的path是\Windows\system32\winload.efi还是\Windows\system32\winload.exe。前者是 UEFI,后者是 Legacy,看到.exe就别往下折腾了。
Confirm-SecureBootUEFI这条 PowerShell 命令返回 True/False 表示 Secure Boot 开关状态。有意思的是它在 Legacy 机器上会直接抛「Cmdlet not supported on this platform」,所以这条命令同时兼职了引导模式检测——报错本身就是答案。
第二道门是 Secure Boot。自编译或未经签名的 UEFI 应用会被固件在校验阶段直接拒绝,表现是图不显示、系统照常进,或者干脆卡在固件 logo 上。要在这种机器上用,只能进固件设置把 Secure Boot 关掉,并且注意有些整机固件还有「引导顺序锁定」「恢复默认后重新校验」这类额外开关,改完记得保存退出而不是直接断电。
2.3 盘上到底落了哪些文件
装完之后,EFI 系统分区(ESP)里会多出一个目录。各文件的角色差别很大,改错一个就是进不了系统:
| 路径 | 作用 | 能不能手动改 |
|---|---|---|
\EFI\HackBGRT\loader.efi | 真正被固件执行的那一层,负责贴图并转交 | 不要改,改了签名/校验必挂 |
\EFI\HackBGRT\config.txt | 配置项,纯文本 | 可以改,改前备份 |
\EFI\HackBGRT\splash.bmp | 开机显示的图 | 可以换,规格要对 |
\EFI\Microsoft\Boot\bootmgfw.efi | 微软原生引导器,链式加载的目标 | 绝对不能动 |
BCD 中的{bootmgr}path | 指向上面第一行的文件 | 只能通过 bcdedit 改 |
想直接看这些文件,得先把 ESP 挂出来。ESP 默认没有盘符,用 mountvol 最省事:
mountvol Y: /s dir Y:\EFI mountvol Y: /d/s是挂载当前系统的 ESP,/d是卸载。挂载后给 ESP 分配了盘符,资源管理器里就能直接拖文件进去;用完记得卸掉,长期挂着某些备份软件会误扫。
2.4 动手前先把引导配置导出来
这一步很多人跳过,出事之后才开始后悔。BCD 是一个二进制存储,被改坏之后靠记忆是拼不回来的,但导出的副本可以整份盖回去:
mkdir C:\bcd-backup bcdedit /export C:\bcd-backup\bcd-before-hackbgrt.bak bcdedit /enum {bootmgr} > C:\bcd-backup\bootmgr-before.txt/export导出的是整个 store 的快照,回滚时用bcdedit /import C:\bcd-backup\bcd-before-hackbgrt.bak。第二条把当前 {bootmgr} 的完整输出存成文本,出问题时能直接对比「装之前 path 是什么、现在是什么」,比翻聊天记录快得多。注意导出目录别放在马上要格的盘上,也别只存一份在本机——引导挂了的时候,你恰恰进不去这个系统。
3. 安装与配置:setup.exe 之外你还得管三件事
包里的 setup.exe 是个图形壳,点几下确实能装完,但它不负责你的 BitLocker、不负责你的图片规格、也不负责多硬盘机器上到底改了哪块盘的 BCD。这三件事得自己在装之前处理掉。
3.1 前置检查:BitLocker 必须先挂起
改引导链会改变启动度量值,BitLocker 检测到度量变化,下一次开机直接停在恢复界面要 48 位密钥。这不是玄学,是设计如此。装之前先看状态再挂起:
manage-bde -status C: manage-bde -protectors -disable C: -rebootcount 2-status确认 C 盘是不是「完全加密/已启用」。-protectors -disable是挂起而不是解密,数据仍然是密的,只是暂时不校验;-rebootcount 2表示重启两次之后自动恢复保护,这个数字要覆盖你「装完 → 重启验证 → 再重启一次」的完整流程,设 1 很可能验证到一半就又被锁上。确认一切正常之后再手动恢复:
manage-bde -protectors -enable C:顺手把恢复密钥取出来存到手机或打印一份:manage-bde -protectors -get C:。真被锁的时候,你会感谢现在多按的这一次回车。
同时确认 ESP 剩余空间。挂上去dir Y:\看一眼,一个 loader 加一张 4K 图通常几 MB,ESP 一般 100MB 起步,正常都够,但有些整机厂把 ESP 塞得很满,装到一半写不进去就是引导半残。
3.2 setup.exe 的执行路径与手动等价命令
以管理员身份跑 setup.exe,走 Install,它做的事拆开就是三步:把 loader、config、splash 拷进\EFI\HackBGRT\,改 BCD 让引导管理器先执行这个 loader,重启生效。图形界面把这三步包起来了,但知道等价的命令行,你在 PE 里也能救回来:
bcdedit /set {bootmgr} path \EFI\HackBGRT\loader.efi这条是「手动装」。对应的「手动卸」就是把 path 改回微软原生的那个:
bcdedit /set {bootmgr} path \EFI\Microsoft\Boot\bootmgfw.efi两条命令改的是同一个元素,所以它们是互逆的。执行完立刻bcdedit /enum {bootmgr}复核,输出里那行path变了才算成功,别信界面上的「完成」提示。如果机器上有两块以上硬盘、每块都有自己的 ESP,还要额外确认device那一行指向的是partition=C:对应的那块,改错盘的典型症状是重启之后一切照旧、图没出来,但 BCD 看起来确实改了。
卸载优先走 setup.exe 里的 Uninstall,它会顺带清理目录;图形界面打不开(比如系统已经进不去了)就用上面的命令行版本,再手动删掉\EFI\HackBGRT\目录。
3.3 config.txt 怎么读:平铺键值,改前先备份
配置文件是纯文本,一行一个key=value,#开头是注释,没有分节、没有嵌套。不同小版本之间键名会有微调,所以正确姿势不是照抄网上的配置,而是先备份再对着包内注释逐行看:
copy Y:\EFI\HackBGRT\config.txt Y:\EFI\HackBGRT\config.txt.bak notepad Y:\EFI\HackBGRT\config.txtcopy那行是后悔药,改崩了直接覆盖回来。用 notepad 而不是某些会自动加 BOM 或改行尾的编辑器——配置文件解析器通常只认 ASCII 和 CRLF,存成「UTF-8 带 BOM」有可能让第一行的键名变成乱码,症状是「明明改了却没生效」,查半天查不出原因。
可调的东西大致是这几类,具体键名以包里那几行注释为准:
| 语义 | 典型取值 | 说明 |
|---|---|---|
| 图片路径 | \EFI\HackBGRT\splash.bmp | 相对 ESP 根目录,必须用反斜杠 |
| 链式加载目标 | \EFI\Microsoft\Boot\bootmgfw.efi | 一般不用改,除非你的系统引导器不在默认位置 |
| 显示相关 | 时长、是否缩放之类 | 按注释里的取值范围填,别自创 |
改完别急着重启,先确认文件本身能被正确读取:把 config.txt 用记事本另存一次、重新打开,看有没有出现方块或问号。图片路径那一行最常见的翻车是写成了Y:\EFI\...——绝对盘符在固件阶段根本不存在,必须是 ESP 根目录起的相对路径。
3.4 splash.bmp 的规格底线
图片是整件事里唯一「肉眼可见」的部分,也是最容易在格式上翻车的地方。硬性要求三条:BMP 容器、未压缩的 BI_RGB 像素数据、24 位色深最稳。32 位带 alpha 的 BMP 在多数实现里 alpha 通道会被直接忽略,半透明边缘会变成一圈黑边或者整块变黑,看起来像图被啃掉了一块。
自己校验一下,比肉眼猜靠谱:
from PIL import Image im = Image.open(r"Y:\EFI\HackBGRT\splash.bmp") print(im.format, im.mode, im.size)期望输出是BMP RGB (1920, 1080)这种形态。mode是RGB说明 24 位;如果是P(调色板)或者RGBA,都得先转再存。size要和你机器的面板原生分辨率一致,这一条下一章展开讲。
4. 图片制作:让开机第一屏不跳变、不偏色
图能显示出来只是及格线,真正让人一眼看出「这是定制过的机器」的,是那张图和前后两屏之间的衔接。固件 POST 是黑底,Windows 引导阶段也是黑底,中间插一张白底或带渐变的图,屏幕会明显地闪一下,观感比不换还差。
4.1 先量准真实分辨率,别信缩放后的数字
Windows 显示设置里那个「分辨率」有可能是缩放后的逻辑值,尤其在 4K 屏默认 150% 缩放的机器上。要的是面板物理像素,常见档位是 1366×768、1920×1080、2240×1400、2560×1440、2560×1600、3840×2160。拿不准就按显示设置里标「推荐」的那个数值出图,16:10 的笔记本别出 16:9 的图,否则上下必然留黑边或者左右被切。
贴图基本是 1:1 原尺寸,不做自适应缩放。分辨率对不上的典型表现是图缩在左上角、或者只显示了一部分。与其赌固件会帮你缩放,不如按目标机器的原生分辨率各出一张。
4.2 黑底合成:alpha 必须先合掉
设计稿给过来的多半是透明背景的 PNG。直接另存成 BMP,透明区域会按 0 值填成黑色,看着没问题,但半透明的抗锯齿边缘会因为丢失 alpha 变灰,在纯黑背景上形成一圈毛边。正确做法是先手工合成到黑底,再存 BMP,让输出的图完全不依赖 alpha 通道。
from PIL import Image CANVAS = (1920, 1080) # 目标面板原生分辨率 BG = (0, 0, 0) # 纯黑,和固件、Windows 引导阶段对齐 logo = Image.open("logo.png").convert("RGBA") target_h = int(CANVAS[1] * 0.55) # logo 占屏高 55%,留呼吸空间 ratio = target_h / logo.height logo = logo.resize((int(logo.width * ratio), target_h), Image.LANCZOS) canvas = Image.new("RGB", CANVAS, BG) # 最终画布是 RGB,天然 24 位 tmp = Image.new("RGB", logo.size, BG) tmp.paste(logo, mask=logo.split()[3]) # 用 alpha 通道当遮罩合成到黑底 canvas.paste(tmp, ((CANVAS[0] - logo.width) // 2, (CANVAS[1] - logo.height) // 2)) canvas.save("splash.bmp", format="BMP")几个关键点:convert("RGBA")保证后面能取到 alpha,logo.split()[3]取的就是 alpha 通道拿来当 paste 的 mask;先tmp.paste到黑底再贴到画布,是为了彻底消除半透明边缘;Image.LANCZOS在缩小时锐度最好,比默认的 NEAREST 干净一个档;最后画布是RGB模式,Pillow 存 BMP 时默认写 24 位 BI_RGB,正好是我们要的。存完用上一节那三行校验一遍,别省。
4.3 ffmpeg 一条命令的等价方案
手边没 Python 环境、或者要接到已有的转码流水线里,ffmpeg 更顺手:
ffmpeg -i logo.png \ -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=black" \ -pix_fmt bgr24 -y splash.bmpforce_original_aspect_ratio=decrease保证等比缩放不拉伸,pad用黑边把画面补回目标尺寸并居中,color=black指定补边颜色——这个参数一定要显式写,默认是黑但在某些版本里会因为输入带 alpha 而补成透明。-pix_fmt bgr24是出 BMP 的关键,它强制输出 24 位 BGR 无 alpha,等价于 Pillow 那边的RGB模式。-y只是覆盖输出不追问。
4.4 一次出齐多档分辨率
做整机定制往往不是一台机器,与其一台台改,不如按档位批量出图,装机时按机器挑一张:
for r in 1366x768 1920x1080 2560x1440 3840x2160; do w=${r%x*} h=${r#*x} ffmpeg -loglevel error -i logo.png \ -vf "scale=${w}:${h}:force_original_aspect_ratio=decrease,pad=${w}:${h}:(ow-iw)/2:(oh-ih)/2:color=black" \ -pix_fmt bgr24 -y "splash_${r}.bmp" done${r%x*}是截掉最后一个 x 之后的部分取宽,${r#*x}是截掉第一个 x 之前的部分取高,这套参数展开在 bash 里通用。-loglevel error让批量跑的时候只输出错误,屏幕上清爽。
4.5 别忽略文件体积和像素对齐
一张 3840×2160 的 24 位 BMP 接近 25MB。ESP 一般放得下,但如果你还要塞 PE、诊断工具,就得掂量。另一个隐性坑是行宽对齐:BMP 每行像素数据必须补齐到 4 字节边界,1920×3=5760 刚好整除,1366×3=4098 就不整除,需要补 2 字节。Pillow 和 ffmpeg 都会自动处理,但如果你用自写脚本拼 BMP 头,这一步漏了就是整张图斜着撕裂——看到那种画面别怀疑固件,先怀疑自己的编码器。
5. 避坑:五条踩过的记录
下面这几条都是「现象看着差不多、原因完全不是一回事」的类型,按现象归类比按原因归类更好查。
5.1 开机直接进不去系统
现象一:重启后进恢复环境,报 0xc000000e。原因几乎都是 BCD 里那个 path 指向的文件读不到——要么 ESP 没挂对盘(多硬盘机器改了另一块盘的 BCD),要么\EFI\HackBGRT\目录被拷贝了一半。解决办法是进 PE,用bcdedit /enum {bootmgr}看device那一行的partition=是不是系统盘对应的分区,不对就bcdedit /store指定正确的 store 改回来,实在乱了直接bcdedit /import覆盖回装之前的备份。
现象二:固件 logo 之后黑屏十几秒才进系统。原因通常是 loader 加载了但找不到链式加载的目标,固件在超时后回退到下一个引导项。检查 config.txt 里链式加载那行的路径是不是\EFI\Microsoft\Boot\bootmgfw.efi,以及这个文件是否真的存在(有些精简系统会把它放在\EFI\Boot\下)。解决方法是把路径改成实际位置,或者干脆先卸载确认原生引导正常,再重新装一遍。
5.2 图不显示或者显示得不对
现象三:Secure Boot 开着,图完全不出现,系统照常进。原因是未签名的 UEFI 应用被固件在校验阶段拒绝,固件悄悄回退到了原生引导项,用户完全无感。这在做批量部署时最坑,因为「装成功了」和「没生效」表现一模一样。判断方法是进固件设置看 Secure Boot 状态,或者查固件启动菜单里有没有多出来的那条引导项。解决办法只有关掉 Secure Boot,没有别的绕法。
现象四:图出来了但偏色、花屏、只显示上半截。三种可能与三种解法:偏色多半是 BMP 用了 16 位色深或带 RLE 压缩,重新导出 24 位未压缩版本;花屏通常是行宽没做 4 字节对齐(自写编码器常见);只显示一部分则是分辨率超过了固件当前的 GOP 模式,按面板原生分辨率重出一张即可。花屏还有个少见原因:图片路径写成了带盘符的绝对路径,loader 读到了错误区域的内容。
现象五:装完要 BitLocker 恢复密钥。改引导链触发启动度量变化,保护器判定环境不可信,直接锁盘。这个坑唯一的解药是事前,manage-bde -protectors -disable C: -rebootcount 2一行命令的事。已经锁了就去账户里找恢复密钥,或者用manage-bde -protectors -get C:之前导出的那份,别急着格式化。
5.3 用着用着失效了
现象六:换了台机器 / 固件升级之后,图没了,但文件还在。原因是固件 NVRAM 里的引导项被清除或重排,Windows 大版本更新也可能重写 BCD。表现是文件齐齐全全、path 却指回了原生引导器。解决办法是重跑一遍 setup.exe,或者手动执行第三章那条bcdedit /set。老练一点的做法是把 config.txt 和 splash.bmp 单独存一份在 U 盘里,重装系统或者换机之后直接覆盖回去,比重新调图省事。
6. 验证与回滚:三处检查点确认这一层真的生效
装完不看验证,等于闭着眼睛改引导。我习惯按三个检查点走一遍,任何一处对不上就先停下,别急着重启第二次。
第一处是 BCD。bcdedit /enum {bootmgr}输出里的path必须指向\EFI\HackBGRT\loader.efi,device必须是你系统所在的那块盘的 ESP。这两行是整件事的根,其他都可以后面再说。
第二处是文件系统。mountvol Y: /s之后dir Y:\EFI\HackBGRT\要能看到 loader、config、splash 三个文件,并且dir Y:\EFI\HackBGRT\splash.bmp报出来的字节数和你本地那张对得上——拷贝中断导致的半截文件是「图显示成灰色色块」的元凶之一。看完记得mountvol Y: /d。
第三处才是重启。第一次重启建议守着机器看,重点不是图好不好看,而是从固件 logo 到 Windows 转圈之间有没有出现黑屏跳变或者二次 logo。有跳变说明你的图分辨率或底色没对齐;二次 logo 说明链式加载被绕过了,回到了原生引导。
回滚有三条路,按侵入性从低到高:setup.exe 里点 Uninstall;命令行把 path 改回\EFI\Microsoft\Boot\bootmgfw.efi;实在进不去系统就进 PE 用bcdedit /import覆盖回第二章导出的那份备份。三条路里第三条最彻底,但前提是你真的导出了那份备份。
还有一个我自己总结的习惯:任何改引导链的操作,第一次一定先在备用机或者一块闲置硬盘上跑通全流程,包括卸载和回滚,再动主力机。主力机上翻车一次,赔进去的是半天时间和一颗 BitLocker 恢复密钥。从那以后我每次动 BCD 之前都会强制走一遍「导出 → 挂起 BitLocker → 记下原始 path」这三步,一次没落过。希望帮到你。
本文还有配套的精品资源,点击获取