获取有关USB设备(OSX,C++)的信息,IOCreatePlugInInterfaceForService失败

问题描述:

我试图遍历USB设备来查找USB大容量存储并获取PID和VID。为此,我试图获得有关IOUSBDeviceInterface的参考,但IOCreatePlugInInterfaceForService失败,出现一个奇怪的错误代码:0x2C7 - “不支持的函数”。有人可以告诉我,我做错了什么?这里是我的代码:获取有关USB设备(OSX,C++)的信息,IOCreatePlugInInterfaceForService失败

#include <iostream> 
#include <IOKit/IOkitLib.h> 
#include <IOKit/usb/IOUSBLib.h> 
#include <IOKit/IOCFPlugIn.h> 
#include <IOKit/usb/USBSpec.h> 
#include <CoreFoundation/CoreFoundation.h> 

int main(int argc, const char * argv[]) 
{ 
CFMutableDictionaryRef matchingDictionary = NULL; 
io_iterator_t foundIterator = 0; 
io_service_t usbDevice; 
matchingDictionary = IOServiceMatching(kIOUSBDeviceClassName); 

IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDictionary, &foundIterator); 

for(usbDevice = IOIteratorNext(foundIterator); usbDevice; usbDevice = IOIteratorNext(foundIterator)) 
{ 
    IOCFPlugInInterface** plugin = NULL; 
    SInt32 theScore=0; 
    IOReturn err; 
    err = IOCreatePlugInInterfaceForService(usbDevice, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &theScore); 
    if (err!= 0){ 
     //for all the devices (including Mass Storage), I get the same 
     //error: system 0x38 (IOKit), code: 0x2C7 (unsupported function) 
     std::cout<<"error, error code: "<<err_get_code(err) <<std::endl; 
    } 
    else if (plugin && *plugin) 
    { 
     //never happens 
     IOUSBDeviceInterface** usbInterface = NULL; 
     (*plugin)->QueryInterface(plugin, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID),(LPVOID*)&usbInterface); 
     (*plugin)->Release(plugin); 
     if (usbInterface && *usbInterface) 
     { 
      //other actions with usbInterface 
     }  

    } 

} 
IOObjectRelease(foundIterator); 
return 0; 
} 

你匹配IOUSBDevice服务,而是尝试用IOUSBInterfaceUserClient连接。如果要连接到IOUSBDevice服务,则用户客户端类型必须为kIOUSBDeviceUserClientTypeID。如果你想要一个IOUSBInterfaceUserClient,你需要匹配IOUSBInterface服务。

+0

是的,确实!我的一个愚蠢的错误,非常感谢你! –