本文为看雪论坛优秀文章
看雪论坛作者ID:hyjxiaobia
Part 1. Bios侧对开启ACPI的支持
SwContext.SwSmiInputValue = (UINTN) PcdGet8 (PcdAcpiEnableSwSmi);
Status = SwDispatch->Register (
SwDispatch,
EnableAcpiCallback,
&SwContext,
&SwHandle
);
新Part 2. Windows侧开启ACPI
bcdedit /debug on
bcdedit /bootdebug on ;不开这个,windows开启ACPI的瞬间,windbg和目标机的调试会话可能会被重置
//busdrv\acpi\driver\shared\acpienbl.c
VOID
ACPIEnableEnterACPIMode (
VOID
);
/*++
Routine Description:
This routine is called to enter ACPI mode
Arguments:
None
Return Value:
None
--*/
kd>x ACPI!ACPIEnableEnterACPIMode ;搜索函数名
ACPI!ACPIEnableEnterACPIMode ;居然函数还在,看来Win7还是用这个函数开启ACPI
kd> bp acpi!ACPIEnableEnterACPIMode ;那就下断点
kd> g
Breakpoint 0 hit
ACPI!ACPIEnableEnterACPIMode:
88cdbce0 8bff mov edi,edi
kd> g
Breakpoint 0 hit
ACPI!ACPIEnableEnterACPIMode:
88cc2ce0 8bff mov edi,edi
kd> kb
# ChildEBP RetAddr Args to Child
00 8078b644 88cc2e25 00000000 8078b66c 88cfde24 ACPI!ACPIEnableEnterACPIMode
01 8078b650 88cfde24 00000000 82a0f940 88cf5ae0 ACPI!ACPIEnableInitializeACPI+0x1f
02 8078b66c 88cbe556 87d4cc60 87e548a0 00000000 ACPI!ACPIInitialize+0xe2
03 8078b69c 88d050c2 87d4cc60 886e81a0 88d04f38 ACPI!ACPIInitStartACPI+0x6a
04 8078b6c8 88cb927e 87d4cc60 886e8100 87d4cc60 ACPI!ACPIRootIrpStartDevice+0x18a
05 8078b6f8 82a7c11a 87d4cc60 87e548a0 886e8258 ACPI!ACPIDispatchIrp+0x13a
06 8078b718 82f8f531 00000000 87e535d8 87d4b008 nt!IofCallDriver+0x7e
07 8078b734 82a89506 8078b76c 82a892ea 87d4e4a0 nt!PnpAsynchronousCall+0x109
08 8078b7a0 82f976be 82a892ea 87d4e4a0 00000000 nt!PnpStartDevice+0x184
09 8078b7fc 82f96b27 00000012 00000000 87d4e4a0 nt!PnpStartDeviceNode+0x2a6
0a 8078b818 82f8b0b8 00000000 00000000 00000000 nt!PipProcessStartPhase1+0x87
0b 8078ba14 82a87f83 87df5748 00000000 8078ba50 nt!PipProcessDevNodeTree+0x1cc
0c 8078ba5c 82a87e4a 00000000 87d4cab8 00000000 nt!PnpDeviceActionWorker+0x129
0d 8078ba74 832b06ba 00000000 00000000 00000000 nt!PnpRequestDeviceAction+0x15e
0e 8078baec 832ad52b 8080f8c0 00000000 80810e50 nt!IopInitializeBootDrivers+0x414
0f 8078bb6c 832a29b7 8080f8c0 87de25e0 87de2270 nt!IoInitSystem+0x593
10 8078bc4c 82ecd012 8078bc90 8313d0da 8080f8c0 nt!Phase1InitializationDiscard+0xd67
11 8078bc54 8313d0da 8080f8c0 0010209f 00000000 nt!Phase1Initialization+0xd
12 8078bc90 82be6555 82ecd005 8080f8c0 00000000 nt!PspSystemThreadStartup+0x178
13 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x19
kd> !devstack 87e535d8
!DevObj !DrvObj !DevExt ObjectName
87d4cc60 \Driver\ACPI 87e548a0
> 87e535d8 \Driver\ACPI_HAL 87e53690 0000006c
!DevNode 87d4b008 :
DeviceInst is "ACPI_HAL\PNP0C08\0" ;<---PNP0C08
ServiceName is "ACPI"
kd> p
ACPI!ACPIEnableEnterACPIMode+0x81:
88cdbd61 a194bbd088 mov eax,dword ptr [ACPI!AcpiInformation (88d0bb94)]
kd> u ACPI!ACPIEnableEnterACPIMode+0x81
8bf8 mov edi,eax
a1942bcf88 mov eax,dword ptr [ACPI!AcpiInformation (88cf2b94)]
8b4004 mov eax,dword ptr [eax+4] ;<---从结构体偏移取值
660fb64034 movzx ax,byte ptr [eax+34h] ;<---ACPI!AcpiInformation+4处取得的值仍然是结构体指针
0fb7c0 movzx eax,ax
kd> dt _ACPIInformation
ACPI!_ACPIInformation
+0x000 RootSystemDescTable : Ptr32 _RSDT_32
+0x004 FixedACPIDescTable : Ptr32 _FADT
+0x008 FirmwareACPIControlStructure : Ptr32 _FACS
+0x00c DiffSystemDescTable : Ptr32 _DSDT
+0x010 MultipleApicTable : Ptr32 _MAPIC
+0x014 GlobalLock : Ptr32 Uint4B
+0x018 GlobalLockQueue : _LIST_ENTRY
+0x020 GlobalLockQueueLock : Uint4B
+0x024 GlobalLockOwnerContext : Ptr32 Void
+0x028 GlobalLockOwnerDepth : Uint4B
+0x02c ACPIOnly : UChar
+0x030 PM1a_BLK : Uint4B
+0x034 PM1b_BLK : Uint4B
+0x038 PM1a_CTRL_BLK : Uint4B
+0x03c PM1b_CTRL_BLK : Uint4B
+0x040 PM2_CTRL_BLK : Uint4B
+0x044 PM_TMR : Uint4B
+0x048 GP0_BLK : Uint4B
+0x04c GP0_ENABLE : Uint4B
+0x050 GP0_LEN : UChar
+0x052 Gpe0Size : Uint2B
+0x054 GP1_BLK : Uint4B
+0x058 GP1_ENABLE : Uint4B
+0x05c GP1_LEN : UChar
+0x05e Gpe1Size : Uint2B
+0x060 GP1_Base_Index : Uint2B
+0x062 GpeSize : Uint2B
+0x064 SMI_CMD : Uint4B
+0x068 pm1_en_bits : Uint2B
+0x06a pm1_wake_mask : Uint2B
+0x06c pm1_wake_status : Uint2B
+0x06e c2_latency : Uint2B
+0x070 c3_latency : Uint2B
+0x074 ACPI_Flags : Uint4B
+0x078 ACPI_Capabilities : Uint4B
+0x07c Dockable : UChar
kd> dx -id 0,0,ffffffff87de2548 -r1 ((ACPI!_FADT *)0xffd07010)
((ACPI!_FADT *)0xffd07010) : 0xffd07010 [Type: _FADT *]
[+0x000] Header [Type: _DESCRIPTION_HEADER]
[+0x024] facs : 0x3fefffc0 [Type: unsigned long]
[+0x028] dsdt : 0x3fee1652 [Type: unsigned long]
[+0x02c] int_model : 0x0 [Type: unsigned char]
[+0x02d] pm_profile : 0x0 [Type: unsigned char]
[+0x02e] sci_int_vector : 0x9 [Type: unsigned short]
[+0x030] smi_cmd_io_port : 0xb2 [Type: unsigned long] ;<---SMI_CMD
[+0x034] acpi_on_value : 0xf0 [Type: unsigned char] ;<---ACPI_ENABLE
[+0x035] acpi_off_value : 0xf1 [Type: unsigned char]
//busdrv\acpi\driver\shared\acpiio.h
#define WRITE_ACPI_REGISTER(AcpiReg, Register, Value) ((*AcpiWriteRegisterRoutine)((AcpiReg), (Register), (Value)))
//busdrv\acpi\driver\shared\acpiio.c:
PWRITE_ACPI_REGISTER AcpiWriteRegisterRoutine = DefWriteAcpiRegister;
VOID
DefWriteAcpiRegister(
ACPI_REG_TYPE AcpiReg,
ULONG Register,
USHORT Value
)
/*++
Routine Description:
Write to the specified ACPI fixed register.
Arguments:
AcpiReg - Specifies which ACPI fixed register to write to.
Register - Specifies which GP register to write to. Not used for PM1x
registers.
Value - Data to write.
Return Value:
None.
--*/
{
switch (AcpiReg) {
..
case SMI_CMD:
WRITE_PORT_UCHAR((PUCHAR)AcpiInformation->SMI_CMD, (UCHAR)Value);
break;
default:
break;
}
}
看雪ID:hyjxiaobia
https://bbs.pediy.com/user-home-399589.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!