Задача: Написать код который позволит получить список всех подключенных к системе устройств с максимально полной информацией о них. т.е. что-то вроде: C:\\ размер Файловая система Тип Устройсва (HDD) D:\\ размер Файловая система Тип Устройсва (DVD) E:\\ размер Файловая система Тип Устройсва (Removable) (в идеале нужно что бы распознавало вполть до USB HDD/Flash и т.п.) F:\\ размер Файловая система Тип Устройсва (SD card) Пробовал GetLogicalDrives + GetDriveType - но они дают слишком "скупую" информацию...
тут полно путей решения: setup* функции, wmi, ioctl* обращения к девайсу. для каждого из предложенных методов есть примеры в сети.
А нельзя ли по подробнее о setup-функциях, я слышал что-то про setupAPI, но не знаю что это, какую инфу искать... с IOCTL - разбираюсь... но пока не очень понял что именно нужно (использовал IOCTL_DISK_GET_DRIVE_LAYOUT_EX, IOCTL_STORAGE_GET_DEVICE_NUMBER)... не знаю как узнать вендора и модель устройства... и еще вопрос, как перебрать все доступные устройства... сейчас перебираю в цикле от 0 до 9 все PhysicalDriveX, но такой способ не позволяет определить DVD(почему-то?)...
Попробовал юзать SetupAPI: Код (Text): { HDEVINFO hPnP; SP_DEVINFO_DATA DeviceInfoData; SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; int MemberIndex = 0; DWORD dwDataType = 0; DWORD dwBufferSize = 0; DWORD dwReturned = 0; BYTE *bBuffer = NULL; FILE *stream; fopen_s( &stream, "fprintf.out", "w" ); DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); hPnP = SetupDiGetClassDevs( NULL, //All devices NULL, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES); //All devices. try DIGCF_PRESENT while(SetupDiEnumDeviceInfo( hPnP, MemberIndex, &DeviceInfoData)) { while (!SetupDiGetDeviceRegistryProperty( hPnP, &DeviceInfoData, SPDRP_DEVICEDESC, &dwDataType, bBuffer, dwBufferSize, &dwReturned)) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { if(bBuffer != NULL) { LocalFree(bBuffer); // Generate ERROR } bBuffer = (BYTE*) LocalAlloc(LPTR, dwReturned * 2); dwBufferSize = dwReturned; } else break; } fwprintf(stream, L"%d : %s", MemberIndex, bBuffer); fclose( stream ); if(bBuffer != NULL) LocalFree(bBuffer); // Generate ERROR MemberIndex++; } free(hPnP); fclose( stream ); return 0; } Возникает ошибка освобождения памяти из кучи при вызове LocalFree(bBuffer), не могу понять в чем дело... 2 или 3 итерации все срабатывает а потом слетает.