Windows 下替换 ACPI Table补遗

之前介绍过 Windows 下替换 ACPI Table 的方法【参考1】,该方法可以替换 DSDT,但是最近工作中遇到需要修改的ACPI内容并不在 DSDT中,而是存放在 SSDT 中的情况,同时一个系统中还会有多个 SSDT。

打开注册表,在 Computer\HKEY_LOCAL_MACHINE\HARDWARE\ACPI  查找你需要的SSDT:

  打开注册表查看 ACPI Table

当然你可以先用 RW Everything 查看 ACPI Table 更加直观,SSDT 有很多个,彼此的 Signature 是相同的但是OEM Table ID 是不同的字符串:

RW Everything 查看ACPI Table

确定你要修改的SSDT,这里使用 OEM Table ID 为 “U_Rvp ”的这个 SSDT作为实验的目标:

    OEM Table ID 是 U_Rvp

上面提到的 U_Rvp 的 SSDT,在注册表中名称是SSD6:

注册表中的 SSD6 对应 RW Everything 中的 U_Rvp SSDT

接下来的操作和之前的类似

1.asl /tab=ssd6 /c保存成二进制文件:

2. 使用 iasl2016 -ve SSD60000.bin反编译之

3.修改代码,加入我们自定义的设备挂在 I2C 下面

4.再编译为 AML

5.asl /loadtable SSD60000.aml 加载这个 table

6.重启,进入设备管理器查看,再I2c 下面出现的一个 unknown 设备

设备管理器中的自定义设备
自定义设备属性

参考:

1. https://www.lab-z.com/arcpi/

2024年2月2日

iasl.exe -ve dsdt.iiii 其中的 -ve 意思是只输出错误信息,不输出 warning

iasl.exe -h 输出帮助信息

《Windows 下替换 ACPI Table补遗》有2个想法

  1. 可否直接替换Bios ACPI表呢?只是在原有基础做少许修改。还是说一定要源代码。作为小白,最近在弄黑苹果。然而有个问题,就是如果过选的关机,那下次一定是可以开机进系统MAC,但如果是在mac点的重启,就会有大几率进不了系统,显示禁止符号。我查看了ACPI表,他有个条件根据系统设置pci中断。不知道是否是这个原因。代码如下:
    Method (_PIC, 1, NotSerialized) // _PIC: Interrupt Model
    {
    If (Arg0)
    {
    DBG8 = 0xAA
    }
    Else
    {
    DBG8 = 0xAC
    }

    PICM = Arg0
    }

    Name (OSVR, Ones)
    Method (OSFL, 0, NotSerialized)
    {
    If ((OSVR != Ones))
    {
    Return (OSVR) /* \OSVR */
    }

    If ((PICM == Zero))
    {
    DBG8 = 0xAC
    }

    OSVR = 0x03
    If (CondRefOf (_OSI, Local0))
    {
    If (_OSI ("Windows 2001"))
    {
    OSVR = 0x04
    }

    If (_OSI ("Windows 2001.1"))
    {
    OSVR = 0x05
    }

    If (_OSI ("FreeBSD"))
    {
    OSVR = 0x06
    }

    If (_OSI ("HP-UX"))
    {
    OSVR = 0x07
    }

    If (_OSI ("OpenVMS"))
    {
    OSVR = 0x08
    }

    If (_OSI ("Windows 2001 SP1"))
    {
    OSVR = 0x09
    }

    If (_OSI ("Windows 2001 SP2"))
    {
    OSVR = 0x0A
    }

    If (_OSI ("Windows 2001 SP3"))
    {
    OSVR = 0x0B
    }

    If (_OSI ("Windows 2006"))
    {
    OSVR = 0x0C
    }

    If (_OSI ("Windows 2006 SP1"))
    {
    OSVR = 0x0D
    }

    If (_OSI ("Windows 2009"))
    {
    OSVR = 0x0E
    }

    If (_OSI ("Windows 2012"))
    {
    OSVR = 0x0F
    }

    If (_OSI ("Windows 2013"))
    {
    OSVR = 0x10
    }
    }
    Else
    {
    If (MCTH (_OS, "Microsoft Windows NT"))
    {
    OSVR = Zero
    }

    If (MCTH (_OS, "Microsoft Windows"))
    {
    OSVR = One
    }

    If (MCTH (_OS, "Microsoft WindowsME: Millennium Edition"))
    {
    OSVR = 0x02
    }

    If (MCTH (_OS, "Linux"))
    {
    OSVR = 0x03
    }

    If (MCTH (_OS, "FreeBSD"))
    {
    OSVR = 0x06
    }

    If (MCTH (_OS, "HP-UX"))
    {
    OSVR = 0x07
    }

    If (MCTH (_OS, "OpenVMS"))
    {
    OSVR = 0x08
    }
    }

    Return (OSVR) /* \OSVR */
    }

    Method (MCTH, 2, NotSerialized)
    {
    If ((SizeOf (Arg0) < SizeOf (Arg1)))
    {
    Return (Zero)
    }

    Local0 = (SizeOf (Arg0) + One)
    Name (BUF0, Buffer (Local0){})
    Name (BUF1, Buffer (Local0){})
    BUF0 = Arg0
    BUF1 = Arg1
    While (Local0)
    {
    Local0--
    If ((DerefOf (BUF0 [Local0]) != DerefOf (BUF1 [Local0]
    )))
    {
    Return (Zero)
    }
    }

    Return (One)
    }

    Name (PRWP, Package (0x02)
    {
    Zero,
    Zero
    })
    Method (GPRW, 2, NotSerialized)
    {
    PRWP [Zero] = Arg0
    Local0 = (SS1 << One)
    Local0 |= (SS2 << 0x02)
    Local0 |= (SS3 << 0x03)
    Local0 |= (SS4 << 0x04)
    If (((One <>= One
    If (((OSFL () == One) || (OSFL () == 0x02)))
    {
    FindSetLeftBit (Local0, PRWP [One])
    }
    Else
    {
    FindSetRightBit (Local0, PRWP [One])
    }
    }

    Return (PRWP) /* \PRWP */
    }

    Name (WAKP, Package (0x02)
    {
    Zero,
    Zero
    })
    OperationRegion (DEB0, SystemIO, 0x80, One)
    Field (DEB0, ByteAcc, NoLock, Preserve)
    {
    DBG8, 8
    }

    OperationRegion (DEB1, SystemIO, 0x90, 0x02)
    Field (DEB1, WordAcc, NoLock, Preserve)
    {
    DBG9, 16
    }

    Name (SS1, One)
    Name (SS2, Zero)
    Name (SS3, Zero)
    Name (SS4, One)
    Name (IOST, 0x0000)
    Name (TOPM, 0x00000000)
    Name (ROMS, 0xFFE00000)
    Name (VGAF, One

    1. 你的提问是2个问题:
      1.上述代码是否能解决问题。这个我没玩过,不知道唉。
      2.是否有直接修改 BIOS 中 ACPI 的方法。据我所知,没有source code,这个很难完成,因为里面校验太多了,没有签名key,修改替换之后是无法启动的。另外,你可以看一下苹果的 os 是否有在启动的时候替换 acpi table 的方法,这个我也不知道了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注