-
-
[原创]Windbg跟踪ACPI亮度设定
-
发表于:
2020-11-18 23:43
4775
-
有阵子没更新博客了,趁着有空更新一下前阵子在工作遇到的内容:
公司要出货一批笔记本,对屏幕亮度上限有限定。我无意中发现可以通过控制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函数。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课