gpt4 book ai didi

macos - 强制使用特定驱动程序的无代码 kext (CDC-ACM)

转载 作者:行者123 更新时间:2023-12-04 02:16:25 28 4
gpt4 key购买 nike

我想知道是否有一种方法可以在 OS X 上以通用方式使用 USB 调制解调器(华为 E1550 种类),例如通用 USB 调制解调器。问题是操作系统不会将其识别为合法的 CDC ACM 设备(它是,但它没有宣传是这样的)。

在 Linux 上,加密狗被自动识别为 USB 串行设备。

我不希望在我的任何机器上同时使用 ZTE 和华为供应商驱动程序是有原因的:这些人编写的东西几乎无法正常工作(我上次使用 ZTE 驱动程序的经验涉及向我的日志发送垃圾邮件、占用 RAM,而我无法禁用它),他们的驱动程序不向前兼容,他们忽略了将它们与较新的操作系统版本同步,并且他们通常打算将这些驱动程序与运营商的英国媒体报道软件一起分发。

Apple 的开发人员文档以模糊的方式写道,可以编写无代码 kext 以强制匹配设备上的特定驱动程序,或阻止为匹配设备加载通用驱动程序。事实上,大多数对无代码 kext 的搜索都会产生诸如“如何防止我的串行加密狗被识别为调制解调器?”之类的问题,而我想要的却完全相反!

到目前为止,我编写这样一个无代码 kext 的尝试以失败告终——kextutil 告诉 kext 已成功加载,但它不存在,AppleCDCACM.kext 也是如此(它具有我想要使用的 IOClass)。

JFYI,从 Linux 收集的 lsusb 信息:

Bus 004 Device 005: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA ModemDevice Descriptor:  bLength                18  bDescriptorType         1  bcdUSB               2.00  bDeviceClass            0   bDeviceSubClass         0   bDeviceProtocol         0   bMaxPacketSize0        64  idVendor           0x12d1 Huawei Technologies Co., Ltd.  idProduct          0x1001 E169/E620/E800 HSDPA Modem  bcdDevice            0.00  iManufacturer           2 HUAWEI Technology  iProduct                1 HUAWEI Mobile  iSerial                 0   bNumConfigurations      1  Configuration Descriptor:    bLength                 9    bDescriptorType         2    wTotalLength           85    bNumInterfaces          3    bConfigurationValue     1    iConfiguration          3 Qualcomm Configuration    bmAttributes         0xe0      Self Powered      Remote Wakeup    MaxPower              500mA    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        0      bAlternateSetting       0      bNumEndpoints           3      bInterfaceClass       255 Vendor Specific Class      bInterfaceSubClass    255 Vendor Specific Subclass      bInterfaceProtocol    255 Vendor Specific Protocol      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x81  EP 1 IN        bmAttributes            3          Transfer Type            Interrupt          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0040  1x 64 bytes        bInterval               5      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x82  EP 2 IN        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0200  1x 512 bytes        bInterval              32      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x01  EP 1 OUT        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0200  1x 512 bytes        bInterval              32    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        1      bAlternateSetting       0      bNumEndpoints           2      bInterfaceClass       255 Vendor Specific Class      bInterfaceSubClass    255 Vendor Specific Subclass      bInterfaceProtocol    255 Vendor Specific Protocol      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x83  EP 3 IN        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0200  1x 512 bytes        bInterval              32      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x02  EP 2 OUT        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0200  1x 512 bytes        bInterval              32    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        2      bAlternateSetting       0      bNumEndpoints           2      bInterfaceClass       255 Vendor Specific Class      bInterfaceSubClass    255 Vendor Specific Subclass      bInterfaceProtocol    255 Vendor Specific Protocol      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x84  EP 4 IN        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0200  1x 512 bytes        bInterval              32      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x03  EP 3 OUT        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0200  1x 512 bytes        bInterval              32Device Qualifier (for other device speed):  bLength                10  bDescriptorType         6  bcdUSB               2.00  bDeviceClass            0   bDeviceSubClass         0   bDeviceProtocol         0   bMaxPacketSize0        64  bNumConfigurations      1can't get debug descriptor: Resource temporarily unavailableDevice Status:     0x0001  Self Powered

The interface I want to hook up is interface 0 (modem).

