这几天看<格蠹汇编>中调试ACPI相关章节,里面提到为了使用AMLI调试器,需要检查版本(Checked Build)的ACPI.sys。
我们平时使用的windows都是发行版本(Free Build),因此不能满足我们调试的需求。MSDN相关文档提到2个获得checked build的方法:1).从winddk的根目录下Debug/目录获取。很可惜,这个目录中只有ntkrnl.exe/hal.dll等文件,并没有acpi.sys;2).从MSDN Subscriber下载Checked Build OS。这需要Subscriber账号并订阅。说白了,人民币玩家才能从这下载到Checked Build OS。两种方式都行不通,只能通过baidu了。baidu上多数是调试Xp sp2的ACPI.sys,不幸的事,它们提供的指向微软下载中心的Checked Build补丁包都已经失效(被MS移除)。最终,我找到了win7 RTM x86 Checked build ACPI.sys。为了方便网友调试ACPI,我顺带给出了它的下载链接。
有了Checked Build ACPI.sys后,还需要与之对应的OS:en_windows_7_ultimate_x86_dvd_X15-65921.iso 可以从MSitellyou上获得对应的镜像。万事具备都就可以准备替换Acpi.sys。Vist以前的系统进入安全模式后就能替换,对于Vist以后的OS,以管理员身份运行下列命令,再替换(不需要进入安全模式):
takeown /f acpi.sys
cacls acpi.sys /G <username>:F ;username是当前用户的用户名 F是指获得所有权限
重启OS连上windbg后,设置符号路径(MS下载中心win 7RTM x86调试符号包无法下载,所以只能在windbg中设置符号路径):
SRV*http://msdl.microsoft.com/download/symbols
之后就可以开始调试ACPI了:
kd> lm m acpi
start end module name
88e18000 88e8d000 ACPI (pdb symbols) c:\symbols\w7rtmx86\acpi.pdb\D653AC015F2D49A68DD1DE36261E05661\acpi.pdb
kd> lmvm acpi
start end module name
88e18000 88e8d000 ACPI (pdb symbols) c:\symbols\w7rtmx86\acpi.pdb\D653AC015F2D49A68DD1DE36261E05661\acpi.pdb
Loaded symbol image file: ACPI.sys
Image path: ACPI.sys
Image name: ACPI.sys
Timestamp: Tue Jul 14 07:34:34 2009 (4A5BC48A)
CheckSum: 0007627F
ImageSize: 00075000
Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4
kd> !amli debugger ;使windbg与ACPI调试器建立链接
kd> !amli dns ;查询ACPI命名空间的对象
ACPI Name Space: \ (ffffffff84f59024)
Unknown(\___)
| Unknown(_GPE)
| | Method(_L09:Flags=0x0,CodeBuff=ffffffff84f5f1f5,Len=222)
| | Method(_L01:Flags=0x0,CodeBuff=ffffffff858c71b9,Len=15)
| | Method(_L02:Flags=0x0,CodeBuff=ffffffff858c7c81,Len=10)
| | Method(_L03:Flags=0x0,CodeBuff=ffffffff858c7cf5,Len=10)
| Unknown(_PR_)
| Unknown(_SB_)
| | Method(STRC:Flags=0x2,CodeBuff=ffffffff84f59541,Len=73)
| | OpRegion(OEMD:RegionSpace=SystemMemory,Offset=0x8b18de5d,Len=96)
| | Field(:Base=)
| | FieldUnit(:FieldParent=ffffffff84f59650,ByteOffset=0x0,StartBit=0x0,NumBits=288,FieldFlags=0x0)
| | FieldUnit(CCAP:FieldParent=ffffffff84f59650,ByteOffset=0x24,StartBit=0x0,NumBits=32,FieldFlags=0x0)
| | FieldUnit(ECFG:FieldParent=ffffffff84f59650,ByteOffset=0x28,StartBit=0x0,NumBits=32,FieldFlags=0x0)
| | FieldUnit(PCHS:FieldParent=ffffffff84f59650,ByteOffset=0x2c,StartBit=0x0,NumBits=32,FieldFlags=0x0)
| | FieldUnit(PCHE:FieldParent=ffffffff84f59650,ByteOffset=0x30,StartBit=0x0,NumBits=32,FieldFlags=0x0)
| | FieldUnit(VMGC:FieldParent=ffffffff84f59650,ByteOffset=0x34,StartBit=0x0,NumBits=256,FieldFlags=0x0)
| | FieldUnit(LDDV:FieldParent=ffffffff84f59650,ByteOffset=0x54,StartBit=0x0,NumBits=32,FieldFlags=0x0)
| | FieldUnit(POSC:FieldParent=ffffffff84f59650,ByteOffset=0x58,StartBit=0x0,NumBits=32,FieldFlags=0x0)
| | FieldUnit(SIOC:FieldParent=ffffffff84f59650,ByteOffset=0x5c,StartBit=0x0,NumBits=32,FieldFlags=0x0)
| | Integer(TOOS:Value=0x0000000000000c00[3072])
| | Integer(FLAG:Value=0x0000000000000001[1])
| | Method(_INI:Flags=0x0,CodeBuff=ffffffff84f59b3d,Len=569)