Loading backends/regedit/regedit.cpp +63 −88 Original line number Diff line number Diff line Loading @@ -91,37 +91,18 @@ namespace confplus { std::stack<KeyState> keyStack; // Initialisiere den Stack mit dem Startschlüssel. // Dieser Handle wird in Registry::loadConfig geöffnet und geschlossen. keyStack.push({hRootKey, rootConfigPath, false}); while (!keyStack.empty()) { KeyState currentState = keyStack.top(); keyStack.pop(); HKEY hKey = currentState.hKey; const std::string currentConfigPath = currentState.configPath; const std::string& currentConfigPath = currentState.configPath; LONG lRes; DWORD dwValues, dwSubKeys, dwMaxValueNameLen, dwMaxValueLen, dwMaxSubKeyLen; // 1. Hole Infos über den aktuellen Schlüssel LONG lRes = RegQueryInfoKeyA( hKey, NULL, NULL, NULL, &dwSubKeys, &dwMaxSubKeyLen, NULL, &dwValues, &dwMaxValueNameLen, &dwMaxValueLen, NULL, NULL ); if (lRes != ERROR_SUCCESS) { if (currentState.closeHandle) { RegCloseKey(hKey); } continue; } // --- 2. Werte (Values) laden --- // Puffergrößen bestimmen DWORD maxNameSize = dwMaxValueNameLen > 0 ? dwMaxValueNameLen + 1 : 1; DWORD maxDataSize = dwMaxValueLen > 0 ? dwMaxValueLen + 1 : 1; Loading @@ -129,11 +110,10 @@ namespace confplus { std::unique_ptr<char[]> dataBuffer(new char[maxDataSize]); DWORD dwSizeValueName, dwSizeData, dwType; // ** ROBUSTE ITERATION ÜBER WERTE ** for (DWORD i = 0; ; ++i) { dwType = 0; dwSizeValueName = maxNameSize; dwSizeData = maxDataSize; dwSizeValueName = maxNameSize; // WICHTIG: Muss vor jedem Aufruf zurückgesetzt werden dwSizeData = maxDataSize; // WICHTIG: Muss vor jedem Aufruf zurückgesetzt werden lRes = RegEnumValueA( hKey, i, Loading @@ -146,45 +126,47 @@ namespace confplus { break; // Korrekte Terminierung } if (lRes == ERROR_SUCCESS) { std::string valueNameStr = std::string(valueNameBuffer.get()); if (lRes != ERROR_SUCCESS) { break; } // Guaranteed ERROR_SUCCESS std::string valueNameStr(valueNameBuffer.get()); std::string cname = currentConfigPath; std::string cvalue; if (!valueNameStr.empty()) { // Benannter Wert cname += "/" + valueNameStr; } else { cname += "/"; // KORREKTUR 2: Standardwert (leerer Name) explizit benennen. cname += "/@DEFAULT"; } // --- Wertkonvertierung --- if (dwType == REG_SZ) { cvalue = std::string(dataBuffer.get()); } else if (dwType == REG_DWORD) { std::stringstream ss; if (dwSizeData >= sizeof(DWORD)) { ss << *((DWORD*)dataBuffer.get()); cvalue = ss.str(); DWORD dwVal = *reinterpret_cast<DWORD*>(dataBuffer.get()); cvalue = std::to_string(dwVal); } else { continue; } } else { continue; // Ignoriere andere Registry-Typen continue; } if (cvalue.empty()) { continue; } Config::ConfigData* ckey = conf->setKey(cname); conf->setValue(ckey, 0, cvalue); } } // --- 3. Subkeys (Unterschlüssel) zur Stack hinzufügen --- DWORD maxSubKeySize = dwMaxSubKeyLen > 0 ? dwMaxSubKeyLen + 1 : 1; std::unique_ptr<char[]> subKeyNameBuffer(new char[maxSubKeySize]); // ** ROBUSTE ITERATION ÜBER SUBKEYS ** for (DWORD i = 0; ; ++i) { DWORD dwSizeSubKeyName = maxSubKeySize; DWORD dwSizeSubKeyName = maxSubKeySize; // WICHTIG: Muss vor jedem Aufruf zurückgesetzt werden lRes = RegEnumKeyExA( hKey, i, Loading @@ -193,33 +175,26 @@ namespace confplus { ); if (lRes == ERROR_NO_MORE_ITEMS) { break; // Korrekte Terminierung break; // Korrekte Terminierung, springt zum nächsten KeyState } if (lRes == ERROR_SUCCESS) { HKEY hSubKey; if (lRes != ERROR_SUCCESS) { // Wenn ein Fehler auftritt, beenden wir die Subkey-Iteration für diesen Schlüssel zur Sicherheit. break; } // Öffne den Unterschlüssel (RegOpenKeyExA verwendet den Originalnamen) lRes = RegOpenKeyExA( hKey, subKeyNameBuffer.get(), 0, KEY_READ, &hSubKey ); // Guaranteed ERROR_SUCCESS HKEY hSubKey; lRes = RegOpenKeyExA(hKey, subKeyNameBuffer.get(), 0, KEY_READ, &hSubKey); if (lRes == ERROR_SUCCESS) { std::string subKeyNameStr = std::string(subKeyNameBuffer.get()); // KORREKTUR 3: Normalisierung des Subkey-Namens zu Kleinbuchstaben std::transform(subKeyNameStr.begin(), subKeyNameStr.end(), subKeyNameStr.begin(), [](unsigned char c){ return std::tolower(c); }); std::string subKeyNameStr(subKeyNameBuffer.get()); std::string nextConfigPath = currentConfigPath + "/" + subKeyNameStr; // Schlüssel auf den Stack legen. closeHandle = true, da wir ihn hier geöffnet haben. keyStack.push({hSubKey, nextConfigPath, true}); } } } // Den Handle des aktuellen Zustands schließen, WENN er in der Schleife geöffnet wurde // Den Handle des aktuellen Zustands schließen if (currentState.closeHandle) { RegCloseKey(hKey); } Loading Loading
backends/regedit/regedit.cpp +63 −88 Original line number Diff line number Diff line Loading @@ -91,37 +91,18 @@ namespace confplus { std::stack<KeyState> keyStack; // Initialisiere den Stack mit dem Startschlüssel. // Dieser Handle wird in Registry::loadConfig geöffnet und geschlossen. keyStack.push({hRootKey, rootConfigPath, false}); while (!keyStack.empty()) { KeyState currentState = keyStack.top(); keyStack.pop(); HKEY hKey = currentState.hKey; const std::string currentConfigPath = currentState.configPath; const std::string& currentConfigPath = currentState.configPath; LONG lRes; DWORD dwValues, dwSubKeys, dwMaxValueNameLen, dwMaxValueLen, dwMaxSubKeyLen; // 1. Hole Infos über den aktuellen Schlüssel LONG lRes = RegQueryInfoKeyA( hKey, NULL, NULL, NULL, &dwSubKeys, &dwMaxSubKeyLen, NULL, &dwValues, &dwMaxValueNameLen, &dwMaxValueLen, NULL, NULL ); if (lRes != ERROR_SUCCESS) { if (currentState.closeHandle) { RegCloseKey(hKey); } continue; } // --- 2. Werte (Values) laden --- // Puffergrößen bestimmen DWORD maxNameSize = dwMaxValueNameLen > 0 ? dwMaxValueNameLen + 1 : 1; DWORD maxDataSize = dwMaxValueLen > 0 ? dwMaxValueLen + 1 : 1; Loading @@ -129,11 +110,10 @@ namespace confplus { std::unique_ptr<char[]> dataBuffer(new char[maxDataSize]); DWORD dwSizeValueName, dwSizeData, dwType; // ** ROBUSTE ITERATION ÜBER WERTE ** for (DWORD i = 0; ; ++i) { dwType = 0; dwSizeValueName = maxNameSize; dwSizeData = maxDataSize; dwSizeValueName = maxNameSize; // WICHTIG: Muss vor jedem Aufruf zurückgesetzt werden dwSizeData = maxDataSize; // WICHTIG: Muss vor jedem Aufruf zurückgesetzt werden lRes = RegEnumValueA( hKey, i, Loading @@ -146,45 +126,47 @@ namespace confplus { break; // Korrekte Terminierung } if (lRes == ERROR_SUCCESS) { std::string valueNameStr = std::string(valueNameBuffer.get()); if (lRes != ERROR_SUCCESS) { break; } // Guaranteed ERROR_SUCCESS std::string valueNameStr(valueNameBuffer.get()); std::string cname = currentConfigPath; std::string cvalue; if (!valueNameStr.empty()) { // Benannter Wert cname += "/" + valueNameStr; } else { cname += "/"; // KORREKTUR 2: Standardwert (leerer Name) explizit benennen. cname += "/@DEFAULT"; } // --- Wertkonvertierung --- if (dwType == REG_SZ) { cvalue = std::string(dataBuffer.get()); } else if (dwType == REG_DWORD) { std::stringstream ss; if (dwSizeData >= sizeof(DWORD)) { ss << *((DWORD*)dataBuffer.get()); cvalue = ss.str(); DWORD dwVal = *reinterpret_cast<DWORD*>(dataBuffer.get()); cvalue = std::to_string(dwVal); } else { continue; } } else { continue; // Ignoriere andere Registry-Typen continue; } if (cvalue.empty()) { continue; } Config::ConfigData* ckey = conf->setKey(cname); conf->setValue(ckey, 0, cvalue); } } // --- 3. Subkeys (Unterschlüssel) zur Stack hinzufügen --- DWORD maxSubKeySize = dwMaxSubKeyLen > 0 ? dwMaxSubKeyLen + 1 : 1; std::unique_ptr<char[]> subKeyNameBuffer(new char[maxSubKeySize]); // ** ROBUSTE ITERATION ÜBER SUBKEYS ** for (DWORD i = 0; ; ++i) { DWORD dwSizeSubKeyName = maxSubKeySize; DWORD dwSizeSubKeyName = maxSubKeySize; // WICHTIG: Muss vor jedem Aufruf zurückgesetzt werden lRes = RegEnumKeyExA( hKey, i, Loading @@ -193,33 +175,26 @@ namespace confplus { ); if (lRes == ERROR_NO_MORE_ITEMS) { break; // Korrekte Terminierung break; // Korrekte Terminierung, springt zum nächsten KeyState } if (lRes == ERROR_SUCCESS) { HKEY hSubKey; if (lRes != ERROR_SUCCESS) { // Wenn ein Fehler auftritt, beenden wir die Subkey-Iteration für diesen Schlüssel zur Sicherheit. break; } // Öffne den Unterschlüssel (RegOpenKeyExA verwendet den Originalnamen) lRes = RegOpenKeyExA( hKey, subKeyNameBuffer.get(), 0, KEY_READ, &hSubKey ); // Guaranteed ERROR_SUCCESS HKEY hSubKey; lRes = RegOpenKeyExA(hKey, subKeyNameBuffer.get(), 0, KEY_READ, &hSubKey); if (lRes == ERROR_SUCCESS) { std::string subKeyNameStr = std::string(subKeyNameBuffer.get()); // KORREKTUR 3: Normalisierung des Subkey-Namens zu Kleinbuchstaben std::transform(subKeyNameStr.begin(), subKeyNameStr.end(), subKeyNameStr.begin(), [](unsigned char c){ return std::tolower(c); }); std::string subKeyNameStr(subKeyNameBuffer.get()); std::string nextConfigPath = currentConfigPath + "/" + subKeyNameStr; // Schlüssel auf den Stack legen. closeHandle = true, da wir ihn hier geöffnet haben. keyStack.push({hSubKey, nextConfigPath, true}); } } } // Den Handle des aktuellen Zustands schließen, WENN er in der Schleife geöffnet wurde // Den Handle des aktuellen Zustands schließen if (currentState.closeHandle) { RegCloseKey(hKey); } Loading