我使用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 );
}
答案 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代码是另一种方式(卷到磁盘),但您应该能够轻松地修改它。