为了应付考试,同事发来了Brain Dump,由于题目是通过iPhone手机拍的,所以图片尺寸很大,足足有140多兆。其实我根本用不了这么高的精度,因此,想对这些图片进行批量处理,缩小图片尺寸。经过Google,发现这事儿很简单,只需一行命令即可:

sips -Z 640 *.JPG

注:我记不得sips是不是原生命令了,另外,我这里用了640,你也可以根据自己的需求改成其它值来控制图片大小。最后处理完我看了下,具然总文件尺寸减到了6兆,打开每张看了看,能用!

开发环境:Xcode 8.2.1 on Sierra

新建项目时选择:Generic Kernel Extention

测试代码如下:

#include <mach/mach_types.h>
#include <libkern/libkern.h>

kern_return_t HelloWorld_start(kmod_info_t * ki, void *d);
kern_return_t HelloWorld_stop(kmod_info_t *ki, void *d);

kern_return_t HelloWorld_start(kmod_info_t * ki, void *d)
{
    printf("Hello World\n");
    return KERN_SUCCESS;
}

kern_return_t HelloWorld_stop(kmod_info_t *ki, void *d)
{
    printf("Goodbye World\n");
    return KERN_SUCCESS;
}

注:无需引入 Kernel.framework

修改Info.plist,在OSBundleLibraries下面添加如下项:

com.apple.kpi.libkern String 16.3

这里的16.3怎么来的?当然,有公式可以算出来,但是更简单的办法是通过以下命令:

kextlibs HelloWorld.kext

输出如下:

For all architectures:
    com.apple.kpi.libkern = 16.3

这个16.3就是了!

编译后将生成的HelloWorld.kext(在xcode中右键点击Products下的HelloWorld.kext)复制到桌面,执行以下命令:

sudo chown -R root:wheel HelloWorld.kext
sudo kextutil HelloWorld.kext //此处用kextload也可以,用kextutil的好处是可以看到更多的诊断信息

查看输出,Sierra中看内核日志与以前版本不同,不能使用Console.app了,要输入以下命令:

log show --predicate "processID == 0" --start 2016-12-23 --debug |grep HelloWorld

命令输出:

2016-12-23 22:29:22.596949+0800 0x2f419    Default     0x0                  0      kernel: (HelloWorld) Hello World

卸载:

sudo kextunload HelloWorld.kext

为黑苹果重新定义功能键是件很烦的事儿,以前一直听说Karabiner这款软件,可是还没等我试用,就听说这软件还未支持10.12。今天无意中找到了支持10.12的替代品Karabiner-Elements。我也懒得研究这两款软件的关系了,反正能用就行,装好后发现这货默认就将功能键映射好了,例如:F1/F2控制屏幕亮度。这个梗总算解决了,我的强迫症又得到了满足。

通常安装完系统后,在进入Clover菜单选择Recovery分区后是进不去的,对于我这种完美强迫症患者来说这是不能忍的,最后,终于在网上找到个简单办法让它工作,废话不多说,上命令:

先找到Recovery分区的磁盘号

diskutil list

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *256.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Hackintosh HD           255.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                            Hackintosh HD          +254.8 GB   disk1
                                 Logical Volume on disk0s2
                                 735275EA-AEDA-4B26-9081-D5100CE40CF5
                                 Unencrypted

显然,是disk0s3(一般是这个)

sudo mkdir /Volumes/Recovery\ HD

sudo mount -t hfs /dev/disk0s3 /Volumes/Recovery\ HD

cd /Volumes/Recovery\ HD/com.apple.recovery.boot

sudo rm -rf prelinkedkernel

sudo cp /System/Library/PrelinkedKernels/prelinkedkernel /Volumes/Recovery\ HD/com.apple.recovery.boot/

sudo touch prelinkedkernel

重启,妥了!

注:我测试用的机器是Toshiba Portege z30-b(HD5500),系统是10.12,进入Recovery分区后虽然显示了图形化系统,但是似乎鼠标有点问题,点击响应有点滞后,用键盘操作更方便些。

