syscl 发表于 2016-4-3 18:55

完美原生加载AppleHDA

注意: 本文需要一定AppleHDA的基础。
在开始之前,景友应该对一劳永逸!更新不再替换Kext(Kexts to patch)教程一文有所了解,在里面我们介绍了如何利用Clover,以及制作Info.plist(FakeSMC.kext/Contents/Info.plist/IOKitPersonalities)的例子来达到尽量不改动系统内核扩展的目的,这样做的好处有三个:1. 避免内核扩展中的“签署方”失效。2. 系统盘(/)更贴近白苹果原生, 系统更稳定。3. 除非内核扩展有重大的结构变化,我们可以轻松的更新操作系统,达到一劳永逸的目的。
也就是黑苹果后期的任务除了修缮bugs,另一个主要的精力便是化少为多(less is more), 尽可能的在最少改动系统的情况下达到完善系统功能。
在一劳永逸!更新不再替换Kext(Kexts to patch)教程一文当中,我们始终没有彻底解决的一个问题是如何彻底加载原声的声卡驱动,即在签署方没有任何变动的情况下驱动声卡,之前较好的解决方法是Pikeralpha的提议, 制作链接文件(ln -s)来驱动声卡并安装到/S*/L*/E* (或者/L*/E*),但这个做法还是没有办法避免引入新的第三方内核扩展, 这也是我们不愿意看到的. 一旦苹果彻底废除SIP(System Integrity Protection)开关, 之前所有对AppleHDA.kext进行破解的方法都会失效. 如果能够像FakeSMC.kext 那样经由引导工具注入系统,便可以绕过SIP以达到原生驱动AppleHDA的目的,这也是vit9696设计AppleALC.kext的目的。
前期准备1. 安装Xcode (with C++14)2. 下载AppleALC: git clone https://github.com/vit9696/AppleALC
参数设置驱动AppleHDA的几个条件:1. CodecID2. LayoutID 以及修改好的layoutXX.xml.zlib3. PlatformsID以及对应的Platform.zlib4. ALC的二进制补丁
下面我们以M3800上面的ALC668为例探讨如何用vit9696的方法原生加载AppleHDA.kext:
./AppleALC/Resources/ALC668/Info.plist:1. CodecID=283903592(与ALC668对应)2. Files/Layouts/Item0/        ID=1        Path=layout1.xml.zlib3. Patches: 熟悉 一劳永逸!更新不再替换Kext(Kexts to patch) 教程的朋友直接将二进制补丁复制粘贴到Patches下面,并删掉除了Find, Name, Replace以外的所有条目即可。关于Patches更详细的设置,我们会在这个例子展示完后详细陈述。4. 移除掉./AppleALC/Resources/ALC668/layout3.xml.zlib和PlatformsM.xml.zlib5. 复制已经制作好的layout1.zml.zlib 和 Platforms.xml.zlib到./AppleALC/Resources/ALC668/目录下6. 打开./AppleALC/Resources/PinConfigs.kext/Contents/Info.plist, 用制作好的HDAConfigDefault项目粘贴到IOKitPersonalities中。7. 打开 ./AppleALC.xcodeproj : Xcode->Product->Build For->Running;8. 将编译好的AppleALC.kext复制到引导工具(Clover: /EFI/CLOVER/kexts/10.11, Chameleon: /Extra/Extensions/)目录下,并且移除掉之前所有的二进制补丁和HDA注射驱动(Injector), 重启即可.附件中包含了我制作ALC668驱动所需要的最小模板.可以看到,AppleHDA已经变成了漂亮的加载,系统签署方也变成了"Software Signing, Apple Code Signing Certification Authority, Apple Root CA". 关于Patches条目设置详述1. 可以部分替代Clover的kexts to patch功能, 主要针对AppleHDA: 以开启M3800的HDMI音频输出为例.开启M3800/XPS15(9530)的HDMI音频需要把AppleHDAController中”3d0c0a00 00”替换成“3d0c0c00 00“,由于HD4600是在10.9(13)开始支持的, 最新的支持系统是10.11(15),因此这个补丁的作用范围是MinKernel=13~MaxKernel=15. 那么这个补丁就是:                        <dict>                                <key>MinKernel</key>                                <integer>13 </integer>                                <key>MaxKernel</key>                                <integer>15 </integer>                                <key>Find</key>                                <data>                                PQwKAAA=                                </data>                                <key>Name</key>                                <string>AppleHDAController</string>                                <key>Replace</key>                                <data>                                PQwMAAA=                                </data>                        </dict>
查看当前系统内核的命令是:uname -a | awk '{print $3}' | cut -c 1-2查看AppleALC.kext是否加载:kextstat | grep -i "AppleALC"至此我们便完成了所有的操作步骤。不得不提一下, 由于这个驱动还在迅速的完善中, 仍旧有很多的bug, 例如在本例中需要删除同样数量的配置文件来达到编译不出错的目的. 在我的GitHub上面有已经编译好的可供M3800/XPS15(9530)ALC668使用的AppleALC.kext,也可以作为模板参考。至此M3800彻底抛弃Injector驱动声卡的日子。
遇到耳机杂音的朋友仍然需要CodeCommander.kext来解决杂音问题.参考http://www.insanelymac.com/forum/topic/311293-applealc-—-dynamic-applehda-patching/
https://github.com/syscl/M3800/commit/2cdb7f920d3fe88fe26a0de366a66c232a663eef
////

