如何获取物理存储设备列表?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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) 或类似的。是的,您将多次使用相同的设备,每卷一个,但这没什么大不了的。

以上是关于如何获取物理存储设备列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PowerShell获取物理磁盘的信息

如何获取卷 GUID 路径所属的物理设备?

使用 Python 获取设备的物理位置?

如何在 C# 中获取启用(媒体)设备的列表

如何在设备管理器 Windows 中获取带有黄色感叹号的设备列表 - c++

获取磁盘设备的物理设备对象名称