Как получить букву диска и путь монтирования - MSDN - PullRequest
3 голосов
/ 05 июня 2010

Я получаю список устройств из системы, используя функцию SetupDiGetClassDevs - MSDN.

Также я могу получить идентификатор устройства и идентификатор продукта от устройств.

Но я не могуполучить букву диска и путь монтирования

Например, если я подключаю 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 ]

2 голосов
/ 06 июня 2010

Можно использовать функцию QueryDosDevice (см. http://msdn.microsoft.com/en-us/library/aa365461(VS.85).aspx). См. http://msdn.microsoft.com/en-us/library/cc542456(VS.85).aspx для примера кода.

1 голос
/ 03 июня 2013

Это не так просто. Вы не можете вызвать любой API, который скажет вам: «Устройство X = Диск Y». Это потому, что отношения не один к одному; это много ко многим.

Буква диска соответствует тому. Буква диска - это точка монтирования. Вы также можете подключить том в точке повторной обработки каталога - один и тот же том можно подключить несколько раз.

Одно устройство может содержать несколько томов (например, разделы диска). Это часто встречается.

Один том может находиться на нескольких устройствах (например, на накопительных дисках). Да, обычно том располагается в одном разделе одного устройства, но это не всегда так.

Обратите также внимание, что тому вообще не требуется назначать точку монтирования (рассмотрим раздел EFI размером 100 МБ, который вы часто видите на загрузочном диске Windows 7).

Одним из подходов является перечисление томов по идентификатору GUID (FindFirstVolume / FindNextVolume), а затем получение их экстентов диска с помощью IOCTL (IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS). Это скажет вам номер диска / с, которые содержат части тома. Затем используйте GetVolumePathNamesForVolumeName, чтобы получить точку / точки монтирования для тома (может быть не более одной буквы диска, но он может быть смонтирован в нескольких каталогах).

Да, это действительно так сложно.

0 голосов
/ 06 июня 2010

К сожалению, это не очень простая операция. В CodeProject есть хорошее руководство по созданию чего-то похожего. Как правило, каждому диску присваивается уникальный номер устройства, а каждому тому соответствует номер устройства, соответствующий диску, на котором он находится. Поэтому вы должны открыть все тома и запросить их номера устройств (IOCTL_STORAGE_GET_DEVICE_NUMBER), а затем сопоставить их с номером устройства рассматриваемого диска. Код CodeProject идет другим путем (том на диск), но вы должны быть в состоянии изменить его достаточно легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...