syscl 发表于 2016-4-3 18:55

本帖最后由 syscl 于 2016-5-23 18:32 编辑

当前AppleALC.kext原生支持的芯片以及需要设置的layoutID


厂商声卡芯片修订/layoutID兼容最旧的内核版本兼容最新的内核版本
CreativeCA01320x100918 layout 11, 1213 (10.9)—
CirrusLogicCS42130x100100 layout 2813 (10.9)—
RealtekALC233layout 313 (10.9)—
RealtekALC235layout 313 (10.9)—
RealtekALC255layout 313 (10.9)—
RealtekALC260layout 1213 (10.9)—
RealtekALC268layout 313 (10.9)—
RealtekALC2690x100004, 0x100100, 0x100202, layout 1-8, 20, 27, 28, 2913 (10.9)—
RealtekALC2700x100100, layout 3, 4, 27, 2813 (10.9)—
RealtekALC2720x100001, layout 313 (10.9)—
RealtekALC275layout 313 (10.9)—
RealtekALC280layout 3, 413 (10.9)—
RealtekALC2820x100003, layout 3, 4, 27, 28, 8613 (10.9)—
RealtekALC283layout 3, 1113 (10.9)—
RealtekALC284layout 313 (10.9)—
RealtekALC288layout 313 (10.9)—
RealtekALC290layout 313 (10.9)—
RealtekALC292layout 1213 (10.9)—
RealtekALC6620x100101, layout 5, 713 (10.9)—
RealtekALC6630x100002, layout 3, 4, 2813 (10.9)—
RealtekALC665layout 12, 1313 (10.9)—
RealtekALC6680x100003, layout 3, 20, 27, 28, 2913 (10.9)—
RealtekALC670layout 1213 (10.9)—
RealtekALC8820x100101, layout 5, 713 (10.9)—
RealtekALC8830x100002, layout 713 (10.9)—
RealtekALC8850x100101, layout 1, 1213 (10.9)—
RealtekALC8870x100302, layout 1, 2, 3, 5, 7, 11, 12, 13 ,14, 15, 9913 (10.9)—
RealtekALC888/ALC12000x100101, 0x100001, 0x100202 layout 1, 2, 3, 5, 713 (10.9)—
RealtekALC8890x100004 layout 1, 1213 (10.9)—
RealtekALC8920x100302, layout 1, 2, 3, 5, 713 (10.9)—
RealtekALC898/ALC8990x100003, layout 1, 2, 313 (10.9)—
RealtekALC11500x100001 layout 1, 2, 3, 5, 712 (10.9)—
AnalogDevicesAD1988Blayout 5, 7, 1213 (10.9)—
AnalogDevicesAD2000Blayout 5, 713 (10.9)—
ConexantCX20583layout 313 (10.9)—
ConexantCX20585layout 313 (10.9)—
ConexantCX20588layout 313 (10.9)—
ConexantCX205900x100003, layout 3, 1213 (10.9)—
ConexantCX20724layout 313 (10.9)—
ConexantCX20751/20752layout 3, 2813 (10.9)—
ConexantCX20756layout 313 (10.9)—
ConexantCX20757layout 313 (10.9)—
IDTIDT92HD66C3/65layout 313 (10.9)—
IDTIDT92HD71B7Xlayout 313 (10.9)—
IDTIDT92HD75B2X5layout 313 (10.9)—
IDTIDT92HD75B3X5layout 3, 1113 (10.9)—
IDTIDT92HD99BXXlayout 313 (10.9)—
IDTIDT92HD87B1layout 313 (10.9)—
IDTIDT92HD81B1X5layout 313 (10.9)—
IDTIDT92HD87B1/3layout 1213 (10.9)—
IDTIDT92HD87B2/4layout 1213 (10.9)—
IDTIDT92HD91BXXlayout 313 (10.9)—
IDTIDT92HD93BXX0x100203, layout 1213 (10.9)—
IDTIDT92HD95layout 1213 (10.9)—
VIAVT18020x100000, layout 313 (10.9)—
VIAVT2020/20210x100100, layout 5, 713 (10.9)—
IntelHD4600 HDMIig-platform-id 0x0d22000313 (10.9)—
IntelHD4000 HDMIig-platform-id 0x01660003, 0x01660009, 0x0166000A13 (10.9)—

