Recopile información sobre dispositivos USB suspendidos a través de IOUSBDeviceInterface245

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

  •  28-10-2019
  •  | 
  •  

Pregunta

Estoy tratando de obtener información (como el nombre de un producto) a través de IOUSBDeviceInterface245 (de IOKit en Mac OS X):
Código n.º 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);

Este código funciona bien para todos los dispositivos que funcionan ahora, pero no para los dispositivos suspendidos ("inactivos")
dispositivos (product_name es solo una cadena en blanco).

Pero, si utilizo este código:
Código n. ° 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"]);
    }
  }

eso funciona para todos los dispositivos (no sé por qué).

Traté de reactivar un dispositivo suspendido con este código (usando con el código # 1):

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

pero no ha cambiado nada.

Una cosa que noté: el código n. ° 1 funciona completamente para todas las propiedades de dispositivos para dormir, excepto los valores de cadena (que se obtienen por cadena índice).

ACTUALIZACIÓN:
Entonces, mi pregunta es ¿cómo puedo anular la suspensión de un dispositivo para usarlo con el primer bloque de código ?
Gracias.

¿Fue útil?

Solución

No puede leer la cadena de un dispositivo suspendido (como en el código n. ° 1) ya que se lee directamente desde el dispositivo (que no puede responder, ya que está suspendido).Para leerlos directamente, primero deberá anular la suspensión del dispositivo (lo que puede ser una mala idea si fue suspendido por un controlador, también, recuerde verificar el éxito)

Si desea leer las cadenas estándar, use el segundo bloque de código (que lee las propiedades, que ya se obtuvieron del dispositivo)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top