
Бывалый

Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006
Репутация: нет Всего: 1
|
Думаю приведённый код будет полезен для тех кому итнересна эта тема. Программа выводит hardwareID и путь к устройствам CDROM. Чтобы получить информацию о других устройствах нужно подставить вместо GUID_DEVCLASS_CDROM и GUID_DEVINTERFACE_CDROM GUID`ы необходимых устройств. Писалось на VC++ 8 + DDK XP. | Код | #include <windows.h> #pragma pack(push,1) #include <setupapi.h> #pragma pack(pop) #pragma comment(lib,"Setupapi.lib")
#include <devguid.h> #include <ntddstor.h>
#include <iostream> #include <string> using namespace std;
bool GetRegistryProperty(HDEVINFO devInfo, int index, unsigned long regProperty); bool GetDeviceProperty(HDEVINFO intDevInfo, int index, GUID &interfaceGuid);
void main() { unsigned long error;
GUID classGuid = GUID_DEVCLASS_CDROM; GUID interfaceGuid = GUID_DEVINTERFACE_CDROM;
HDEVINFO hDevInfo = SetupDiGetClassDevs(&classGuid, 0, 0, DIGCF_PRESENT); if(hDevInfo == INVALID_HANDLE_VALUE) { error = GetLastError(); cout<<"SetupDiGetClassDevs failed with error: "<<error<<endl; return; } HDEVINFO hIntDevInfo = SetupDiGetClassDevs(&interfaceGuid, 0, 0, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); if(hIntDevInfo == INVALID_HANDLE_VALUE) { error = GetLastError(); cout<<"SetupDiGetClassDevs failed with error: "<<error<<endl; return; }
for(int index=0; true; index++) { if(!GetRegistryProperty(hDevInfo, index, SPDRP_HARDWAREID)) break; if(!GetDeviceProperty(hIntDevInfo, index, interfaceGuid)) break; }
SetupDiDestroyDeviceInfoList(hDevInfo); SetupDiDestroyDeviceInfoList(hIntDevInfo); while(1); }
bool GetRegistryProperty(HDEVINFO devInfo, int index, unsigned long regProperty) { unsigned long dataType, bufferSize, reqSize, error; unsigned char *buffer;
//// Получаем список устройств //////////////////////////////////////////////// SP_DEVINFO_DATA deviceInfoData; deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if(!SetupDiEnumDeviceInfo(devInfo, index, &deviceInfoData)) { error = GetLastError(); if(error == ERROR_NO_MORE_ITEMS) cout<<"No more devices."<<endl; else cout<<"SetupDiEnumDeviceInfo failed with error: "<<error<<endl;
return false; }
//// Получаем размер свойства устройства ////////////////////////////////////// if(!SetupDiGetDeviceRegistryPropertyA(devInfo, &deviceInfoData, regProperty, &dataType, 0, 0, &reqSize)) { error = GetLastError(); if(error != ERROR_INSUFFICIENT_BUFFER) { if(error == ERROR_INVALID_DATA) { cout<<"Property not avalible."<<endl; return true; } else { cout<<"SetupDiEnumDeviceInfo failed with error: "<<error<<endl; return false; } } }
//// Получаем свойство устройства ///////////////////////////////////////////// bufferSize = reqSize; buffer = new unsigned char[bufferSize]; if(!SetupDiGetDeviceRegistryPropertyA(devInfo, &deviceInfoData, regProperty, &dataType, buffer, bufferSize, &reqSize)) { error = GetLastError(); if(error == ERROR_INVALID_DATA) { cout<<"Property not avalible."<<endl; return true; } else { cout<<"SetupDiEnumDeviceInfo failed with error: "<<error<<endl; return false; } }
cout<<buffer<<endl;
delete [] buffer; return true; }
bool GetDeviceProperty(HDEVINFO intDevInfo, int index, GUID &interfaceGuid) { unsigned long reqSize, interfaceDetailDataSize, error;
///// Получаем список интерфейсов устройств /////////////////////////////////////////////// SP_INTERFACE_DEVICE_DATA interfaceData; interfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); if(!SetupDiEnumDeviceInterfaces(intDevInfo, 0, &interfaceGuid, index, &interfaceData)) { error = GetLastError(); if(error == ERROR_NO_MORE_ITEMS) cout<<"No more interfaces."<<endl; else cout<<"SetupDiEnumDeviceInterfaces failed with error: "<<error<<endl;
return false; }
///// Получаем размер структуры интерфейса устройства ///////////////////////////////////// if(!SetupDiGetDeviceInterfaceDetail(intDevInfo, &interfaceData, 0, 0, &reqSize, 0)) { error = GetLastError(); if(error != ERROR_INSUFFICIENT_BUFFER) { cout<<"SetupDiGetDeviceInterfaceDetail failed with error: "<<error<<endl; return false; } }
///// Получаем структуру интерфейса устройства //////////////////////////////////////////// interfaceDetailDataSize = reqSize; PSP_INTERFACE_DEVICE_DETAIL_DATA_A interfaceDetailData = static_cast<PSP_INTERFACE_DEVICE_DETAIL_DATA_A> (malloc(interfaceDetailDataSize)); interfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA_A); if(!SetupDiGetDeviceInterfaceDetailA(intDevInfo, &interfaceData, interfaceDetailData, interfaceDetailDataSize, &reqSize, 0)) { error = GetLastError(); cout<<"SetupDiGetDeviceInterfaceDetail failed with error: "<<error<<endl; return false; }
cout<<interfaceDetailData->DevicePath<<endl;
free(interfaceDetailData); return true; }
|
|