syscl 发表于 2016-4-3 18:56

本帖最后由 syscl 于 2016-6-27 17:44 编辑

在我的建议下vit9696 增加了M3800/XPS9530 ALC668的支持,LayoutID=27.参见更新日志:https://github.com/vit9696/AppleALC/commit/878c2083497262938eeb2b406de5daac699f571b


根据andything 的反馈,再给各位提醒一下: DSDT/SSDT/引导程序中需要注入对应的LayoutID.(虽然本文假定各位熟悉AppleHDA.kext, 但是切记不要漏了注入对应的LayoutID).

感谢andything 在#140的反馈,新版本可以手动删除多余的platforms.xml.zlib, layoutXX.xml.zlib文件而不会出错了. 这样使得AppleALC.kext 的体积由848KB缩小到340KB.

感谢ic005k在#303的反馈, 现在Clover可以注入CodecCommander.kext了, 也就是说我们可以把CodecCommander.kext 放在/EFI/Clover/kexts/中而让系统盘(/)彻底干净了. 附上M3800的截图:






根据部分景友的反馈, 由于网速和没有Xcode的问题, 增加最新编译的AppleALC.kext(供网络访问异常的朋友下载).

[1.0.12] AppleALC.kext
[1.0.10] AppleALC.kext
[1.0.7] AppleALC.kext

////




syscl 发表于 2016-4-3 18:56

本帖最后由 syscl 于 2016-4-11 11:55 编辑

关于Patches中Count参数的设置:


[*]需要工具Hex Fiend(官方下载地址)



Count - 表明需要替换二进制补丁的次数, 以M3800 HD4600(ig-platform-id=0x0A2E0008)开启HDMI音频为例:

[*]用Hex Fiend打开AppleHDA.kext/Contents/PlugIns/AppleHDAController/Contents/MacOS/AppleHDAController
[*]我们的目标是将AppleHDAController中"3d0c0a00 00"替换成"3d0c0c00 00", 因此我们要填入"3d0c0a00 00"出现的次数.
[*]Hex Fiend中搜索3d0c0a00 00 记录其出现的次数, 填入到Count中.

同时在Clover中打开UseIntelHDMI参数。

部分朋友可能需要在Clover中打开如下参数 FixHDA_8000。

关于声卡唤醒无声的问题,可以在AppleALC的Patch中增加如下配置
<key>KextsToPatch</key>
<array>
<dict>
    <key>Comment</key>
    <string>Sound wake (iMac) @chrome - applelife.ru</string>
    <key>Find</key>
    <data>
    QcaGQwEAAAA=
    </data>
    <key>Name</key>
    <string>AppleHDA</string>
    <key>Replace</key>
    <data>
    QcaGQwEAAAE=
    </data>
</dict>
<dict>
    <key>Comment</key>
    <string>Sound wake (MacPro) @chrome - applelife.ru</string>
    <key>Find</key>
    <data>
    QcYGAEiLu2g=
    </data>
    <key>Name</key>
    <string>AppleHDA</string>
    <key>Replace</key>
    <data>
    QcYGAUiLu2g=
    </data>
</dict>
</array>


////

口袋妖怪heart 发表于 2016-4-3 18:58

5F咯= =
为了达到“专业化” 也可以额外制作注入configdata的空壳kext吧?
然后用Clover注入这个空壳kext

