如何获取物理磁盘和逻辑磁盘列表?

问题描述 投票:0回答:2

我如何使用 WinApi 和 C++ 获取物理磁盘列表以及每个物理磁盘的逻辑磁盘列表。主要目标确定物理磁盘和逻辑磁盘之间的链接。谢谢!

c++ winapi
2个回答
3
投票

比阿瓦卡的想法更简单的解决方案:

QueryDosDevice
。您需要传递驱动器号,您可以从
GetLogicalDriveStrings
获得该驱动器号,然后您将获得物理名称。


0
投票

这里有一些可能有用的代码。它并没有真正引入任何新内容,因为它使用了 @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
© www.soinside.com 2019 - 2024. All rights reserved.