Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

搜索
查看: 10171|回复: 93

[分享] 让HackrNVMeFamily驱动与原生NVMe驱动共存 [复制链接]

Rank: 2Rank: 2

UID
1616297
帖子
160
PB币
283
贡献
0
技术
0
活跃
615
发表于 2016-11-22 15:42:35 |显示全部楼层
本帖最后由 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代码:


  1. // Inject bogus class code for NVMe SSD so that native IONVMeFamily.kext does not load
  2. DefinitionBlock("", "SSDT", 2, "hack", "NVMe-Pcc", 0)
  3. {
  4.     External(_SB.PCI0.RP13.PXSX, DeviceObj)
  5.     Method(_SB.PCI0.RP13.PXSX._DSM, 4)
  6.     {
  7.         If (!Arg2) { Return (Buffer() { 0x03 } ) }
  8.         Return(Package()
  9.         {
  10.             "class-code", Buffer() { 0xff, 0x08, 0x01, 0x00 },
  11.         })
  12.     }
  13. }
  14. //EOF
复制代码

在这个SSDT被加载之后,HackrNVMeFamily*.kext(破解脚本生成的驱动)和 原生NVMe驱动 都不会加载了,因为IOPCIClassMatch的值不匹配。


我们需要修改HackrNVMeFamily*.kext的IOPCIClassMatch的值为我们的非常规class-code:0x0108ff00&0xFFFFFF00


如果你是用文本编辑器改plist的话:
<key>IOPCIClassMatch</key>
<string>0x0108ff00&amp;0xFFFFFF00</string>


高端点,用Xcode改的话:



你可以把这种方法用于引导安装OSX或者用于安装好系统之后,它可以让你在系统升级之后依然能够使用HackrNVMeFamily*.kext来驱动,直到你想为新的原生NVMe驱动打破解补丁为止。


当然也可以用config.plist/Devices/Arbitrary来注入伪造的class-code。
在Clover的引导画面,你可以按F2键来得到preboot.log(生成在EFI/Clover/misc/preboot.log),它可以帮你确定PCI设备的地址。
  1. 0:100  0:000  === [ GetDevices ] ========================================
  2. 0:100  0:000  PCI (00|00:00.00) : 8086 1910 class=060000
  3. 0:100  0:000  PCI (00|00:02.00) : 8086 193B class=030000
  4. 0:100  0:000   - GFX: Model=Intel Iris Graphics P580 (Intel)
  5. 0:100  0:000  PCI (00|00:08.00) : 8086 1911 class=088000
  6. 0:100  0:000  PCI (00|00:14.00) : 8086 A12F class=0C0330
  7. 0:100  0:000  PCI (00|00:14.02) : 8086 A131 class=118000
  8. 0:100  0:000  PCI (00|00:16.00) : 8086 A13A class=078000
  9. 0:100  0:000  PCI (00|00:1D.00) : 8086 A118 class=060400
  10. 0:100  0:000  PCI (00|01:00.00) : 144D A801 class=010601
  11. 0:100  0:000  PCI (00|00:1D.04) : 8086 A11C class=060400
  12. 0:100  0:000  PCI (00|02:00.00) : 144D A802 class=010802
  13. 0:100  0:000  PCI (00|00:1F.00) : 8086 A14E class=060100
  14. 0:100  0:000  PCI (00|00:1F.02) : 8086 A121 class=058000
  15. 0:100  0:000  PCI (00|00:1F.03) : 8086 A170 class=040300
  16. 0:100  0:000  PCI (00|00:1F.04) : 8086 A123 class=0C0500
  17. 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

查看全部评分

Rank: 2Rank: 2

UID
1616297
帖子
160
PB币
283
贡献
0
技术
0
活跃
615
发表于 2016-11-22 15:57:10 |显示全部楼层
学会了要自沙发一下,不然有时候内容少了都没法加。

Rank: 2Rank: 2

UID
2287998
帖子
74
PB币
10
贡献
0
技术
0
活跃
142
发表于 2016-11-22 15:59:28 |显示全部楼层
谢谢分享啊

Rank: 1

UID
4810606
帖子
44
PB币
36
贡献
0
技术
0
活跃
110
发表于 2016-11-22 16:03:21 |显示全部楼层
6i7雷电3驱动能加载吗?

Rank: 5Rank: 5Rank: 5

UID
2754483
帖子
725
PB币
375
贡献
0
技术
0
活跃
784
发表于 2016-11-22 16:15:51 |显示全部楼层
收藏备用。

Rank: 7Rank: 7Rank: 7

UID
1430546
帖子
1532
PB币
699
贡献
0
技术
9
活跃
1729
发表于 2016-11-22 17:45:26 |显示全部楼层
还在用clover打补丁的方法

Rank: 7Rank: 7Rank: 7

UID
713168
帖子
1389
PB币
2
贡献
0
技术
6
活跃
1958
发表于 2016-11-22 18:05:58 |显示全部楼层
谢谢楼主分享

残疾人士

Rank: 2Rank: 2

UID
834032
帖子
82
PB币
45
贡献
0
技术
0
活跃
167
发表于 2016-11-22 18:47:32 |显示全部楼层
还在用打补丁的方式。。。收藏一下

苦逼的医学生。。。考试月勿扰,扣扣一概不回!

Rank: 11Rank: 11Rank: 11

UID
2043294
帖子
4558
PB币
317
贡献
0
技术
151
活跃
2053

7周年庆典勋章 8周年庆典勋章 我是大学生!

发表于 2016-11-22 18:56:53 来自手机 |显示全部楼层
这样的话是不是可以不需要破解了?

