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

(E: est une carte SD)Volume à disque physique

DeviceName est "\ Device \ HarddiskVolume3"

Comment puis-je "convertir" à quelque chose comme "\\.\PHYSICALDRIVE1"

+0

Quel est votre objectif? Pourquoi voulez-vous le convertir dans un tel format? Ou voulez-vous juste obtenir l'index globalement unique de l'appareil? –

+0

Ce n'est pas un lecteur, ce n'est vraiment qu'un volume. –

+0

J'essaie d'obtenir des informations avec WMI. Je dois savoir que je peux correspondre avec DeviceID de la classe Win32_DiskDrive – Cornwell

Répondre

15

Les volumes sont constitués d'une ou de plusieurs partitions qui résident sur des disques. Ainsi, E: ne correspond pas nécessairement à un seul disque dans le système (pensez au RAID logiciel).

La façon dont vous mappez des volumes aux noms PhysicalDrive dans Win32 consiste à ouvrir d'abord le volume, puis à envoyer IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Cela vous donnera une structure qui a une entrée de DISK_EXTENT pour chaque partition que le volume couvre:

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

Les extensions ont un numéro de disque dans les:

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

Le disknumber est ce qui se passe dans le PhsyicalDriveX lien, vous pouvez juste sprintf ce nombre avec "\\. \ d% lecteur physique"

-Scott

2

Depuis vous utilisez WMI de toute façon, commencez par Win32_LogicalDiskToPartition. Du côté Win32_LogicalDisk, la légende sera la lettre de lecteur. Ensuite, utilisez Win32_DiskDriveToDiskPartition pour voir quel lecteur physique contient cette partition.