获取有关 USB 设备的信息(OSX,C++),IOCreatePlugInInterfaceForService 失败
get information on usb devices (OSX, C++), IOCreatePlugInInterfaceForService fails
我正在尝试遍历 USB 设备以查找 USB 大容量存储并获取 PID 和 VID。为此,我试图在 IOUSBDeviceInterface 上获取参考,但 IOCreatePlugInInterfaceForService 失败并出现奇怪的错误代码:0x2C7 - "unsupported function"。有人可以告诉我,我做错了什么吗?这是我的代码:
#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
个服务。
我正在尝试遍历 USB 设备以查找 USB 大容量存储并获取 PID 和 VID。为此,我试图在 IOUSBDeviceInterface 上获取参考,但 IOCreatePlugInInterfaceForService 失败并出现奇怪的错误代码:0x2C7 - "unsupported function"。有人可以告诉我,我做错了什么吗?这是我的代码:
#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
个服务。