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

时间:2010-06-05 12:02:14

标签: 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 );

}

3 个答案:

答案 0 :(得分:2)

您可以使用QueryDosDevice功能(请参阅http://msdn.microsoft.com/en-us/library/aa365461(VS.85).aspx)。有关代码示例,请参阅http://msdn.microsoft.com/en-us/library/cc542456(VS.85).aspx

答案 1 :(得分:1)

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

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

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

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

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

一种方法是按GUID枚举卷(FindFirstVolume / FindNextVolume),然后通过IOCTL(IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS)获取其磁盘范围。这将告诉您保存卷的一部分的磁盘编号。然后使用GetVolumePathNamesForVolumeName获取卷的安装点(可能最多只有一个驱动器号,但它可以安装在多个目录下)。

是的,真的很复杂。

答案 2 :(得分:0)

不幸的是,这不是一个非常简单的操作。关于如何在CodeProject上完成类似的事情有一个很好的演练。基本上,每个磁盘都分配有唯一的设备编号,每个卷都有一个与其所在磁盘对应的设备编号。因此,您必须打开所有卷并查询其设备编号(IOCTL_STORAGE_GET_DEVICE_NUMBER),然后将它们与相关磁盘的设备编号进行匹配。 CodeProject代码是另一种方式(卷到磁盘),但您应该能够轻松地修改它。