2015-09-21 7 views
2

Мне нужно отключить доступ к определенным устройствам (например, встроенной камеры FaceTime), и пытались сделать это, предоставив простой kext с более высокий показатель оценки, чем то, что в настоящее время прилагается.Попытка отключить доступ к устройству через OS X kext с более высоким значением оценки зонда

My kext соответствует и прикрепляется к камере как IOProviderClass IOUSBInterface, так и IOProviderClass IOUSBDevice, но все исходные 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 
+-- [email protected]      # original 
| +-- IOUSBInterfaceUserClientV3  # original 
+-- [email protected]      # original 
+-- FaceTimeDisabler      # my kext matching as IOUSBDevice 

Я думал точку устройства и соответствующий драйвер должен был выбрать один Kext присоединять к устройству, поэтому я ожидал, что, если мой Kext сочетается с наивысшим баллом зондом, он получит эксклюзивный контроль над устройством, но это явно не так.

Мои вопросы таковы:

  1. Как я могу убедиться, что мои доходы Kext эксклюзивный доступ к устройству?
  2. Если есть лучший способ отключить доступ к устройству, что это такое?

ответ

2

Если вы хотите претендовать монопольный доступ к устройству USB или интерфейса, вы должны open() на NuB объект, указав kUSBOptionBitOpenExclusivelyMask бит в options аргумента.

Так что в ваших 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(), убедитесь, что вы делаете соответствующий close() вызов, если и только тогда, когдаopen() удалось (this->opened в приведенном выше примере).

Обратите внимание, что флаг kUSBOptionBitOpenExclusivelyMask работает только для семейства USB, хотя open() существует везде. На объектах IOPCIDevice эксклюзивность подразумевается в open(), поэтому не передавайте эксклюзивный бит USB, когда вы пытаетесь заблокировать доступ к камерам FaceTime на основе PCI, но вызывайте open/close. (Камера My 2015 13" rMBP является PCI основе - идентификатор производителя 0x14e4, устройство ID 0x1570, код класса 04 80 00)

+0

Работы красиво Отметил на kUSBOptionBitOpenExclusivelyMask, относящийся только к USB-устройствам.. –