- 积分
- 64
- 最后登录
- 2020-6-18
- 精华
- 0
- 阅读权限
- 20
- 主题
- 9
- UID
- 1616297
- 帖子
- 160
- PB币
- 283
- 威望
- 0
- 贡献
- 0
- 技术
- 0
- 活跃
- 637
- UID
- 1616297
- 帖子
- 160
- PB币
- 283
- 贡献
- 0
- 技术
- 0
- 活跃
- 637
|
本帖最后由 codemoon 于 2016-11-23 13:05 编辑
为大家翻译一篇RehabMan的帖子回复,大概意思是让HackrNVMeFamily驱动与原生NVMe驱动共存,这样就可以在系统直升新版后不必立即破解新版的原生NVMe驱动,感觉很厉害。
如RehabMan在patch-nvme的repo简介说过的,如果他找到了更好的方案,他会更新上来,刚好中午休息我看见了,于是就根据原贴来一个翻译吧,原贴:http://www.insanelymac.com/forum ... age-29#entry2322636。
下文提到的原生NVMe驱动指:IONVMeFamily.kext
破解脚本生成的NVMe驱动指:HackrNVMeFamily*.kext
========================================================
这个方法的原理是伪造一个不存在于原生驱动的IOPCIClassMatch取值范围内的class-code来让其不加载。
分两步实现:
1. 注入一个“非常规”的class-code使得原生NVMe驱动不加载
2. 修改HackrNVMeFamily*.kext的Info.plist里的IOPCIClassMatch的值
要注入一个伪造的class-code,我选择用ACPI的方式(用一个SSDT)。前提是你必须知道你的SSD在PCI0设备的路径是什么。
以我的NUC6i7KYK机子为例,路径是_SB.PCI0.RP13.PXSX,这个每台电脑都不一定相同的,和你的ACPI表、SSD插在哪个槽都有关,你可以用 ioreg 或者 Windows设备管理器 来确定,如下图。
因此,用于注入非常规class-code的SSDT代码:
- // Inject bogus class code for NVMe SSD so that native IONVMeFamily.kext does not load
- DefinitionBlock("", "SSDT", 2, "hack", "NVMe-Pcc", 0)
- {
- External(_SB.PCI0.RP13.PXSX, DeviceObj)
- Method(_SB.PCI0.RP13.PXSX._DSM, 4)
- {
- If (!Arg2) { Return (Buffer() { 0x03 } ) }
- Return(Package()
- {
- "class-code", Buffer() { 0xff, 0x08, 0x01, 0x00 },
- })
- }
- }
- //EOF
复制代码
在这个SSDT被加载之后,HackrNVMeFamily*.kext(破解脚本生成的驱动)和 原生NVMe驱动 都不会加载了,因为IOPCIClassMatch的值不匹配。
我们需要修改HackrNVMeFamily*.kext的IOPCIClassMatch的值为我们的非常规class-code:0x0108ff00&0xFFFFFF00。
如果你是用文本编辑器改plist的话:<key>IOPCIClassMatch</key>
<string>0x0108ff00&0xFFFFFF00</string>
高端点,用Xcode改的话:
你可以把这种方法用于引导安装OSX或者用于安装好系统之后,它可以让你在系统升级之后依然能够使用HackrNVMeFamily*.kext来驱动,直到你想为新的原生NVMe驱动打破解补丁为止。
当然也可以用config.plist/Devices/Arbitrary来注入伪造的class-code。
在Clover的引导画面,你可以按F2键来得到preboot.log(生成在EFI/Clover/misc/preboot.log),它可以帮你确定PCI设备的地址。
- 0:100 0:000 === [ GetDevices ] ========================================
- 0:100 0:000 PCI (00|00:00.00) : 8086 1910 class=060000
- 0:100 0:000 PCI (00|00:02.00) : 8086 193B class=030000
- 0:100 0:000 - GFX: Model=Intel Iris Graphics P580 (Intel)
- 0:100 0:000 PCI (00|00:08.00) : 8086 1911 class=088000
- 0:100 0:000 PCI (00|00:14.00) : 8086 A12F class=0C0330
- 0:100 0:000 PCI (00|00:14.02) : 8086 A131 class=118000
- 0:100 0:000 PCI (00|00:16.00) : 8086 A13A class=078000
- 0:100 0:000 PCI (00|00:1D.00) : 8086 A118 class=060400
- 0:100 0:000 PCI (00|01:00.00) : 144D A801 class=010601
- 0:100 0:000 PCI (00|00:1D.04) : 8086 A11C class=060400
- 0:100 0:000 PCI (00|02:00.00) : 144D A802 class=010802
- 0:100 0:000 PCI (00|00:1F.00) : 8086 A14E class=060100
- 0:100 0:000 PCI (00|00:1F.02) : 8086 A121 class=058000
- 0:100 0:000 PCI (00|00:1F.03) : 8086 A170 class=040300
- 0:100 0:000 PCI (00|00:1F.04) : 8086 A123 class=0C0500
- 0:100 0:000 PCI (00|00:1F.06) : 8086 15B7 class=020000
复制代码
你可以看到950 Pro NVMe在PCI地址:02:00.00(设备:144d:a802,注意常规的NVMe class是:010802)
因此,在Devices/Arbitrary里这样填:
值得注意的是,当你启用了Devices/Arbitrary,所有Clover自动注入的项目都会被取消掉(例如Graphics/Inject里的内容),因此,那些自动注入项都要你自己手动在Devices/Arbitrary或者ACPI里再注入一次。
========================================================
好了,翻译完了,说说我是怎么做的。
1. 用ioreg找到自己的NVMe SSD所在的PCI位置路径,我的是_SB.PCI0.RP09.PXSX。
2. 用RehabMan的脚本生成破解的HackrNVMeFamily*.kext驱动,手动修改驱动的Info.plist,把IOPCIClassMatch改成:0x0108ff00&0xFFFFFF00,我用plistEditPro改的,然后安装到/Library/Extensions里,把原生NVMe驱动放回原来的S/L/E里。清除缓存。
3. 用上面的SSDT代码生成一个SSDT-NVMe.aml,放到ACPI/patched里加载,重启。重启完一切正常,在系统信息里查看IONVMeFamily.kext是没有载入的,签名是Apple的。
4. 有系统升级时照常升级,等新版本的NVMe破解脚本出来后再执行一次第2步(现在是10.12.1了,还没有新版让我测试直接升级)。
|
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
-
3
查看全部评分
-
|