我需要禁用对某些设备(例如内置FaceTime Camera)的访问权限,并且一直试图通过提供一个比当前附加的探针得分更高的简单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
我认为设备和驱动程序匹配的重点是选择一个kext连接到设备,所以我希望如果我的kext与最高的探测分数相匹配,它将获得对设备的独占控制,但这清楚事实并非如此。
我的问题是这些:
答案 0 :(得分:2)
如果您要声明对USB设备或接口的独占访问权限,则需要open()
nub对象,指定kUSBOptionBitOpenExclusivelyMask
参数中的options
位。
因此,在FaceTimeDisabler
的{{1}}方法中,请执行以下操作:
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()
调用,并且仅当<{strong>} close()
成功时才open()
在上面的例子中是正确的。)
请注意,this->opened
标志仅适用于USB系列,即使kUSBOptionBitOpenExclusivelyMask
存在于任何地方。在open()
对象上,IOPCIDevice
隐含了排他性,因此当您尝试阻止访问基于PCI的FaceTime摄像头时,不要传递USB独占位,而是调用{{1} } / open()
。 (我的2015年13“rMBP相机是基于PCI的 - 供应商ID open
,设备ID close
,类代码0x14e4
)