void CEnumSerial::EnumPortsW9x(CArray<SSerInfo,SSerInfo&> &asi) { // Look at all keys in HKLM\Enum, searching for subkeys named // *PNP0500 and *PNP0501. Within these subkeys, search for // sub-subkeys containing value entries with the name "PORTNAME" // Search all subkeys of HKLM\Enum\USBPORTS for PORTNAME entries. // First, open HKLM\Enum HKEY hkEnum = NULL; HKEY hkSubEnum = NULL; HKEY hkSubSubEnum = NULL; try { if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Enum"), 0, KEY_READ, &hkEnum) != ERROR_SUCCESS) throw CString(_T("Could not read from HKLM\\Enum")); // Enumerate the subkeys of HKLM\Enum CString acSubEnum; DWORD dwSubEnumIndex = 0; DWORD dwSize = sizeof(acSubEnum); BOOL bContinue; LONG regRet; bContinue = TRUE; while (bContinue) { dwSize = 1024; regRet = RegEnumKeyEx(hkEnum, dwSubEnumIndex, acSubEnum.GetBuffer(1024), &dwSize, NULL, NULL, NULL, NULL); acSubEnum.ReleaseBuffer(); if (regRet == ERROR_SUCCESS) { dwSubEnumIndex++; HKEY hkSubEnum = NULL; if (RegOpenKeyEx(hkEnum, acSubEnum, 0, KEY_READ, &hkSubEnum) != ERROR_SUCCESS) throw CString(_T("Could not read from HKLM\\Enum\\"))+acSubEnum; // Enumerate the subkeys of HKLM\Enum\*\, looking for keys // named *PNP0500 and *PNP0501 (or anything in USBPORTS) BOOL bUsbDevice; if (acSubEnum == _T("USBPORTS")) bUsbDevice = TRUE; else bUsbDevice = FALSE; CString acSubSubEnum; BOOL bContinueSub; DWORD dwSubSubEnumIndex = 0; bContinueSub = TRUE; while (bContinueSub) { dwSize = 1024; // set the buffer size regRet = RegEnumKeyEx(hkSubEnum, dwSubSubEnumIndex, acSubSubEnum.GetBuffer(1024), &dwSize, NULL, NULL, NULL, NULL); acSubSubEnum.ReleaseBuffer(); dwSubSubEnumIndex++; if (regRet == ERROR_SUCCESS) { BOOL bMatch; if ( (acSubSubEnum == _T("*PNP0500")) || (acSubSubEnum == _T("*PNP0501")) || bUsbDevice ) bMatch = TRUE; else bMatch = FALSE; if (bMatch) { HKEY hkSubSubEnum = NULL; if (RegOpenKeyEx(hkSubEnum, acSubSubEnum, 0, KEY_READ, &hkSubSubEnum) != ERROR_SUCCESS) throw CString(_T("Could not read from HKLM\\Enum\\")) + acSubEnum + _T("\\") + acSubSubEnum; SearchPnpKeyW9x(hkSubSubEnum, bUsbDevice, asi); RegCloseKey(hkSubSubEnum); hkSubSubEnum = NULL; } } else { bContinueSub = FALSE; } } RegCloseKey(hkSubEnum); hkSubEnum = NULL; } else { bContinue = FALSE; } } } catch (CString strError) { if (hkEnum != NULL) RegCloseKey(hkEnum); if (hkSubEnum != NULL) RegCloseKey(hkSubEnum); if (hkSubSubEnum != NULL) RegCloseKey(hkSubSubEnum); throw strError; } RegCloseKey(hkEnum); }
void EnumPortsW9x(CArray<SSerInfo,SSerInfo&> &asi) { // Look at all keys in HKLM\Enum, searching for subkeys named // *PNP0500 and *PNP0501. Within these subkeys, search for // sub-subkeys containing value entries with the name "PORTNAME" // Search all subkeys of HKLM\Enum\USBPORTS for PORTNAME entries. // First, open HKLM\Enum HKEY hkEnum = NULL; HKEY hkSubEnum = NULL; HKEY hkSubSubEnum = NULL; try { if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Enum", 0, KEY_READ, &hkEnum) != ERROR_SUCCESS) throw CString("Could not read from HKLM\\Enum"); // Enumerate the subkeys of HKLM\Enum char acSubEnum[128]; DWORD dwSubEnumIndex = 0; DWORD dwSize = sizeof(acSubEnum); CString strTemp_acSubEnum; while (RegEnumKeyEx(hkEnum, dwSubEnumIndex++, strTemp_acSubEnum.GetBuffer(), &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { strTemp_acSubEnum.ReleaseBuffer(); HKEY hkSubEnum = NULL; if (RegOpenKeyEx(hkEnum, strTemp_acSubEnum.GetBuffer(), 0, KEY_READ, &hkSubEnum) != ERROR_SUCCESS) { strTemp_acSubEnum.ReleaseBuffer(); throw CString("Could not read from HKLM\\Enum\\") + strTemp_acSubEnum; } // Enumerate the subkeys of HKLM\Enum\*\, looking for keys // named *PNP0500 and *PNP0501 (or anything in USBPORTS) BOOL bUsbDevice = (strTemp_acSubEnum.CompareNoCase(L"USBPORTS")==0); char acSubSubEnum[128]; dwSize = sizeof(acSubSubEnum); // set the buffer size DWORD dwSubSubEnumIndex = 0; CString strTemp_acSubSubEnum; while (RegEnumKeyEx(hkSubEnum, dwSubSubEnumIndex++, strTemp_acSubSubEnum.GetBuffer(), &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { strTemp_acSubSubEnum.ReleaseBuffer(); BOOL bMatch = (strTemp_acSubSubEnum.CompareNoCase(L"*PNP0500")==0 || strTemp_acSubSubEnum.CompareNoCase(L"*PNP0501")==0 || bUsbDevice); if (bMatch) { HKEY hkSubSubEnum = NULL; if (RegOpenKeyEx(hkSubEnum, strTemp_acSubSubEnum.GetBuffer(), 0, KEY_READ, &hkSubSubEnum) != ERROR_SUCCESS) { strTemp_acSubSubEnum.ReleaseBuffer(); throw CString("Could not read from HKLM\\Enum\\") + strTemp_acSubEnum + L"\\" + strTemp_acSubSubEnum; } SearchPnpKeyW9x(hkSubSubEnum, bUsbDevice, asi); RegCloseKey(hkSubSubEnum); hkSubSubEnum = NULL; } dwSize = sizeof(acSubSubEnum); // restore the buffer size } RegCloseKey(hkSubEnum); hkSubEnum = NULL; dwSize = sizeof(acSubEnum); // restore the buffer size } } catch (CString strError) { if (hkEnum != NULL) RegCloseKey(hkEnum); if (hkSubEnum != NULL) RegCloseKey(hkSubEnum); if (hkSubSubEnum != NULL) RegCloseKey(hkSubSubEnum); throw strError; } RegCloseKey(hkEnum); }