J'essaie de découvrir des périphériques de stockage de masse USB sous MAC OSX. J'espérais obtenir la classe d'appareil, et, sur cette base, décider si l'appareil est un stockage de masse ou non. Mais, pour tous les lecteurs flash USB que j'ai, je reçois la classe de périphérique == 0, qui semble être un périphérique composite. S'il vous plaît, aidez-moi à comprendre, ce que je fais mal, ou, peut-être, quelle est la manière fiable de découvrir les périphériques de stockage de masse USB (j'ai besoin d'obtenir PID, VID et point de montage). Voici mon code:OS X, découverte de stockage de masse USB
#import <iostream>
#import <IOKit/IOkitLib.h>
#import <IOKit/usb/IOUSBLib.h>
#import <IOKit/IOCFPlugIn.h>
#import <IOKit/usb/USBSpec.h>
#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.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, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &theScore);
if (err!= 0){
std::cout<<"error, error code: "<<err_get_code(err) <<std::endl;
}
else if (plugin && *plugin)
{
IOUSBDeviceInterface182** usbInterface = NULL;
(*plugin)->QueryInterface(plugin, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID182),(LPVOID*)&usbInterface);
(*plugin)->Release(plugin);
if (usbInterface && *usbInterface)
{
UInt8 devClass;
UInt8 devSubClass;
UInt16 productId;
UInt16 vendorID;
//here I'm getting 0 for all my USB flash cards
(*usbInterface)->GetDeviceClass(usbInterface,&devClass);
(*usbInterface)->GetDeviceVendor(usbInterface, &vendorID);
(*usbInterface)->GetDeviceProduct(usbInterface, &productId);
(*usbInterface)->GetDeviceSubClass(usbInterface, &devSubClass);
std::cout<<"device class: "<<+devClass<<std::endl;
std::cout<<"device sub class: "<<+devSubClass<<std::endl;
std::cout<<"vendor ID: "<<vendorID<<std::endl;
std::cout<<"product ID: "<<productId<<std::endl;
}
}
IOObjectRelease(usbDevice);
}
IOObjectRelease(foundIterator);
return 0;
}