Macos 尝试使用更高的探测分数通过OS X kext禁用设备访问
我需要禁用对某些设备的访问(例如,内置FaceTime摄像头),并一直试图通过提供一个简单的kext来实现这一点,该kext的探测分数高于当前连接的分数 My kext匹配并作为IOProviderClassMacos 尝试使用更高的探测分数通过OS X kext禁用设备访问,macos,iokit,kernel-extension,facetime,Macos,Iokit,Kernel Extension,Facetime,我需要禁用对某些设备的访问(例如,内置FaceTime摄像头),并一直试图通过提供一个简单的kext来实现这一点,该kext的探测分数高于当前连接的分数 My kext匹配并作为IOProviderClassiObBinterface和IOProviderClassiObDevice连接到相机,但所有原始kexts仍然连接到相机。这是它在IORegistryExplorer中的外观: FaceTime HD Camera (Built-in)@14700000 # USB device +-
iObBinterface
和IOProviderClassiObDevice
连接到相机,但所有原始kexts仍然连接到相机。这是它在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与最高探针分数匹配,它将获得设备的独占控制权,但情况显然并非如此
我的问题是:
如果您希望以独占方式访问USB设备或接口,则需要
open()
nub对象,在options
参数中指定kusboptionBitOpenExclusiveySmask
位
因此,在您的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
在上述示例中为真)
请注意,
kusboptionBitOpenExclusiveySmask
标志仅适用于USB系列,即使open()
无处不在。在IOPCDevice
对象上,open()
中隐含了排他性,因此当您试图阻止对基于PCI的FaceTime摄像头的访问时,不要传递USB排他性位,而是调用open
/close
。(My 2015 13“rMBP的摄像头是基于PCI的-供应商ID0x14e4
,设备ID0x1570
,类别代码04 80 00
)工作良好。在KusboptionBitOpenExclusiveMask上注明,仅适用于USB设备。