GUID за клас на интерфейс на устройството и GUID за клас за настройка на устройството
Device Interface Class Guid
Забележка! !
Повикващият на SetupDiGetClassDevs трябва да изтрие върнатата информация за устройството, когато тя вече не е необходима чрез обаждане SetupDiDestroyDeviceInfoList .
да обобщим
Ако искате да получите Device Path, трябва да използвате Interface Class GUID
. Следното е пример:
// SxTest.cpp : Defines the entry point for the console application. //Note: You need to switch to different entrances according to the GUID input. #include 'stdafx.h' #include // Link with SetupAPI.Lib. #pragma comment (lib, 'setupapi.lib') #pragma comment (lib, 'Cfgmgr32.lib') //DEFINE_GUID(GUID_DEVINTERFACE_VOLUME, 0x36fc9e60, 0xc465, 0x11cf, 0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00) static GUID BTHECHOSAMPLE_DEVICE_INTERFACE = { 0xfc71b33d, 0xd528, 0x4763, 0xa8, 0x6c, 0x78, 0x77, 0x7c, 0x7b, 0xcd, 0x7b } PSP_DEVICE_INTERFACE_DETAIL_DATA GetDeviceInterfaceDetailData( _In_ LPGUID InterfaceGuid ) { HDEVINFO HardwareDeviceInfo SP_DEVICE_INTERFACE_DATA DeviceInterfaceData PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData = NULL ULONG Length, RequiredLength = 0 BOOL bResult HardwareDeviceInfo = SetupDiGetClassDevs( InterfaceGuid, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)) if (HardwareDeviceInfo == INVALID_HANDLE_VALUE) { printf('SetupDiGetClassDevs failed!
') exit(1) } DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA) bResult = SetupDiEnumDeviceInterfaces(HardwareDeviceInfo, 0, InterfaceGuid, 0, &DeviceInterfaceData) DWORD dw =GetLastError() printf('%d', dw) if (bResult == FALSE) { LPVOID lpMsgBuf = NULL if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&lpMsgBuf, 0, NULL )) { printf('Error: %s', (LPSTR)lpMsgBuf) LocalFree(lpMsgBuf) } printf('SetupDiEnumDeviceInterfaces failed.
') SetupDiDestroyDeviceInfoList(HardwareDeviceInfo) exit(1) } SetupDiGetDeviceInterfaceDetail( HardwareDeviceInfo, &DeviceInterfaceData, NULL, 0, &RequiredLength, NULL ) DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LMEM_FIXED, RequiredLength) if (DeviceInterfaceDetailData == NULL) { SetupDiDestroyDeviceInfoList(HardwareDeviceInfo) printf('Failed to allocate memory.
') exit(1) } DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) Length = RequiredLength bResult = SetupDiGetDeviceInterfaceDetail( HardwareDeviceInfo, &DeviceInterfaceData, DeviceInterfaceDetailData, Length, &RequiredLength, NULL) if (bResult == FALSE) { LPVOID lpMsgBuf = NULL if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&lpMsgBuf, 0, NULL)) { MessageBox(NULL, (LPCTSTR)lpMsgBuf, 'Error', MB_OK) LocalFree(lpMsgBuf) } SetupDiDestroyDeviceInfoList(HardwareDeviceInfo) printf('Error in SetupDiGetDeviceInterfaceDetail
') LocalFree(DeviceInterfaceDetailData) DeviceInterfaceDetailData = NULL exit(1) } SetupDiDestroyDeviceInfoList(HardwareDeviceInfo) return DeviceInterfaceDetailData } int _tmain(int argc, _TCHAR* argv[]) { //static GUID GUID_DEVINTERFACE_USB_HUB = { 0xA5DCBF10L, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00,0xC0, 0x4F, 0xB9, 0x51, 0xED } } //static GUID GUID_DEVINTERFACE_USB_HUB = { 0x71A27CDDL, 0x812A, 0x11D0,{ 0xBE, 0xC7, 0x08,0x00, 0x2B, 0xE2, 0x09, 0x2F } } HDEVINFO dev_info = NULL SP_DEVINFO_DATA DeviceInfoData = { sizeof(DeviceInfoData) } const int bufSize = 4096 LPSTR prop_buffer = (LPSTR)LocalAlloc(LPTR, bufSize) DWORD required_size, req_bufsize, prop_datatype BOOL bRes dev_info = SetupDiGetClassDevs(&GUID_DEVINTERFACE_STORAGEPORT, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE) for (DWORD i = 0 SetupDiEnumDeviceInfo(dev_info, i, &DeviceInfoData) i++) { bRes = SetupDiGetDeviceRegistryProperty( dev_info, &DeviceInfoData, SPDRP_HARDWAREID, &prop_datatype, (LPBYTE)prop_buffer, bufSize, &req_bufsize) if (bRes) printf('Present drive: %s
', (LPTSTR)prop_buffer) SP_DEVICE_INTERFACE_DATA did = { sizeof(did) } PSP_DEVICE_INTERFACE_DETAIL_DATA pdd = NULL DWORD idx = 0 while (1) { DWORD err bRes = SetupDiEnumDeviceInterfaces(dev_info, &DeviceInfoData, &GUID_DEVINTERFACE_STORAGEPORT, idx++, &did) if (!bRes) bRes = SetupDiGetDeviceInterfaceDetail(dev_info, &did, NULL, 0, &required_size, NULL) if (!bRes) { err = GetLastError() if (ERROR_INSUFFICIENT_BUFFER == err) { pdd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, required_size) pdd->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) } else break } bRes = SetupDiGetDeviceInterfaceDetail(dev_info, &did, pdd, required_size, NULL, NULL) if (bRes) { printf(' Drive path: %s
', pdd->DevicePath) } else { err = GetLastError() printf('Last Err: %d
', err) } LocalFree(pdd) pdd = NULL } } SetupDiDestroyDeviceInfoList(dev_info) return 0 }