Pregunta

Quiero actualizar una lista de dispositivos de almacenamiento a medida que el usuario inserta llaves USB, agrega discos externos y monta imágenes de discos. IOService IOServiceAddInterestNotification parece ser el camino a seguir, pero el uso obvio de registrar el interés general en kIOMediaClass solo le proporciona notificaciones para el desmontaje de volúmenes y solo algunas veces.

¿Cuál es la forma correcta de hacer esto?

¿Fue útil?

Solución

Las siguientes llamadas en DiskArbitration.h hacen exactamente lo que quiero:

  • DARegisterDiskAppearedCallback
  • DARegisterDiskDisappearedCallback
  • DARegisterDiskDescriptionChangedCallback

Estos cubren la inserción, extracción (incluso de volúmenes que no se pueden montar)
Eventos de cambio de metadatos.

P.S. No olvide agregar su DASession a un runloop
o no recibirá ninguna devolución de llamada.

Otros consejos

  

Deseo actualizar una lista de dispositivos de almacenamiento a medida que el usuario inserta llaves USB, agrega discos externos y monta imágenes de disco.

Puedo obtener dos de tres con este código, que imagino que no requeriría mucho más trabajo para obtener el tercero.

File:               USBNotificationExample.c

Description:        This sample demonstrates how to use IOKitLib and IOUSBLib to set up asynchronous
                    callbacks when a USB device is attached to or removed from the system.
                    It also shows how to associate arbitrary data with each device instance.

http: //opensource.apple.com/source/IOUSBFamily/IOUSBFamily-385.4.1/Examples/Another%20USB%20Notification%20Example/USBNotificationExample.c

Personalmente he usado (una copia ligeramente modificada de este código) durante mucho tiempo, para monitorear la conexión de discos duros USB.

Como puede ver en esta pequeña muestra, puede resultar fácilmente adaptable a las unidades montadas en el monitor. O puede que no. YMMV.

    matchingDict = IOServiceMatching(kIOUSBDeviceClassName);        // Interested in instances of class
                                                                    // IOUSBDevice and its subclasses

y cuando coincide

void DeviceAdded(void *refCon, io_iterator_t iterator)
{
    kern_return_t           kr;
    io_service_t            usbDevice;
    IOCFPlugInInterface     **plugInInterface=NULL;
    SInt32                  score;
    HRESULT                 res;    

    while ( (usbDevice = IOIteratorNext(iterator)) )
    {
        io_name_t                   deviceName;
        CFStringRef                 deviceNameAsCFString;
        MyPrivateData               *privateDataRef = NULL;
        UInt32                      locationID;

        printf("Device 0x%08x added.\n", usbDevice);

y así sucesivamente, y así sucesivamente.

¿Vería / Volumes por cambios lo que necesita?

Si está trabajando en el nivel de Cocoa, también puede registrarse para recibir las siguientes notificaciones de NSWorkspace :

  • NSWorkspaceDidMountNotification
  • NSWorkspaceDidRenameVolumeNotification
  • NSWorkspaceWillUnmountNotification
  • NSWorkspaceDidUnmountNotification
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top