USB端口有个属性USBConnector,其取值有3个,分别是:0: USB2 type-A, 3: USB3 type-A, 255: proprietary。如果USB端口是个内部端口,例如:内置摄像头、蓝牙等,那么这个值应该取255。我们可以用IORegistryExplorer来查看一下这个值。

例如,我的系统显示如下:

Before Internal USB Fix

要修改这个值,我用的办法如下:

首先,要屏蔽苹果内部的遮罩器,方法很多,最简单的是通过Clover的DSDT Patch实现,这里就不详述了。由于我的笔记本只有USB3总线,也就是只有XHC,这个就简单了,啥都不用做。

其次,安装Rehabman的USBInjectAll.kext

最后,制作SSDT补丁,这个有点麻烦了。

1、 在项目https://github.com/RehabMan/OS-X-USB-Inject-All找模板,里有几个SSDT开头的就是,我是用SSDT-UIAC-ALL.dsl。

2、确定模板中的有效代码片段。通过工具软件DPCIManager找到USB总线的Vendor ID与Product ID,例如:我的是8086:9CB1,那么在SSDT-UIAC-ALL.dsl中只保留对应的片段。

3、确定每个内置设备对应的USB端口。查看系统报告,找到内置USB设备对应的Location ID,然后通过IORegistryExplorer搜索XHC,找到这些Location ID对应的端口号。

例如:

USB Location

从上图可以看出,我这个蓝牙设备对应的是HS08。找出所有对应设备,然后在模板中将其对应的代码值改为255即可,例如:

在我的系统中对应的是HS06、HS07、HS08。

修改后的代码如下:

// SSDT-UIAC-ALL.dsl
//
// This SSDT can be used as a template to build your own
// customization for USBInjectAll.kext.
//
// This SSDT contains all ports, so using it is the same as without
// a custom SSDT.  Delete ports that are not connected or ports you
// do not need.
//
// Change the UsbConnector or portType as needed to match your
// actual USB configuration.
//

DefinitionBlock ("", "SSDT", 2, "hack", "UIAC-ALL", 0)
{
    Device(UIAC)
    {
        Name(_HID, "UIA00000")

        Name(RMCF, Package()
        {
            "8086_9cb1", Package()
            {
                "port-count", Buffer() { 15, 0, 0, 0 },
                "ports", Package()
                {
                    "HS01", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 1, 0, 0, 0 },
                    },
                    "HS02", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 2, 0, 0, 0 },
                    },
                    "HS03", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 3, 0, 0, 0 },
                    },
                    "HS04", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 4, 0, 0, 0 },
                    },
                    "HS05", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 5, 0, 0, 0 },
                    },
                    "HS06", Package()
                    {
                        "UsbConnector", 255,
                        "port", Buffer() { 6, 0, 0, 0 },
                    },
                    "HS07", Package()
                    {
                        "UsbConnector", 255,
                        "port", Buffer() { 7, 0, 0, 0 },
                    },
                    "HS08", Package()
                    {
                        "UsbConnector", 255,
                        "port", Buffer() { 8, 0, 0, 0 },
                    },
                    "HS09", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 9, 0, 0, 0 },
                    },
                    "HS10", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 10, 0, 0, 0 },
                    },
                    "HS11", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 11, 0, 0, 0 },
                    },
                    "SSP1", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 12, 0, 0, 0 },
                    },
                    "SSP2", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 13, 0, 0, 0 },
                    },
                    "SSP3", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 14, 0, 0, 0 },
                    },
                    "SSP4", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 15, 0, 0, 0 },
                    },
                },
            },
        })
    }
}

//EOF

4、将此文件通过MaciASL编译,放入/EFI/EFI/CLOVER/ACPI/patched目录下,记得在config.plist的SortedOrder里加上此项。

修改后:

After Internal USB Fix

我查看了白苹果,内置设备确实是用的255,但是我并没有感觉这个值得不同对使用有什么影响(修改前是3,好象使用也不受什么影响),我原本是希望解决系统崩溃才修复这个问题的,但是似乎我的系统崩溃和这个没关系,不管怎么说,还是无限接近白苹果为主旨,至于背后的逻辑慢慢学习吧。