本帖最后由 wind315 于 2014-10-10 00:28 编辑
2014.10.10更新:升级到10.9.4之后,发现之前的方法不适用了,因为AppleHDA.kext/Contents/MacOS/AppleHDA中的跳转指令变成了jnbe(机器码77),指令长度也变为了2字节,再用之前的方法会跳转偏移会超过65535字节,所以1个字节的偏移已经不能适用了。因此改662声卡合体时,将声卡ID为0x11d41984来改。跳转指令也改用je(机器码74)两字节指令。这样不会更变原文件的大小,不会改变原文件的检验。计算跳转偏移地址的方法同原来的类似,只是必须保证偏移量的16进制数在1个字节以内。这里帖出改之前和改以后的指令差别。
合体改前汇编指令截图(已经将原的0x10ec0885直接替换为了0x10ec0889了):
第一次跳转
第二次跳转
合体以后汇编指令截图:第一次跳转修改后:将原来的jne(0x75)改为je(0x74),偏移量为:0x4a523-0x4a51a=0x09
第二次跳转修改后:将原来的jne(0x75)改为je(0x74),偏移量为:0x4c989-0x4c980=0x09
昨天顺利在线升级到10.8.4了,除了声卡驱动重新改了下,其他一切正常。不知道是否还会出现莫名死机问题,特来发帖留升级时间。目前未现死机现象。最后送昨晚改好的10.8.4的AppleHDA.kext,是我用的两个主板合体后的驱动,其中ALC662声卡在DSDT中的ID是12,ALC889声卡在DSDT中的ID是88。
AppleHDA.kext_10.9.5[13f17](alc889_alc662).zip
(1.25 MB, 下载次数: 246)
AppleHDA.kext_10.8.5(alc889_662).zip
(781.28 KB, 下载次数: 326)
AppleHDA.kext_10.8.4(alc889_662).zip
(748.42 KB, 下载次数: 456)
补充下DSDT,ALC662我使用的DSDT如下:
- Device (HDEF)
- {
- Name (_ADR, 0x001B0000)
- Method (_PRW, 0, NotSerialized)
- {
- Return (Package (0x02)
- {
- 0x05,
- 0x05
- })
- }
- Method (_DSM, 4, NotSerialized)
- {
- Store (Package (0x08)
- {
- "codec-id",
- Buffer (0x04)
- {
- 0x62, 0x06, 0xEC, 0x10
- },
- "layout-id",
- Buffer (0x04)
- {
- 0x0C, 0x00, 0x00, 0x00
- },
- "built-in",
- Buffer (One)
- {
- 0x01
- },
- "PinConfigurations",
- Buffer (Zero) {}
- }, Local0)
- DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
- Return (Local0)
- }
- }
-
复制代码 ALC889的DSDT如下:
- Device (HDEF)
- {
- Name (_ADR, 0x001B0000)
- Method (_PRW, 0, NotSerialized)
- {
- Return (Package (0x02)
- {
- 0x0D,
- 0x05
- })
- }
- Method (_DSM, 4, NotSerialized)
- {
- Store (Package (0x10)
- {
- "AAPL,slot-name",
- Buffer (0x09)
- {
- "Built In"
- },
- "built-in",
- Buffer (One)
- {
- 0x01
- },
- "device_type",
- Buffer (0x06)
- {
- "AUDIO"
- },
- "name",
- Buffer (0x0F)
- {
- "Realtek ALC889"
- },
- "model",
- Buffer (0x28)
- {
- "Realtek ALC889 HD High Definition Audio"
- },
- "layout-id",
- Unicode ("X"),
- "PinConfigurations",
- Buffer (Zero) {},
- "hda-gfx",
- Buffer (0x0A)
- {
- "onboard-1"
- }
- }, Local0)
- DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
- Return (Local0)
- }
- }
复制代码 祝各位顺利升级。
感谢69楼的兄弟提供改DSDT的工具下载地址,没有改DSDT的工具的去69楼
有朋友让给出合体方法,在此给出简单教程。
先列出所需要工具软件:
1.反汇编工具Hopper Disassembler2.8.1,去这里http://pan.baidu.com/s/1A9Eit下载
2.0xED 1.1.3二进制修改工具:
0xED.zip
(1.08 MB, 下载次数: 207)
思路:ALC889可以直接将原版AppleHDA.kext里的0x10EC0885替换成0x10EC0889就搞定。实际ALC662也是使用的原版驱动里面885声卡的代码,只是如果要合体的话,就必须另处设个判断条件,然后将代码转到检测885声卡的代码上去执行。具体合体步骤如下(此处只对如何合体作说明,具体改原版AppleHDA.kext,找坛里其他大侠的文章):
1.用Hopper反汇编AppleHDA.kext/Contents/MacOS/AppleHDA,查找0x10ec0885,会发现有两处检测885声卡(注意两次的地址要分清)。如图:
记下第一次出现的地址(上图中黄色部分)为:0x45259
记下第二次出现的地址为:0x47673
2.查找0x1aec87ff(将会用此声卡ID换成0x10ec0662的),也会发现有两处,如图:
如上图,第一次匹配时的代码:0f 8f 75 01 00 00 jg 0x452a0,我们要把此处的jg 0x452a0
改为je 0x45259,同时以将声卡ID由原来的0x1aec87ff改为0x10ec0662。也就是当检测声卡ID是0x10ec0662时,
跳转到原驱动885的代码去执行。这里请记下jg 0x452a0代码后的物理地址为0x4512B
改这里的代码时有两个难点:A.je条件跳转的机器码是什么?B.跳转的目标地址如何确定?这两个问题见步骤3。
如上图,第二次匹配时的代码:0f 8f 51 01 00 00 jg 0x476ba 此处和前面一样,要改声卡ID为0x10ec0662
跳转代码改为 je 0x47673,这里也要注意记下jg 0x476ba代码后的物理地址为0x47569
3.计算JE 指令的机器码,并用0xed修改。
A.64位程序的JE机器码为84 0f 后面跟具体的跳转地址。
B。如何确定跳转地址?JE指令使用偏移寻址,即跳转目标地址相对于当前的指令的偏移量。只要计算出偏移量,就可以直接修改机器码了。
第一次跳转的偏移量这样计算:0x45259-0x4512B=0x012e
第二次跳转的偏移量这样计算:0x47673-0x47569=0x010a
把上面的计算结果和机器码结合,得到最终的机器码修改如下
第一次跳转:
0f 8f 75 01 00 00 =>0f 84 2e 01 00 00 (也就是汇编代码jg 0x452a0 => je 0x45259) 第二次跳转: 0f 8f 51 01 00 00 =>0f 84 0a 01 00 00 (也就是汇编代码jg 0x476ba => je 0x47673) 4.用0xED软件打开AppleHDA.kext/Contents/MacOS/AppleHDA 查找0f 8f 75 01 00 00 ,并修改为0f 84 2e 01 00 00。 查找0f 8f 51 01 00 00,并修改为0f 84 0a 01 00 00。 5.再次用Hopper反汇编AppleHDA.kext/Contents/MacOS/AppleHDA,发现已经修改正确如下图: 第一次:
第二次:
文笔不好,有点乱,对照图理解,你也能合体你想要的驱动了。祝你成功!
|