收起左侧

无需BIOS选项 修改UEFI变量实现笔记本通电开机

1
回复
232
查看
[ 复制链接 ]

1

主题

6

回帖

0

牛值

江湖小虾

飞牛百度网盘玩家

笔记本安装 fnOS 后,难免会有意外关机的情况,如果人在外地,就需要远程开机的功能。

常见的远程开机方法有智能插座通电开机、WOL 网络唤醒、开机卡、手指机器人等,但由于笔记本的扩展性较差,往往会遇到没网口或外接网卡不通电、开机引脚太小等问题,手指机器人也不太美观。

笔记本由于自带电池,许多厂家都会隐藏通电开机的 BIOS 选项,但因为有 Intel 和 AMD 芯片的支持,这个功能始终是存在的。

最简单实现通电开机的方法是拔掉电池和纽扣电池,由于没有了 RTC 供电,此时 AFTERG3_EN 或类似寄存器将复位,一般默认为通电开机,下次通电 BIOS 会重新设置,断 电后再次复位。此方法的缺点是没有实时时钟,也发挥不了笔记本 UPS 的优势。

本教程则使用 GRUB Shell 修改 BIOS 隐藏设置实现通电开机,目前网上的教程较少且过时,故在此分享,测试机器为联想 AMD 轻薄本。

获取镜像

首先要获取笔记本的 BIOS 镜像,推荐使用 BIOS Backup TooKit 工具(无官方,自行下载,需要 Win 环境,例如在 HotPE 等 PE 中运行)读取。

BIOS_Backup_TooKit.png

查找区段

使用 UEFITool(下载)打开镜像,寻找 LzmaCustomDecompressGuidTianoCustomDecompressGuid 等区段,名称取决于 BIOS 厂家使用的压缩算法。同名区段会有多个,一般选择子项最多的那个区段。

在子项中寻找 SetupSetupDxe 等字段,同时可以使用查找功能搜索 G3AfterAcPower Loss 等关键词,通电开机一般在 Setup 中,我的测试机器在 CbsSetupDxeRN 中。

展开 Setup,选择区段 PE32 image section 右键 Extract as is 导出。如果不确定其是否包含通电开机,就将每个候选项的 PE32 image section 都导出。

UEFITool.png

导出文本

使用 IRFExtractor(下载)再将上述导出为文本格式。

IRFExtractor.png

使用任意文本编辑器,再次查询关键词定位,一般为 State After G3,我的为 Ac Loss Control,记录其后的 VarStoreInfo 地址,我的为 0xE1,以及 Size,一般为 0x01

我这里将 BIOS 的默认配置 0x00 改为 0x01 即可实现通电开机,State After G3 则相反。

此外还要注意 VarStoreName 字段,在文件开头可以找到,一般为 Setup,我的为 AmdSetup

0x13E6F 	VarStore: VarStoreId: 0x5000 [3A997502-647A-4C82-998E-52EF9486A247], Size: 0x5A8, Name: AmdSetup {24 1F 02 75 99 3A 7A 64 82 4C 99 8E 52 EF 94 86 A2 47 00 50 A8 05 41 6D 64 53 65 74 75 70 00}

0x1861A 		One Of: Ac Loss Control, VarStoreInfo (VarOffset/VarName): 0xE1, VarStore: 0x5000, QuestionId: 0x122, Size: 1, Min: 0x0, Max 0xF, Step: 0x0 {05 91 84 03 85 03 22 01 00 50 E1 00 10 10 00 0F 00}
0x1862B 			One Of Option: Always Off, Value (8 bit): 0x0 (default) {09 07 86 03 10 00 00}
0x18632 			One Of Option: Always On, Value (8 bit): 0x1 {09 07 87 03 00 00 01}

修改变量

使用添加 setup_var 命令的 GRUB Shell 整合包(下载),下载后重命名为 bootx64.efi,将 U 盘格式化为 FAT32,添加目录 EFI/BOOT/bootx64.efi,笔记本引导启动。

也可以使用 fnOS 自带的 GRUB 添加 setup_var.efi(不推荐),无需额外 U 盘。

下列步骤有风险,请确保操作变量无误!

如果 VarStoreNameSetup,且 Size0x01,则可以直接使用 setup_var 命令,例如将地址 0xE1 的值改为 0x00

setup_var 0xE1 0x00

如果 VarStoreName 不为 Setup,则可以使用 setup_var_cv 命令,例如将 AmdSetup 地址 0xE1 的值改为 0x00

setup_var_cv AmdSetup 0xE1 0x01 0x00

GRUB.png

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

10

回帖

0

牛值

江湖小虾

谢谢楼主分享

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则