Thanks for being a part of WWDC25!

How did we do? We’d love to know your thoughts on this year’s conference. Take the survey here

How to toggle usb device

When I use IOKit/usb/IOUSBLib to toggle build-in camera, I got an ERROR:ret IOReturn -536870210 How can I resolve it? Can I use IOUSBLib to disable or hide build-in camera?

My environment:

  Model Name: MacBook Pro
  ProductVersion: 15.5
  Model Identifier: MacBookPro15,2
  Processor Name: Quad-Core Intel Core i5
  Processor Speed: 2.4 GHz
  Number of Processors: 1
// 禁用/启用USB设备
bool toggleUSBDevice(uint16_t vendorID, uint16_t productID, bool enable) {
    std::cout << (enable ? "Enabling" : "Disabling") << " USB device with VID: 0x"
              << std::hex << vendorID << ", PID: 0x" << productID << std::endl;
    
    // 创建匹配字典查找指定VID/PID的USB设备
    CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
    if (!matchingDict) {
        std::cerr << "Failed to create USB device matching dictionary." << std::endl;
        return false;
    }
    
    // 设置VID/PID匹配条件
    CFNumberRef vendorIDRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt16Type, &vendorID);
    CFNumberRef productIDRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt16Type, &productID);
    
    CFDictionarySetValue(matchingDict, CFSTR(kUSBVendorID), vendorIDRef);
    CFDictionarySetValue(matchingDict, CFSTR(kUSBProductID), productIDRef);
    
    CFRelease(vendorIDRef);
    CFRelease(productIDRef);
    
    // 获取匹配的设备迭代器
    io_iterator_t deviceIterator;
    if (IOServiceGetMatchingServices(kIOMainPortDefault, matchingDict, &deviceIterator) != KERN_SUCCESS) {
        std::cerr << "Failed to get USB device iterator." << std::endl;
        CFRelease(matchingDict);
        return false;
    }
    
    io_service_t usbDevice;
    bool result = false;
    int deviceCount = 0;
    
    // 遍历所有匹配的设备
    while ((usbDevice = IOIteratorNext(deviceIterator)) != IO_OBJECT_NULL) {
        deviceCount++;
        
        // 获取设备路径
        char path[1024];
        if (IORegistryEntryGetPath(usbDevice, kIOServicePlane, path) == KERN_SUCCESS) {
            std::cout << "Found device at path: " << path << std::endl;
        }
        
        // 打开设备
        IOCFPlugInInterface** plugInInterface = NULL;
        IOUSBDeviceInterface** deviceInterface = NULL;
        SInt32 score;
        IOReturn ret = IOCreatePlugInInterfaceForService(
            usbDevice,
            kIOUSBDeviceUserClientTypeID,
            kIOCFPlugInInterfaceID,
            &plugInInterface,
            &score);
            
        if (ret == kIOReturnSuccess && plugInInterface) {
            ret = (*plugInInterface)->QueryInterface(plugInInterface,
                CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID),
                (LPVOID*)&deviceInterface);
            (*plugInInterface)->Release(plugInInterface);
        }
        
        if (ret != kIOReturnSuccess) {
            std::cerr << "Failed to open USB device interface. Error:" << ret << std::endl;
            IOObjectRelease(usbDevice);
            continue;
        }
        
        // 禁用/启用设备
        if (enable) {
            // 启用设备 - 重新配置设备
            ret = (*deviceInterface)->USBDeviceReEnumerate(deviceInterface, 0);
            if (ret == kIOReturnSuccess) {
                std::cout << "Device enabled successfully." << std::endl;
                result = true;
            } else {
                std::cerr << "Failed to enable device. Error: " << ret << std::endl;
            }
        } else {
            // 禁用设备 - 断开设备连接
            ret = (*deviceInterface)->USBDeviceClose(deviceInterface);
            if (ret == kIOReturnSuccess) {
                std::cout << "Device disabled successfully." << std::endl;
                result = true;
            } else {
                std::cerr << "Failed to disable device. Error: " << ret << std::endl;
            }
        }
        
        // 关闭设备接口
        (*deviceInterface)->Release(deviceInterface);
        IOObjectRelease(usbDevice);
    }
    
    IOObjectRelease(deviceIterator);
    
    if (deviceCount == 0) {
        std::cerr << "No device found with specified VID/PID." << std::endl;
        return false;
    }
    
    return result;
}
How to toggle usb device
 
 
Q