Как получить список физических устройств хранения? - PullRequest
1 голос
/ 28 сентября 2011

Я хочу получить список физических устройств хранения.
Я видел некоторый код, но на самом деле он зацикливается и выполняет что-то вроде грубой силы.
Я хочу знать, каков общий способ получения списка физических дисков хранения.

Я нашел CreateFile(). Но я не могу понять, как правильно его использовать. Мне нужно решение без wmi. и лучше, если он не запрашивает реестр.

1 Ответ

3 голосов
/ 28 сентября 2011

Я использовал следующий код, который перечисляет все тома и затем ищет их соответствующие физические диски:

#include <windows.h>
#include <commctrl.h>
#include <winioctl.h>

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...