首页
社区
课程
招聘
[原创]Windbg跟踪ACPI亮度设定
发表于: 2020-11-18 23:43 4743

[原创]Windbg跟踪ACPI亮度设定

2020-11-18 23:43
4743

有阵子没更新博客了,趁着有空更新一下前阵子在工作遇到的内容:
公司要出货一批笔记本,对屏幕亮度上限有限定。我无意中发现可以通过控制ACPI命名空间中Method(_BCL)的行为来实现该需求,虽然事后证明这种方式是错误的,但并不影响我记下windbg跟踪ACPI的方法。

先简单介绍一下Method(_BCL)的作用,翻开ACPI Spec会看到下列定义:

这是一个Bios提供给OS用于设置集显亮度百分比的接口(强调一下,仅设置集显,不包含外显)。对于Win10,Method(_BCL)在切换显示比列时会生效(当然点亮屏幕前也会生效),即切换下图红框处的设置:

一般Method(_BCL)会返回一个从0到100的数组,分别代表100种亮度比例;如果返回的是从0到50的数组,那么当你把上图绿框中的滑块拖到最右边,你会发现屏幕只有正常亮度的一半(真节能灯)!

好,背景交代完毕,切入正题,用windbg调试这个ACPI method。以往,AML解释器----!amli扩展命令只集成在Checked build的Acpi.sys文件中,多数调试者止步于此。现在,win10 Free build的Acpi.sys也支持该功能(但需要acpi.pdb,解决无法连接M$调试符号服务器的解决方法参考附录1

开启中断到amli解释器的功能,如此可以下在ASL code上下断点:

虽然_BCL是已知对象,但是根据ACPI spec,每个对象位于ACPI命名空间的树状结构中,所以必须要从ACPI命名空间的根节点"\"开始,为特定对象下断点。搜索对象在树状结构中的路径需要用到!amli find命令,找到对象后用!amli bp下断点:

触发中断条件,就是在Settings->System->Display->"Scale and layout"中切换显示比列,此时windbg会中断到!amli解释器中,并且,windbg "Command Line"的提示符从kd>变为Input>,这时可以直接在解释器中输入!amli的参数:

上面的lc用于显示ACP中断时,当前的上下文。很明显,我们已经执行了_BCL函数。

收藏
免费 2
支持
分享
最新回复 (4)
雪    币: 3727
活跃值: (3847)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
感谢分享!
2020-11-21 14:27
0
雪    币: 58
活跃值: (1090)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
新的笔记本应该不用BCL这个method了,直接GFX driver设置亮度,亮度曲线由BIOS提供
2020-11-25 00:03
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
4
对,我都说我改错了地方
2020-12-13 15:24
0
雪    币: 12159
活跃值: (5704)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
插眼
2020-12-13 16:26
0
游客
登录 | 注册 方可回帖
返回
//