Получение списка подключенных устройств

Тема в разделе "WASM.BEGINNERS", создана пользователем wint, 12 ноя 2007.

  1. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Задача:

    Написать код который позволит получить список всех подключенных к системе устройств с максимально полной информацией о них. т.е. что-то вроде:

    C:\\ размер Файловая система Тип Устройсва (HDD)
    D:\\ размер Файловая система Тип Устройсва (DVD)
    E:\\ размер Файловая система Тип Устройсва (Removable)
    (в идеале нужно что бы распознавало вполть до USB HDD/Flash и т.п.)
    F:\\ размер Файловая система Тип Устройсва (SD card)

    Пробовал GetLogicalDrives + GetDriveType - но они дают слишком "скупую" информацию...
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    тут полно путей решения: setup* функции, wmi, ioctl* обращения к девайсу. для каждого из предложенных методов есть примеры в сети.
     
  3. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    А нельзя ли по подробнее о setup-функциях, я слышал что-то про setupAPI, но не знаю что это, какую инфу искать...
    с IOCTL - разбираюсь... но пока не очень понял что именно нужно
    (использовал IOCTL_DISK_GET_DRIVE_LAYOUT_EX, IOCTL_STORAGE_GET_DEVICE_NUMBER)... не знаю как узнать вендора и модель устройства...

    и еще вопрос, как перебрать все доступные устройства... сейчас перебираю в цикле от 0 до 9 все PhysicalDriveX, но такой способ не позволяет определить DVD(почему-то?)...
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    MSDN: SetupDiGetDeviceInterfaceDetail, SetupDiGetClassDescription, SetupDiGetDeviceRegistryProperty
     
  5. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    phisicaldriveX указывает на винты. для cd - cdromX
     
  6. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Попробовал юзать SetupAPI:
    Код (Text):
    1. {
    2.     HDEVINFO hPnP;
    3.     SP_DEVINFO_DATA DeviceInfoData;
    4.     SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
    5.     int MemberIndex = 0;
    6.     DWORD dwDataType = 0;
    7.     DWORD dwBufferSize = 0;
    8.     DWORD dwReturned = 0;
    9.     BYTE *bBuffer = NULL;
    10.     FILE *stream;
    11.     fopen_s( &stream, "fprintf.out", "w" );
    12.    
    13.     DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    14.     DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    15.    
    16.     hPnP = SetupDiGetClassDevs( NULL,                   //All devices
    17.                                 NULL,
    18.                                 0,
    19.                                 DIGCF_PRESENT | DIGCF_ALLCLASSES);      //All devices. try DIGCF_PRESENT
    20.  
    21.     while(SetupDiEnumDeviceInfo( hPnP, MemberIndex, &DeviceInfoData))
    22.     {
    23.         while (!SetupDiGetDeviceRegistryProperty( hPnP,
    24.                                                   &DeviceInfoData,
    25.                                                   SPDRP_DEVICEDESC,
    26.                                                   &dwDataType,
    27.                                                   bBuffer,
    28.                                                   dwBufferSize,
    29.                                                   &dwReturned))
    30.         {
    31.             if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    32.             {
    33.                 if(bBuffer != NULL)
    34.                 {
    35.                     LocalFree(bBuffer); // Generate ERROR
    36.                 }
    37.                 bBuffer = (BYTE*) LocalAlloc(LPTR, dwReturned * 2);
    38.                 dwBufferSize = dwReturned;
    39.             }
    40.             else
    41.                 break;
    42.         }
    43.         fwprintf(stream, L"%d : %s", MemberIndex, bBuffer);
    44.         fclose( stream );
    45.         if(bBuffer != NULL)
    46.             LocalFree(bBuffer); // Generate ERROR
    47.         MemberIndex++;
    48.     }
    49.     free(hPnP);
    50.     fclose( stream );
    51.     return 0;
    52. }
    Возникает ошибка освобождения памяти из кучи при вызове LocalFree(bBuffer), не могу понять в чем дело... 2 или 3 итерации все срабатывает а потом слетает.