2

我需要禁用对某些设备的访问(例如,内置的 FaceTime 摄像头),并且一直试图通过提供一个比当前附加的探测分数更高的简单 kext 来做到这一点。

我的 kext 匹配并作为 IOProviderClassIOUSBInterface和 IOProviderClass连接到相机IOUSBDevice,但所有原始 kext 仍然连接到它。这是它在 IORegistryExplorer 中的样子:

FaceTime HD Camera (Built-in)@14700000   # USB device
+-- FaceTime HD Camera (Built-in)@0      # USB interface
|   +-- FaceTimeDisabler                 # my kext matching as IOUSBInterface
|   +-- IOUSBInterfaceUserClientV3       # original
+-- IOUSBDeviceUserClientV2              # original
+-- IOUSBInterface@1                     # original
|   +-- IOUSBInterfaceUserClientV3       # original
+-- IOUSBInterface@2                     # original
+-- FaceTimeDisabler                     # my kext matching as IOUSBDevice

我认为设备和驱动程序匹配的重点是选择一个单独的 kext 附加到设备上,所以我希望如果我的 kext 与最高探测分数匹配,它将获得设备的独占控制权,但这显然不是案子。

我的问题是:

  1. 如何确保我的 kext 获得对设备的独占访问权限?
  2. 如果有更好的方法来禁用对设备的访问,那是什么?
4

1 回答 1

2

如果您想声明对 USB 设备或接口的独占访问权限,则需要open()nub 对象,kUSBOptionBitOpenExclusivelyMask并在options参数中指定位。

因此,在您FaceTimeDisablerstart()方法中,执行以下操作:

IOUSBNub* usb_provider = OSDynamicCast(IOUSBNub, provider);
if (usb_provider == nullptr)
{
  IOLog("FaceTimeDisabler: Provider is not USB nub\n");
  return false;
}

bool got_exclusive_access = usb_provider->open(this, kUSBOptionBitOpenExclusivelyMask);
this->opened = got_exclusive_access;
if (!got_exclusive_access)
{
  IOLog("FaceTimeDisabler: failed to acquire exclusive access to camera USB device/interface.\n");
  return false;
}

然后在您的stop()方法中,确保当且仅当成功时才进行相应的close()调用(在上面的示例中为真)。open()this->opened

请注意,该kUSBOptionBitOpenExclusivelyMask标志仅适用于 USB 系列,即使open()无处不在。在IOPCIDevice对象上,排他性隐含open()在. (我的 2015 13" rMBP 的相机是基于 PCI 的 - 供应商 ID 、设备 ID 、类代码)openclose0x14e40x157004 80 00

于 2015-09-21T17:21:17.650 回答