2010-09-29 11 views
5
QueryDosDevice(L"E:", DeviceName, MAX_PATH); 

(E: es una tarjeta SD)volumen de unidad física

DeviceName es "\ Device \ HarddiskVolume3"

¿Cómo "convertir" a algo así como "\\.\PHYSICALDRIVE1"

+0

¿Cuál es su objetivo? ¿Por qué quieres convertirlo a dicho formato? ¿O solo desea obtener el índice globalmente único del dispositivo? –

+0

No es una unidad, realmente es solo un volumen. –

+0

Estoy tratando de obtener información con WMI. Necesito saber eso para poder hacer coincidir con DeviceID de la clase Win32_DiskDrive – Cornwell

Respuesta

15

Los volúmenes se componen de una o más particiones, que residen en los discos. Por lo tanto, E: no necesariamente se asigna a un solo disco en el sistema (piense en el software RAID).

La forma de asignar volúmenes a los nombres de la unidad física en Win32 es abrir primero el volumen y luego enviar IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Esto le dará una estructura que tiene una entrada DISK_EXTENT para cada partición que el volumen abarca:

typedef struct _VOLUME_DISK_EXTENTS { 
    DWORD  NumberOfDiskExtents; 
    DISK_EXTENT Extents[ANYSIZE_ARRAY]; 
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS; 

Las extensiones tienen un número de disco en ellos:

typedef struct _DISK_EXTENT { 
    DWORD   DiskNumber; 
    LARGE_INTEGER StartingOffset; 
    LARGE_INTEGER ExtentLength; 
} DISK_EXTENT, *PDISK_EXTENT; 

El disknumber es lo que entra en la PhsyicalDriveX enlace, lo que sólo puede sprintf ese número con "\\. \ unidad física% d"

-Scott

2

Desde está utilizando WMI de todos modos, comience con Win32_LogicalDiskToPartition. En el lado Win32_LogicalDisk, la leyenda será la letra de la unidad. Luego use Win32_DiskDriveToDiskPartition para ver qué unidad física contiene esa partición.