如何在内核扩展程序中获得USB设备的供应商和产品ID



我正在编写Mac OS的内核扩展程序,以便在将质量存储设备连接到机器上。

i为PLIST文件创建完美工作,当质量存储设备连接到机器时,它会加载内核扩展,但我想找出连接的设备供应商ID和产品ID的特定目的,请提供帮助。

为某些vid/pid组合加载kext

如果您只想将kext装载到设备中,则应使用特定的vid/pid组合,则应扩展iokit个性词典。Apple在QA1076中记录了USB设备/接口的完整规则,但是从本质上讲,您需要将idVendor的整数属性和idProduct添加到您的info.plist中的个性。plist:

<key>idVendor</key>
<integer>1234</integer>
<key>idProduct</key>
<integer>5678</key>

请注意,您需要将ID从十六进制转换为十进制。

如果您需要支持多个产品ID,则可以使用idProductArray而不是idProduct。该属性的值是包含整数的数组。

在kext

中以编程方式访问供应商/产品ID

如果您需要VID/PID信息以某种方式影响您的代码流,则可以直接在设备或接口对象上查询IDVENDOR/IDPRODUCT属性。例如,假设您想在驾驶员实例的start()函数中执行此操作:

bool MyKext::start(IOService* provider)
{
    // …
    // call to superclass's start(), etc.
    // …
    // Fetch vendor ID:
    OSNumber* vid_num = OSDynamicCast(OSNumber, provider->getProperty(kUSBVendorID));
    if (vid_num != nullptr)
    {
        uint32_t vid = vid_num->unsigned32BitValue();
        // use vid here
    }
    // …
}

您可以类似地用kUSBProductId替换kUSBVendorID来查询产品ID。

最新更新