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

C++ 如何获取驱动器号和装载路径-MSDN,c++,windows,winapi,C++,Windows,Winapi,我使用SetupDiGetClassDevs函数-MSDN从系统中获取设备列表 我还可以从设备中获取供应商id和产品id 但是我无法获取驱动器号和装载路径 例如,如果我插入usb驱动器意味着,我必须获得驱动器号,如“G:/” 请帮助我获取设备的驱动器号和装载路径 if (SetupDiEnumDeviceInterfaces(hDevInfo, NULL,&GUID_DEVINTERFACE_USB_DEVICE,i,&Interface_Info)) { wpr

我使用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 );

}
if(setupDienumDeviceInterface(hDevInfo,
NULL,&GUID\u设备接口\u USB\u设备、i和接口\u信息)
{
wprintf(L“\t设备ID:%d\n”,i);
pspdidd->cbSize=sizeof(*pspdidd);
SP_设备_接口_详情_数据*pDetData=NULL;
DWORD dwDetDataSize=sizeof(SP_设备_接口_细节_数据)+256;
pDetData=(SP_设备_接口_细节_数据*)malloc(DWDETDASIZE);
pDetData->cbSize=sizeof(SP\u设备\u接口\u详细信息\u数据);
SetupDiGetDeviceInterfaceDetail(hDevInfo、接口信息、pDetData、dwDetDataSize、,
NULL,&设备信息数据);

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

您可以使用
QueryDosDevice
功能(请参阅)。有关代码示例,请参见。

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

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

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

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

还要注意的是,卷根本不需要分配装入点(考虑一下在Windows 7引导驱动器上经常看到的100MB EFI分区)

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


是的,它确实很复杂。

这个函数与MSDN有什么关系?它的文档在那里,是的,但它不是一个“MSDN函数”。它是Windows API中的一个函数。另外,“G:”是一个驱动器号;“G:\”是一个目录,驱动器“G:”上的根目录。请注意,Microsoft Windows上的目录分隔符是“\”,而不是互联网上的“/”。