Domanda

Ne sto cercando dalla scorsa settimana, quasi tutti i collegamenti su Driveletter X DevicePath/Volume/ID dispositivo/Qualunque cosa siano viola per me.

Sto sviluppando un'applicazione che elenca alcuni dispositivi Soorage e anche dispositivi HDI/WPD utilizzando le funzioni Setupapi con questi GUID GUID_DEVINTERFACE_USB_DEVICE "A5DCBF10-6530-11d2-901F-00C0FB951ED", GUIEST_DEVINTERFACE_VOLUME "53F56fff-1d0-901F-00C0FB951ED", Guid_DeVinterFace_Volume ".

Quindi ... sono già in grado di mappare i dispositivi con la lettera di unità. Come? Con il risultato di Setupapi, utilizzando DevicePath per ottenere un Discumber e PartitionNumber con DeviceIocontrol. Ed va bene !!! In realtà non tutti. In realtà alle unità CDROM non riesco a prenderlo.

Ecco il mio codice.

int bytesReturned = 0;
IOCTL.DiskExtents de1 = new IOCTL.DiskExtents();
int numDiskExtents = 0;
IntPtr ptrDe1 = Marshal.AllocHGlobal(Marshal.SizeOf(de1));
bool result = IOCTL.DeviceIoControl(FileHandle, IOCTL.IOControlCodes.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, IntPtr.Zero, 0, ptrDe1, Marshal.SizeOf(de1), bytesReturned, null);
if ((!result)) {
    Marshal.FreeHGlobal(ptrDe1);
    //libera a memória alocada.
    throw new System.ComponentModel.Win32Exception(); //is thrown here
} else {
    de1 = Marshal.PtrToStructure(ptrDe1, typeof(IOCTL.DiskExtents));
    Marshal.FreeHGlobal(ptrDe1);
    return de1.first.DiskNumber;
}

Per tutta l'unità CDROM che ho, viene lanciata unafunzione errata.

Per ottenere il filehandle che utilizzo entrambi, drive lettera (come ". D:") e percorso del dispositivo. Ed entrambi falliscono.

Non so se sto facendo qualcosa di sbagliato, perché questo lavoro per l'archiviazione di massa USB e i dischi rigidi.

Grazie.

È stato utile?

Soluzione

Ora sto usando Volumename da DevicePath invece di Discumber e PartitionNumber. Riceviamo un volumename da ". C:" e il percorso del dispositivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top