Here's how ioreg sees it:

   | |   |       | | +-o HUAWEI Mobile@1d110000      | |   |       | |   +-o AppleUSBHostLegacyClient      | |   |       | |   +-o AppleUSBHostCompositeDevice      | |   |       | |   +-o IOUSBHostInterface@0      | |   |       | |   |   {    | |   |       | |   |     "USBPortType" = 0    | |   |       | |   |     "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}    | |   |       | |   |     "bcdDevice" = 0    | |   |       | |   |     "USBSpeed" = 3    | |   |       | |   |     "idProduct" = 4097    | |   |       | |   |     "bConfigurationValue" = 1    | |   |       | |   |     "bInterfaceSubClass" = 255    | |   |       | |   |     "locationID" = 487653376    | |   |       | |   |     "IOGeneralInterest" = "IOCommand is not serializable"    | |   |       | |   |     "IOClassNameOverride" = "IOUSBInterface"    | |   |       | |   |     "AppleUSBAlternateServiceRegistryID" = 4294969542    | |   |       | |   |     "idVendor" = 4817    | |   |       | |   |     "bInterfaceProtocol" = 255    | |   |       | |   |     "bAlternateSetting" = 0    | |   |       | |   |     "bInterfaceNumber" = 0    | |   |       | |   |     "bInterfaceClass" = 255    | |   |       | |   |   }    | |   |       | |   |       | |   |       | |   +-o IOUSBHostInterface@1      | |   |       | |   |   {    | |   |       | |   |     "USBPortType" = 0    | |   |       | |   |     "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}    | |   |       | |   |     "bcdDevice" = 0    | |   |       | |   |     "USBSpeed" = 3    | |   |       | |   |     "idProduct" = 4097    | |   |       | |   |     "bConfigurationValue" = 1    | |   |       | |   |     "bInterfaceSubClass" = 255    | |   |       | |   |     "locationID" = 487653376    | |   |       | |   |     "IOGeneralInterest" = "IOCommand is not serializable"    | |   |       | |   |     "IOClassNameOverride" = "IOUSBInterface"    | |   |       | |   |     "AppleUSBAlternateServiceRegistryID" = 4294969544    | |   |       | |   |     "idVendor" = 4817    | |   |       | |   |     "bInterfaceProtocol" = 255    | |   |       | |   |     "bAlternateSetting" = 0    | |   |       | |   |     "bInterfaceNumber" = 1    | |   |       | |   |     "bInterfaceClass" = 255    | |   |       | |   |   }    | |   |       | |   |       | |   |       | |   +-o IOUSBHostInterface@2      | |   |       | |       {    | |   |       | |         "USBPortType" = 0    | |   |       | |         "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}    | |   |       | |         "bcdDevice" = 0    | |   |       | |         "USBSpeed" = 3    | |   |       | |         "idProduct" = 4097    | |   |       | |         "bConfigurationValue" = 1    | |   |       | |         "bInterfaceSubClass" = 255    | |   |       | |         "locationID" = 487653376    | |   |       | |         "IOGeneralInterest" = "IOCommand is not serializable"    | |   |       | |         "IOClassNameOverride" = "IOUSBInterface"    | |   |       | |         "AppleUSBAlternateServiceRegistryID" = 4294969546    | |   |       | |         "idVendor" = 4817    | |   |       | |         "bInterfaceProtocol" = 255    | |   |       | |         "bAlternateSetting" = 0    | |   |       | |         "bInterfaceNumber" = 2    | |   |       | |         "bInterfaceClass" = 255    | |   |       | |       }    | |   |       | |       

So far, the Info.plist looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>15C27b</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>name.fedevych.GenericWWAN</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>GenericWWAN</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>99.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>99.0.0</string>
<key>IOKitPersonalities</key>
<dict>
<key>HUAWEI_0x12d11001_Control</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.usb.cdc.acm</string>
<key>IOClass</key>
<string>AppleUSBACMControl</string>
<key>IOProviderClass</key>
<string>IOUSBHostInterface</string>

<key>idVendor</key>
<integer>4817</integer>
<key>idProduct</key>
<integer>4097</integer>
<key>bcdDevice</key>
<integer>0</integer>

<key>bInterfaceNumber</key>
<integer>0</integer>
<key>bConfigurationValue</key>
<integer>1</integer>

<key>IOMatchCategory</key>
<string>com.apple.driver.AppleUSBACMControl</string>
</dict>
<key>HUAWEI_0x12d11001_Data</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.usb.cdc.acm</string>
<key>IOClass</key>
<string>AppleUSBACMData</string>
<key>IOProviderClass</key>
<string>IOUSBHostInterface</string>

<key>idVendor</key>
<integer>4817</integer>
<key>idProduct</key>
<integer>4097</integer>
<key>bcdDevice</key>
<integer>0</integer>

<key>bInterfaceNumber</key>
<integer>0</integer>
<key>bConfigurationValue</key>
<integer>1</integer>

</dict>
</dict>
<key>OSBundleLibraries</key>
<dict/>
</dict>
</plist>

任何指针?

最佳答案

所以,我不能保证你的项目会成功——我不知道你的调制解调器是否能与标准的 CDC 驱动程序一起工作。但我希望能帮助你找出答案。这真的有5个部分:

  • 与相关设备/接口(interface)匹配的正确匹配字典。
  • 为实际驱动程序设置正确的类和包 ID。
  • 在无代码 kext
  • 的 info.plist 中需要注意的一些额外点
  • Kext 签名。
  • 加载/调试。

  • I/O 套件 USB 匹配

    苹果 Q&A QA1076是该主题的最佳资源。我建议尽可能具体。因此,在您的情况下,例如:
    IOProviderClass: IOUSBInterface
    idVendor: 0x12d1
    idProduct: 0x1001
    bInterfaceNumber: 0
    bConfigurationValue: 1

    我希望我做对了。您应该能够通过运行 ioreg -c IOUSBInterface 进行确认在插入设备时在终端中。这将以 OSX 的格式显示系统中所有 USB 接口(interface)的属性,您应该能够为您的调制解调器选择一个并确保这些属性与我的属性匹配给定的。

    驱动程序类和包 ID

    除了匹配条件之外,info.plist 中的 I/O Kit 个性字典需要指定应该创建实例以驱动匹配设备的 (C++) 类,以及包含的 kext 的捆绑 ID它。

    现在的问题是,使用什么驱动程序。我对 CDC-ACM 设备了解不多,但据我所知,它们由一个控件和一个数据接口(interface)组成。其驱动力似乎是
    /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDCACMControl.kext
    /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDCACMData.kext

    分别在 OSX 上。其中每一个似乎都假设他们可以完全控制 USB 接口(interface) - 似乎大多数设备将控制和数据端点拆分为 2 个单独的接口(interface)。在你的情况下,你只有一个。从技术上讲,多个驱动程序可以通过使用不同的匹配类别来匹配服务。但我不能保证 CDC-ACM 数据和控制驱动程序会对此感到满意。你可以试试…

    为此,您实际上需要两个具有相同匹配标准的 I/O 套件个性字典,但其中一个应该具有非默认 IOMatchCategory ,例如相关的驱动程序包 ID。

    所以尝试这样的事情:
    <key>IOKitPersonalities</key>
    <dict>
    <key>AppleUSBCDCACMControl</key>
    <dict>
    <key>CFBundleIdentifier</key>
    <string>com.apple.driver.AppleUSBCDCACMControl</string>
    <key>IOClass</key>
    <string>AppleUSBCDCACMControl</string>
    <key>IOProviderClass</key>
    <string>IOUSBInterface</string>
    <key>idVendor</key>
    <integer>4817</integer>
    <key>idProduct</key>
    <integer>4097</integer>
    <key>bInterfaceNumber</key>
    <integer>0</integer>
    <key>bConfigurationValue</key>
    <integer>1</integer>
    <key>IOMatchCategory</key>
    <string>com.apple.driver.AppleUSBCDCACMControl</string>
    </dict>
    <key>AppleUSBCDCACMData</key>
    <dict>
    <key>CFBundleIdentifier</key>
    <string>com.apple.driver.AppleUSBCDCACMData</string>
    <key>IOClass</key>
    <string>AppleUSBCDCACMData</string>
    <key>IOProviderClass</key>
    <string>IOUSBInterface</string>
    <key>IOUserClientClass</key>
    <string>AppleUSBCDCACMDataUserClient</string>
    <key>InputBuffers</key>
    <integer>8</integer>
    <key>OutputBuffers</key>
    <integer>16</integer>
    <key>idVendor</key>
    <integer>4817</integer>
    <key>idProduct</key>
    <integer>4097</integer>
    <key>bInterfaceNumber</key>
    <integer>0</integer>
    <key>bConfigurationValue</key>
    <integer>1</integer>
    </dict>
    </dict>

    无代码 kext info.plist

    由于您已经有一个 kextutil 似乎喜欢的 kext,您可能已经做对了:无代码 kexts 必须:
  • 有空OSBundleLibraries属性(property)。
  • 没有 CFBundleExecutable属性(property)。

  • Kext签约

    在 OSX 10.10 和 10.11 上,所有的 kext,包括无代码的,都必须签名。在 10.9 上,如果它们位于 /System/Library/Extensions 中,则可以未签名。 ,并且在 10.10 上,如果内核选项 kext-dev-mode=1,它们可以是无符号的已设置。您需要在 Apple 的 Developer Id 证书中添加一个特殊的 kext 签名才能对 kexts 进行签名。

    加载调试

    /System/Library/Extensions(可写到 10.10)或/Library/Extensions (10.9+) 中的 Kexts 将在启动或设备热插拔时自动匹配。也可以使用 kextutil 从这些位置之外手动加载它们。 .

    加载的 kext 二进制文件在 kextstat 中列出的输出。 Codeless kexts 没有二进制文件,因此不会出现。但是,如果 I/O Kit Personality 的 CFBundleIdentifier 中指定的包含驱动程序代码的捆绑包处于事件状态,它将显示出来。

    要查看您的特定设备发生了什么,请使用 ioreg命令行工具或 GUI 工具 IORegistryExplorer(来自 Apple 的硬件 I/O 工具包)或 IOJones(开源)。

    最后的想法

    鉴于 CDC-ACM 控制/数据拆分,您可能无法仅使用无代码的 kext 来完成工作。您可能需要更深入地了解 Apple 驱动程序的工作方式,并可能在您自己的 kext 中覆盖它们的一些行为,以便它们找到正确的端点。祝你好运!

    关于macos - 强制使用特定驱动程序的无代码 kext (CDC-ACM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33474993/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com