Rank: 2Rank: 2

UID
1616297
帖子
160
PB币
283
贡献
0
技术
0
活跃
615
发表于 2016-11-22 20:01:41 |显示全部楼层
烦躁,又被论坛编辑器坑了。
编辑的时候又不能预览,发布之后又不能修改。
各位能看到的话,请记得文本编辑器编辑的时候应该是:
<string>0x0108ff00&amp;0xFFFFFF00</string>

Rank: 2Rank: 2

UID
1616297
帖子
160
PB币
283
贡献
0
技术
0
活跃
615
发表于 2016-11-22 20:03:44 |显示全部楼层
gujiangjiang 发表于 2016-11-22 18:56
这样的话是不是可以不需要破解了?

需要,只是不怕新版系统出来后要等新补丁出来才敢升,共存之后可以直接升系统了,依然可以用旧破解NVMe驱动。

苦逼的医学生。。。考试月勿扰,扣扣一概不回!

Rank: 11Rank: 11Rank: 11

UID
2043294
帖子
4558
PB币
317
贡献
0
技术
151
活跃
2053

7周年庆典勋章 8周年庆典勋章 我是大学生!

发表于 2016-11-22 20:09:31 来自手机 |显示全部楼层
codemoon 发表于 2016-11-22 20:03
需要,只是不怕新版系统出来后要等新补丁出来才敢升,共存之后可以直接升系统了,依然可以用旧破解NVMe驱 ...

看这个样子貌似是不需要破解直接用这个kext和ssdt就可以了。。。

Rank: 2Rank: 2

UID
1616297
帖子
160
PB币
283
贡献
0
技术
0
活跃
615
发表于 2016-11-22 21:18:06 |显示全部楼层
gujiangjiang 发表于 2016-11-22 20:09
看这个样子貌似是不需要破解直接用这个kext和ssdt就可以了。。。

有点这个意思,如果苹果的NVMe驱动不大升级的话,用新版旧版也没多大区别的情况下,直接用破解脚本生成的NVMe驱动配那个SSDT就好了,不用管原生的了。

Rank: 7Rank: 7Rank: 7

UID
713168
帖子
1389
PB币
2
贡献
0
技术
6
活跃
1958
发表于 2016-11-22 22:06:04 |显示全部楼层
楼主您好,能把你生成的ssdt,共享一下吗

Rank: 2Rank: 2

UID
1616297
帖子
160
PB币
283
贡献
0
技术
0
活跃
615
发表于 2016-11-22 22:16:56 |显示全部楼层
loonyeo 发表于 2016-11-22 22:06
楼主您好,能把你生成的ssdt,共享一下吗

把代码复制到Maciasl里另存为AML就好了,不过记得改你的NVMe SSD所在的PCI0路径,不通用

苦逼的医学生。。。考试月勿扰,扣扣一概不回!

Rank: 11Rank: 11Rank: 11

UID
2043294
帖子
4558
PB币
317
贡献
0
技术
151
活跃
2053

7周年庆典勋章 8周年庆典勋章 我是大学生!

发表于 2016-11-22 22:33:57 |显示全部楼层
问一下, 用这个方法驱动nvme之后,查看本机nvme设备显示为什么?trim开启了么?还是不是原生驱动了?

Rank: 5Rank: 5Rank: 5

UID
4763750
帖子
897
PB币
1753
贡献
0
技术
0
活跃
1296

十一周年

发表于 2016-11-22 23:09:39 |显示全部楼层
很不错的帖子,多谢楼主分享

Rank: 7Rank: 7Rank: 7

UID
713168
帖子
1389
PB币
2
贡献
0
技术
6
活跃
1958
发表于 2016-11-23 01:03:04 |显示全部楼层
codemoon 发表于 2016-11-22 22:16
把代码复制到Maciasl里另存为AML就好了,不过记得改你的NVMe SSD所在的PCI0路径,不通用

谢谢楼主回复

苦逼的医学生。。。考试月勿扰,扣扣一概不回!

Rank: 11Rank: 11Rank: 11

UID
2043294
帖子
4558
PB币
317
贡献
0
技术
151
活跃
2053

7周年庆典勋章 8周年庆典勋章 我是大学生!

发表于 2016-11-23 01:24:30 |显示全部楼层
楼主你好,我的也是_SB.PCI0.RP09.PXSX,但是根据你说的加载ssdt和那个hack驱动之后,我进安装盘没有看到我的nvme的硬盘,貌似不行。。。

Rank: 2Rank: 2

UID
1616297
帖子
160
PB币
283
贡献
0
技术
0
活跃
615
发表于 2016-11-23 08:39:58 |显示全部楼层
gujiangjiang 发表于 2016-11-23 01:24
楼主你好,我的也是_SB.PCI0.RP09.PXSX,但是根据你说的加载ssdt和那个hack驱动之后,我进安装盘没有看到我 ...

注意要修改Hack驱动的Info.plist,文章发上论坛就自动给我转码出错了,如果你是用文本编辑器改的,注意看看10楼,确保你没有改错。

还有就是文章所说的SSDT当然是配合Hack驱动来使用的,如果你想进安装盘就可以识别NVMe SSD,Hack驱动要放Clover里,无需PikeRAlpha的KextPatches。
理论上只要Clover加载驱动不失败,这个修改后的Hack驱动根本不需要安装到L/E里(不过有涉及内存效率的问题,听说L/E里的效率高点,具体不清楚)
回顶部
Copyright (C) 2005-2019 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛 | 电脑硬件 | 安卓软件