syscl 发表于 2016-4-3 18:59

口袋妖怪heart 发表于 2016-4-3 18:58 https://www.pcbeta.com/static/image/common/back.gif
5F咯= =
为了达到“专业化” 也可以额外制作注入configdata的空壳kext吧?
然后用Clover注入这个空壳kext

PinConfigs.kext就是你说的那个空壳,但是注入的方式的都是一样的。

////

tanpengsccd 发表于 2016-4-3 18:59

前排前排。请问 alc272 可以这样搞嘛?

syscl 发表于 2016-4-3 19:00

tanpengsccd 发表于 2016-4-3 18:59 https://www.pcbeta.com/static/image/common/back.gif
前排前排。请问 alc272 可以这样搞嘛?

可以,只要你之前成功驱动了(非voodooHDA.kext),就可以这样搞.

////

口袋妖怪heart 发表于 2016-4-3 19:01

syscl 发表于 2016-4-3 18:59
PinConfigs.kext就是你说的那个空壳,但是注入的方式的都是一样的。

////

嗯 估计还是改了高版本 比如999.99.9什么的
好处就是 configdata可以通过Clover注入
算了懒得换方法 反正我的kext也都是放LE的 Injector也一样~

syscl 发表于 2016-4-3 19:10

口袋妖怪heart 发表于 2016-4-3 19:01 https://www.pcbeta.com/static/image/common/back.gif
嗯 估计还是改了高版本 比如999.99.9什么的
好处就是 configdata可以通过Clover注入
算了懒得换方法 反 ...

没有改高版本,什么都没有改。这个驱动的目的就是原生加载AppleHDA
////

MemX 发表于 2016-4-3 19:13

这个以后升级系统会丢失声卡么?

口袋妖怪heart 发表于 2016-4-3 19:13

syscl 发表于 2016-4-3 19:10
没有改高版本,什么都没有改。这个驱动的目的就是原生加载AppleHDA
////

嗯 got it.
那个kext把版本移除了 与改高版本Info类似

syscl 发表于 2016-4-3 19:14

MemX 发表于 2016-4-3 19:13 https://www.pcbeta.com/static/image/common/back.gif
这个以后升级系统会丢失声卡么?

除非是结构有重大改动,否则不用担心.

////

syscl 发表于 2016-4-3 19:14

口袋妖怪heart 发表于 2016-4-3 19:13 https://www.pcbeta.com/static/image/common/back.gif
嗯 got it.
那个kext把版本移除了 与改高版本Info类似

没有= =

////

口袋妖怪heart 发表于 2016-4-3 19:19

syscl 发表于 2016-4-3 19:14
没有= =

////

QQ上给你发下PM吧= =

303734056 发表于 2016-4-3 19:22

好贴,赞一个

口袋妖怪heart 发表于 2016-4-3 19:32

以下内容均为个人理解 & 猜测:
对二进制文件打补丁 应该是和clover的kextpatch功能类似 给kernelcache打补丁 也就是间接修改了二进制文件。
节点与configdata的方式 应该与dummy法无异。(zlib节点通过AppleALC.kext注入 configdata用PinConfigs.kext注入 只是这种“dummy”方式可以用Clover的kext注入功能吧

口袋妖怪heart 发表于 2016-4-3 19:38

Additionally:
我觉得Apple应该不会废除SIP的开关 毕竟开发者们调试还是需要关闭掉许多保护 比如dtrace等等
而且 2015年的iOS 9、OS X 10.11注重的是安全性的更新(最典型的就是SIP)UI上并没有太大的革新。
今年就是iOS X了 我想今年应该就是会朝着UI的改革了。OS X应该也会随之有很大变动。毕竟root不会变成administrator的 不是咩?lol
Anyway,who knows?Everything will be clear after WWDC 2016.

小7seven 发表于 2016-4-3 19:58

仿冒驱动还没搞定

syscl 发表于 2016-4-3 20:01

口袋妖怪heart 发表于 2016-4-3 19:38 https://www.pcbeta.com/static/image/common/back.gif
Additionally:
我觉得Apple应该不会废除SIP的开关 毕竟开发者们调试还是需要关闭掉许多保护 比如dtrace等等 ...
这个不好说,从现在9.3以后强制升级来看,Apple真的要丸
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 完美原生加载AppleHDA