c++ - 如何获取驱动器号和装载路径 - MSDN

标签 c++ windows winapi

我使用 SetupDiGetClassDevs 函数从系统中获取设备列表 - MSDN。

我还可以从设备中获取供应商 ID 和产品 ID。

但是获取不到盘符和挂载路径

例如,如果我插入 USB 驱动器意味着,我必须获得像“G:/”这样的驱动器号

请帮我获取设备的盘符和挂载路径

if (SetupDiEnumDeviceInterfaces(hDevInfo,
    NULL,&GUID_DEVINTERFACE_USB_DEVICE,i,&Interface_Info))
{
    wprintf(L"\tDeviccvcvcveInstanceId : %d\n", i); 

    pspdidd->cbSize = sizeof(*pspdidd); 

    SP_DEVICE_INTERFACE_DETAIL_DATA *pDetData = NULL;

    DWORD dwDetDataSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + 256;

    pDetData = (SP_DEVICE_INTERFACE_DETAIL_DATA*) malloc (dwDetDataSize);

    pDetData->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);

   SetupDiGetDeviceInterfaceDetail(hDevInfo,&Interface_Info,pDetData,dwDetDataSize, 
   NULL,&DeviceInfoData);

   qDebug ()<<QString::fromWCharArray( pDetData->DevicePath );

}

最佳答案

没那么简单。您不能调用任何会告诉您的 API:“设备 X = 驱动器 Y”。那是因为这种关系不是一对一的;它是多对多的。

一个盘符对应一个卷。驱动器盘符是一个挂载点。您还可以在目录重新分析点安装一个卷 - 可以多次安装同一卷。

单个设备可以容纳多个卷(例如磁盘分区)。这很常见。

单个卷可以驻留在多个设备上(例如跨区驱动器)。是的,卷驻留在单个设备的单个分区上很常见,但情况不一定如此。

另请注意,根本不必为卷分配挂载点(考虑您经常在 Windows 7 启动驱动器上看到的 100MB EFI 分区)。

一种方法是通过 GUID (FindFirstVolume/FindNextVolume) 枚举卷,然后通过 IOCTL (IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS) 获取它们的磁盘范围。这将告诉您包含部分卷的磁盘编号。然后使用 GetVolumePathNamesForVolumeName 获取卷的挂载点(可能最多有一个盘符,但可以挂载在多个目录下)。

是的,真的有那么复杂。

关于c++ - 如何获取驱动器号和装载路径 - MSDN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2980240/

相关文章:

c++ - 保存模板特化参数的结构

c++ - 从函数返回常量字符指针

linux - cygwin/dev/sd* 磁盘与硬盘驱动器的关联

excel - 在 VBA 中将 32 位 OleAut 调用转换为 64 位

Python - 在不使用 100% cpu 的情况下检查按键

python - 将 Qt 嵌入 native 窗口 (Windows)

c++ - 基于 OpenCV 边缘的物体检测 C++

c++ - 使用 new/malloc 是否可以绕过本地指针的警告?

c++ - GetDIBits() 因 PNG 压缩而失败

c - 端口正在监听但 "No connection could be made because the target machine actively refused it "