Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 尝试使用更高的探测分数通过OS X kext禁用设备访问_Macos_Iokit_Kernel Extension_Facetime - Fatal编程技术网

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

Macos 尝试使用更高的探测分数通过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 +-

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

My kext匹配并作为IOProviderClass
iObBinterface
和IOProviderClass
iObDevice
连接到相机,但所有原始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与最高探针分数匹配,它将获得设备的独占控制权,但情况显然并非如此

我的问题是:

  • 如何确保我的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的-供应商ID
    0x14e4
    ,设备ID
    0x1570
    ,类别代码
    04 80 00

    工作良好。在KusboptionBitOpenExclusiveMask上注明,仅适用于USB设备。