本文为看雪论优秀文章
看雪论坛作者ID:hyjxiaobia
一般Method(_BCL)会返回一个从0到100的数组,分别代表100种亮度比例;如果返回的是从0到50的数组,那么当你把上图绿框中的滑块拖到最右边,你会发现屏幕只有正常亮度的一半(真节能灯)!
Method(_BCL,0)
{
//
// List of supported brightness levels in the following sequence.
// Level when machine has full power.
// Level when machine is on batteries.
// Other supported levels.
//
Return(Package(){80, 50, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ..., 95, 96, 97, 98, 99, 100})
}
Step1:
开启中断到amli解释器的功能,如此可以下在ASL code上下断点:
5: kd> !amli set dbgbrkon
Step2:
虽然_BCL是已知对象,但是根据ACPI spec,每个对象位于ACPI命名空间的树状结构中,所以必须要从ACPI命名空间的根节点""开始,为特定对象下断点。搜索对象在树状结构中的路径需要用到!amli find命令,找到对象后用!amli bp下断点:
6: kd> !amli find _BCL
_SB.PCI0.GFX0.DD1F._BCL
6: kd> !amli bp _SB.PCI0.GFX0.DD1F._BCL
Step3:
触发中断条件,就是在Settings->System->Display->"Scale and layout"中切换显示比列,此时windbg会中断到!amli解释器中,并且,windbg "Command Line"的提示符从kd>变为Input>,这时可以直接在解释器中输入!amli的参数:
AMLI(? for help)-> lc
Ctxt=ffff8e0c81c23050, ThID=ffff8e0c74c0e080, Flgs=----R----, pbOp=ffff8e0c71b292ea, Obj=_SB.PCI0.GFX0.DD1F._BCL
Step4:
单步调试ACPI运行是不可能了,但是有折中的办法:用!amli u反汇编ACPI函数,并在指定分支处下断点。虽然这个办法效率很低,但好在ACPI method代码量不大,还算可行。
AMLI(? for help)-> u _SB.PCI0.GFX0.DD1F._BCL
ffff8e0c71b292ea:[_SB.PCI0.GFX0.DD1F._BCL]
ffff8e0c71b292ea : If(CondRefOf(PBCL, ))
ffff8e0c71b292f4 : {
ffff8e0c71b292f4 : | Return(PBCL())
ffff8e0c71b292f9 : }
ffff8e0c71b292f9 : Else
ffff8e0c71b292fc : {
...
AMLI(? for help)-> bp ffff8e0c71b292ea
AMLI(? for help)-> g
附录1 解决无法连接M$调试符号服务器的解决方法:
张银奎老师的Nano code可以下载绝大多数pdb(具体怎么使用请移步高端调试论坛),同时Nano code支持调试kernel dump。所以,比较方便的解决办法是在目标机上强行生成kernel dump,然后用Nano code加载kernel dump并下载调试符号。
看雪ID:hyjxiaobia
https://bbs.pediy.com/user-home-817607.htm
*本文由看雪论坛 hyjxiaobia 原创,转载请注明来自看雪社区。
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!
本文始发于微信公众号(看雪学院):Windbg跟踪ACPI亮度设定
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论