尝试通过具有更高探测分数的 OS X kext 禁用设备访问

Trying to disable device access through OS X kext with a higher probe score

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

我的 kext 作为 IOProviderClass IOUSBInterface 和 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

我认为设备和驱动程序匹配的重点是 select 一个单独的 kext 附加到设备,所以我希望如果我的 kext 与最高探测分数匹配,它将获得独占控制权设备,但事实显然并非如此。

我的问题是:

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

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

因此,在您的 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() 方法中,确保在 且仅当 open() 成功时进行相应的 close() 调用( this->opened 在上面的例子中是正确的)。

请注意,kUSBOptionBitOpenExclusivelyMask 标志仅适用于 USB 系列,尽管 open() 无处不在。在 IOPCIDevice 对象上,独占性隐含在 open() 中,因此当您试图阻止访问基于 PCI 的 FaceTime 相机时,不要传递 USB 独占位,但请调用 open/close。 (我的 2015 13" rMBP 相机是基于 PCI 的 - 供应商 ID 0x14e4,设备 ID 0x1570,class 代码 04 80 00