黑苹果 RTC0 与仿冒

黑苹果 RTC0 与仿冒

首先要判定是否需要这个,简单的来讲,如果通过 SSDTTIME 生成了 SSDT-RTCAWAC.aml, 那启用这一个 SSDT 就行了,不需要专门再去仿冒。

这是因为在原始 DSDT 中已经定义了 STA 函数,且其判断条件是看 STAS是否等于 1 ,

image-20250811200323852

在 DSDT 中查找 STAS,可以看到它被定义在 GNVS 域中,大小为 8bit,只有两个Device调用了这个变量。一个是 RTC,另外一个是 AWAC,AWAC则说,如果 STAS 为零,则启用 AWAC,由此可以看到 AWAC 和 RTC 不会同时启用。
image-20250811200446067

而SSDT-RTCAWAC 中,实际上就一句话,让STAS 等于 1,这样启用了 RTC,同时禁用了 AWAC

image-20250811200631733

这是比较简单的情况,那什么时候需要仿冒呢,RTC 的 STA 函数直接给的是返回 0,禁用。
image-20250811200816439

这个时候就需要仿冒了

可以在 SB.PCI0.LPCB 下定义一个新的 RTC,但是取名叫做 RTC0, 然后修改 STA 函数,给它返回值为 1,一直启用。这个时候,原来的 RTC 因为其自身代码中的STA 返回零而被禁用,内部代码不执行。 而 RTC0 因为 STA 返回为 1,从而执行从 RTC 复制过来的代码,代替了 RTC 的功能,仿冒成功。

DefinitionBlock ("", "SSDT", 2, "ACDT", "RTC0", 0)
{
    External (_SB_.PCI0.LPCB, DeviceObj)

    Scope (_SB.PCI0.LPCB)
    {
        Device (RTC0)
        {
            Name (_HID, EisaId ("PNP0B00"))
            Name (_CRS, ResourceTemplate ()
            {
                IO (Decode16,
                    0x0070,
                    0x0070,
                    0x01,
                    0x08,
                    )
                IRQNoFlags ()
                    {8}
            })
            Method (_STA, 0, NotSerialized)
            {
                If (_OSI ("Darwin"))
                {
                    Return (0x0F)
                }
                Else
                {
                    Return (0);
                }
            }
        }
    }
}

本期关键词 SSDTTime
关注公众号发送关键词获取资源

发表回复