【问题标题】:How to get a list of physical storage devices?如何获取物理存储设备列表?
【发布时间】:2011-09-28 14:12:19
【问题描述】:

我想获取物理存储设备的列表。
我看过一些代码,但实际上是循环并执行类似蛮力的操作。
我想知道获取物理存储磁盘列表的一般方法是什么。

我找到了CreateFile()。但我不明白如何正确使用它。我需要一个非 wmi 解决方案。最好不要查询注册表。

【问题讨论】:

    标签: c++ winapi visual-c++ storage


    【解决方案1】:

    我使用了以下代码,它会枚举所有卷,然后查找它们对应的物理驱动器:

    #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);
    }
    

    【讨论】:

    • 但这仍然给了我逻辑磁盘\Device\HarddiskVolume2\Device\HarddiskVolume3 但是它们都属于同一个物理设备..我想获取那个物理设备信息。
    • IOCTL_STORAGE_GET_DEVICE_NUMBER 在sdn.DeviceNumber 字段中为您提供物理设备编号。只需使用 sprintf(name, "\Device\PhysicalDrive\%d", (int)sdn.DeviceNumber) 或类似的。是的,您将多次使用相同的设备,每卷一个,但这没什么大不了的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多