Получение пути к устройству для CreateFile при перечислении устройств с помощью SetupDiEnumDeviceInfo

Мне нужно получить информацию обо всех подключенных USB-накопителях. На данный момент я использую этот код для выполнения задания

HDEVINFO deviceInfoList;
deviceInfoList = SetupDiGetClassDevs(NULL, _T("USBSTOR"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);

if (deviceInfoList != INVALID_HANDLE_VALUE) 
{
    SP_DEVINFO_DATA deviceInfoData;
    deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) 
    {          
        LPTSTR buffer = NULL;
        DWORD buffersize = 0;
        while (!SetupDiGetDeviceInstanceId(deviceInfoList, &deviceInfoData, buffer, buffersize, &buffersize))
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                if (buffer) delete buffer;
                buffer = new TCHAR[buffersize];
            }
            else
            {
                _tprintf(_T("%ls\n"), _T("error"));
                break;
            }
        }
        _tprintf(_T("%ls\n"), buffer);
        if (buffer) { delete buffer; buffer = NULL; }

        etc...

Как видите, я создаю список устройств с помощью SetupDiGetClassDevs с перечислителем «USBSTOR», а затем перечисляю его с помощью SetupDiEnumDeviceInfo. Вопрос в том, могу ли я как-то получить путь к устройству для вызова CreateFile внутри моего перечисления? Как я вижу, вы можете получить правильный путь, используя SetupDiGetDeviceInterfaceDetail, но для этого я должен перечислить устройства, используя функцию SetupDiEnumDeviceInterfaces. Я пытался перечислить устройства таким образом, но безуспешно. Мне кажется, что когда вы перечисляете устройства с помощью SetupDiEnumDeviceInterfaces, вы должны передать GUID интерфейса устройства в SetupDiGetClassDevs, но я не могу найти конкретный интерфейс устройства для запоминающих устройств USB. Мне были прочитаны документы msdn об устройстве Информационные наборы и действительно не понимают, что такое "интерфейс устройства".

Последний вопрос: могу ли я получить путь к устройству при перечислении устройств с помощью SetupDiEnumDeviceInfo? Если нет, как я могу перечислить все подключенные запоминающие устройства USB с помощью SetupDiEnumDeviceInterfaces?


person s.maks    schedule 03.02.2014    source источник


Ответы (1)


Вы можете перечислить физические дисковые устройства, используя GUID_DEVINTERFACE_DISK. С использованием:

SetupDiGetClassDevs
(
    &GUID_DEVINTERFACE_DISK,
    NULL,
    NULL,
    DIGCF_PRESENT | DIGCF_DEVICEINTERFACE
)

Затем запросите дескриптор адаптера хранилища.

STORAGE_PROPERTY_QUERY storageProperty;
//...setup
PSTORAGE_ADAPTER_DESCRIPTOR pstorageAdapterDesc;
pstorageAdapterDesc = (PSTORAGE_ADAPTER_DESCRIPTOR)LocallAlloc( LPTR, storageDescHeader.Size );

DeviceIoControl
(
    handle,
    IOCTL_STORAGE_QUERY_PROPERTY,
    &storageProperty, 
    sizeof( STORAGE_PROPERTY_QUERY ),
    pstorageAdapterDesc,
    storageDescHeader.Size,
    bytesReturned,
    NULL
)

В дескрипторе вы можете использовать «BusType» и проверить наличие USB.

person phandinhlan    schedule 21.08.2014
comment
Мы разрабатываем этот API, который в конечном итоге позволит вам взаимодействовать с устройствами хранения. Это открытый исходный код, и вы можете увидеть текущий код для получения некоторой информации. Возвращайтесь, чтобы узнать о дополнительных функциях: github.com/virtium/vtStor - person phandinhlan; 27.04.2015