Sammeln Sie Informationen zu angehaltenen USB-Geräten über IOUSBDeviceInterface245

StackOverflow https://stackoverflow.com/questions/7377168

  •  28-10-2019
  •  | 
  •  

Frage

Ich versuche, einige Informationen (z. B. einen Produktnamen) über IOUSBDeviceInterface245 (von IOKit unter Mac OS X) abzurufen:
Code Nr. 1

io_iterator_t iterator;
io_object_t   usb_device  
SInt32 score = 0;
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault,     
                                           IOServiceNameMatching("AppleUSBOHCI"),    
                                           &iterator);   
IOCFPlugInInterface     **plugin_interface = NULL; 
IOUSBDeviceInterface245 **usb_interface    = NULL;
// ...
// enumerate devices (usb_device = IOIteratorNext(iterator))
// ...
IOReturn return_code = IOCreatePlugInInterfaceForService(usb_device,  
                                                  kIOUSBDeviceUserClientTypeID, 
                                                  kIOCFPlugInInterfaceID,  
                                                  &plugin_interface,
                                                  &score);
HRESULT h_result = (*pluginInterface)->QueryInterface(pluginInterface,
                                  CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID245), 
                                  (LPVOID)&usb_interface);
IODestroyPlugInInterface(pluginInterface);

UInt8 product_string_index;
return_code = (*usb_interface)->USBGetProductStringIndex(usb_interface,  
                                                         &product_string_index);
// Next, getting a product string by string's index. To do so, we need to send  
// IOUSBDevRequest (with type "kUSBRqGetDescriptor") to the current USB-device.
// Code bellow - is a pseudocode:
char *product_name = malloc(128);
get_string_by_index(usb_interface, product_string_index, product_string, 128);

Dieser Code funktioniert gut für alle Geräte, die jetzt funktionieren, aber nicht für angehaltene ("schlafende")
Geräte (product_name ist nur eine leere Zeichenfolge).

Aber wenn ich diesen Code verwende:
Code 2

 CFMutableDictionaryRef child_properties = CFDictionaryCreateMutable(NULL, 0,  
                                                                NULL,NULL);
 kern_return_t kr;
 io_service_t io_service;
 // iterator = iterator for "AppleUSBOHCI" or "AppleUSBEHCI" services
 while((io_service = IOIteratorNext(iterator))) {      
    io_iterator_t   children_iterator;
    kernel_return = IORegistryEntryGetChildIterator(io_service, kIOServicePlane,  
                                                   &children_iterator);
    io_registry_entry_t child;
    while((child = IOIteratorNext(children_iterator))) {
      // Create a CFDictionary with usb-device's properties
      IORegistryEntryCreateCFProperties(child, &child_properties,  
                                        kCFAllocatorDefault, 
                                        kNilOptions);
      NSLog(@"%@",[(NSDictionary*)child_properties valueForKey:@"USB Product Name"]);
    }
  }

das funktioniert überhaupt für alle Geräte (ich weiß nicht warum).

Ich habe versucht, angehaltene Geräte mit diesem Code (mit dem Code 1) aufzuwecken:

(*usb_interface)->USBDeviceSuspend(usb_interface, false);

aber es hat sich nichts geändert.

Eines ist mir aufgefallen: Der Code Nr. 1 funktioniert für alle Eigenschaften vollständig von schlafenden Geräten, mit Ausnahme von Zeichenfolgenwerten (die durch Zeichenfolgen erhalten werden Index).

UPDATE:
Meine Frage lautet also: Wie kann ich ein Gerät für die Verwendung mit dem ersten Codeblock aufheben?
Vielen Dank.

War es hilfreich?

Lösung

Sie können die Zeichenfolge nicht von einem angehaltenen Gerät lesen (wie in Code 1), da sie direkt vom Gerät gelesen wird (das nicht reagieren kann, da es angehalten ist).Um diese direkt zu lesen, müssen Sie zuerst das Gerät aufheben (was eine schlechte Idee sein kann, wenn es von einem Treiber angehalten wurde. Denken Sie auch daran, den Erfolg zu überprüfen).

Wenn Sie die Standardzeichenfolgen lesen möchten, verwenden Sie den zweiten Codeblock (der die Eigenschaften liest, die bereits vom Gerät abgerufen wurden)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top