1
我想獲取物理存儲設備的列表。
我已經看到了一些代碼,但實際上循環和做像蠻力。
我想知道獲取物理存儲磁盤列表的一般方式是什麼。我找到了CreateFile()
。但我不明白如何正確使用它。我需要一個非wmi解決方案。如果它不查詢註冊表,它會更好。如何獲取物理存儲設備的列表?
我想獲取物理存儲設備的列表。
我已經看到了一些代碼,但實際上循環和做像蠻力。
我想知道獲取物理存儲磁盤列表的一般方式是什麼。我找到了CreateFile()
。但我不明白如何正確使用它。我需要一個非wmi解決方案。如果它不查詢註冊表,它會更好。如何獲取物理存儲設備的列表?
我用下面的代碼,枚舉所有的卷,然後查找其相應的物理驅動器:
#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);
}
但是,這仍然給我的邏輯磁盤'\設備\ HarddiskVolume2'和'\設備\ HarddiskVolume3'但他們都屬於同一個物理設備..我想獲得物理設備信息。 –
IOCTL_STORAGE_GET_DEVICE_NUMBER爲您提供物理設備號,位於'sdn.DeviceNumber'字段中。只需使用'sprintf(名稱,「\ Device \ PhysicalDrive \%d」,(int)sdn.DeviceNumber)'或類似的。是的,你會多次使用相同的設備,每卷一個,但這不是什麼大不了的事。 – rodrigo