尝试通过具有更高探测分数的 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 与最高探测分数匹配,它将获得独占控制权设备,但事实显然并非如此。
我的问题是:
- 如何确保我的 kext 获得对设备的独占访问权限?
- 如果有更好的方法来禁用对设备的访问,那是什么?
如果您想独占访问 USB 设备或接口,您需要 open()
nub 对象,在 options
参数中指定 kUSBOptionBitOpenExclusivelyMask
位。
因此,在您的 FaceTimeDisabler
的 start()
方法中,执行如下操作:
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
)
我需要禁用对某些设备的访问(例如内置的 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 与最高探测分数匹配,它将获得独占控制权设备,但事实显然并非如此。
我的问题是:
- 如何确保我的 kext 获得对设备的独占访问权限?
- 如果有更好的方法来禁用对设备的访问,那是什么?
如果您想独占访问 USB 设备或接口,您需要 open()
nub 对象,在 options
参数中指定 kUSBOptionBitOpenExclusivelyMask
位。
因此,在您的 FaceTimeDisabler
的 start()
方法中,执行如下操作:
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
)