Comment obtenir une liste de périphériques de stockage physiques?

Je souhaite obtenir une liste des périphériques de stockage physiques.
J’ai vu du code mais cela tourne en boucle et fait quelque chose comme la force brute.
Je veux savoir quelle est la méthode générale pour obtenir la liste des disques de stockage physiques.

J’ai trouvé CreateFile() . Mais je ne comprends pas comment l’utiliser correctement. J’ai besoin d’une solution non-WMI. et c’est mieux si elle n’interroge pas le registre.

J’ai utilisé le code suivant, qui énumère tous les volumes, puis recherche leurs lecteurs physiques correspondants:

 #include  #include  #include  typedef struct _STORAGE_DEVICE_NUMBER { DEVICE_TYPE DeviceType; ULONG DeviceNumber; ULONG PartitionNumber; } STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER; void PrintVolumes() { char volName[MAX_PATH]; HANDLE hFVol; DWORD bytes; hFVol = FindFirstVolume(volName, sizeof(volName)); if (!hFVol) { printf("error...\n"); return; } do { size_t len = strlen(volName); if (volName[len-1] == '\\') { volName[len-1] = 0; --len; } /* printf("OpenVol %s\n", volName); */ HANDLE hVol = CreateFile(volName, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hVol == INVALID_HANDLE_VALUE) continue; STORAGE_DEVICE_NUMBER sdn = {0}; if (!DeviceIoControl(hVol, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdn, sizeof(sdn), &bytes, NULL)) { printf("error...\n"); continue; } CloseHandle(hVol); printf("Volume Type:%d, Device:%d, Partition:%d\n", (int)sdn.DeviceType, (int)sdn.DeviceNumber, (int)sdn.PartitionNumber); /* if (sdn.DeviceType == FILE_DEVICE_DISK) printf("\tIs a disk\n"); */ } while (FindNextVolume(hFVol, volName, sizeof(volName))); FindVolumeClose(hFVol); }