我如何使用 WinApi 和 C++ 获取物理磁盘列表以及每个物理磁盘的逻辑磁盘列表。主要目标确定物理磁盘和逻辑磁盘之间的链接。谢谢!
这里有一些可能有用的代码。它并没有真正引入任何新内容,因为它使用了 @MSalters 善意推出的 API
QueryDosDeviceX()
。但是,对于只需要这样的输出的人来说,此代码可能会缩小差距,而无需对该线程中提到的所有 API 进行采样,或对不同的可能输入进行编码等。这也恰好是我最喜欢的,并且可以说是最有用的提到的方法。
此代码是我编译和测试的。特色的
Output
是这段代码在几分钟前运行的控制台窗口的实际屏幕截图。享受...
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
#define MAX_DRIVES 24
/*--------------------------------------------------------------------------------------------------
get_all_drives_qdd()
Uses API:
DWORD QueryDosDeviceA(
[in, optional] LPCSTR lpDeviceName,
[out] LPSTR lpTargetPath,
[in] DWORD ucchMax
);
https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-querydosdevicea
*-------------------------------------------------------------------------------------------------*/
int get_all_drives_qdd(char mssg[MAX_DRIVES][100])
{
int yyy, offs;
char lpTargetPath[100] = {0};
DWORD res;
for(yyy=offs=0; yyy < MAX_DRIVES ; yyy++)
{
char szBuff[10];
sprintf(szBuff, "%c:", 'A' + yyy + 2 );
res = QueryDosDevice(szBuff, lpTargetPath, sizeof(lpTargetPath) );
if(res && lpTargetPath[0])
{
sprintf(mssg[offs++], "%s %s", szBuff, lpTargetPath);
}
}
return offs;
}
int main()
{
char mssgs[MAX_DRIVES][100] = {0};
int iii, drives = get_all_drives_qdd(mssgs);
printf("Captured %d valid drives:\n", drives);
for(iii = 0; iii < drives; iii++)
printf("\t%s\n", mssgs[iii]);
return 0;
}
输出:
Captured 7 valid drives:
C: \Device\HarddiskVolume2
D: \Device\HarddiskVolume3
E: \Device\HarddiskVolume5
F: \Device\HarddiskVolume4
G: \Device\CdRom0
J: \Device\HarddiskVolume8
R: \Device\ImDisk0