Commit 81309fcd authored by jan.koester's avatar jan.koester
Browse files

inital support regedit

parent 35fff0f2
Loading
Loading
Loading
Loading
+12 −20
Original line number Diff line number Diff line
@@ -76,6 +76,10 @@ namespace confplus {
        return it == s.end();
    }
    
   /**
     * @brief Rekursive Funktion zum Laden von Werten und Subkeys aus der Registry.
     * KORREKTUR: Verwendet std::unique_ptr und robustes ERROR_NO_MORE_ITEMS-Muster.
     */
    void loadKeyRecursiveA(Config* conf, HKEY hKey, const std::string& currentConfigPath) {
        
        DWORD dwValues, dwSubKeys, dwMaxValueNameLen, dwMaxValueLen, dwMaxSubKeyLen;
@@ -93,7 +97,6 @@ namespace confplus {
        }
        
        // --- 2. Werte (Values) laden ---
        // maxNameSize und maxDataSize müssen die Nullterminierung mit einbeziehen
        DWORD maxNameSize = dwMaxValueNameLen > 0 ? dwMaxValueNameLen + 1 : 1;
        DWORD maxDataSize = dwMaxValueLen > 0 ? dwMaxValueLen + 1 : 1;

@@ -102,7 +105,7 @@ namespace confplus {
        DWORD dwSizeValueName, dwSizeData, dwType;

        // ** ROBUSTE ITERATION ÜBER WERTE **
        for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet
        for (DWORD i = 0; ; ++i) { 
            dwType = 0;
            dwSizeValueName = maxNameSize; 
            dwSizeData = maxDataSize;
@@ -120,15 +123,15 @@ namespace confplus {
            
            if (lRes == ERROR_SUCCESS) {
                std::string valueNameStr = std::string(valueNameBuffer.get());
                // Überspringe den '(Standardwert)', wenn benannte Werte vorhanden sind
                if (valueNameStr.empty() && dwValues > 1) { 
                    continue;
                
                // Pfad-Bildung: Standardwert (leerer Name) wird dem Sektions-Key zugewiesen
                std::string cname = currentConfigPath; 
                if (!valueNameStr.empty()) {
                    cname += "/" + valueNameStr;
                }

                std::string cname = currentConfigPath + (valueNameStr.empty() ? "" : "/" + valueNameStr);
                std::string cvalue;
                
                // Konvertierungslogik wie zuvor (REG_SZ, REG_DWORD)
                if (dwType == REG_SZ) {
                    cvalue = std::string(dataBuffer.get());
                } else if (dwType == REG_DWORD) {
@@ -145,10 +148,6 @@ namespace confplus {
                
                Config::ConfigData* ckey = conf->setKey(cname);
                conf->setValue(ckey, 0, cvalue);

            } else {
                // Bei einem anderen Fehler (z.B. Puffer zu klein) wird i trotzdem inkrementiert und die Schleife fortgesetzt.
                std::cerr << "Warning: RegEnumValueA failed (Index " << i << "): Error " << lRes << std::endl;
            }
        }

@@ -158,7 +157,7 @@ namespace confplus {
        HKEY hSubKey;

        // ** ROBUSTE ITERATION ÜBER SUBKEYS **
        for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet
        for (DWORD i = 0; ; ++i) { 
            DWORD dwSizeSubKeyName = maxSubKeySize;
            
            lRes = RegEnumKeyExA(
@@ -172,22 +171,15 @@ namespace confplus {
            }
            
            if (lRes == ERROR_SUCCESS) {
                // Öffne den Subkey
                lRes = RegOpenKeyExA(
                    hKey, subKeyNameBuffer.get(), 0, KEY_READ, &hSubKey
                );

                if (lRes == ERROR_SUCCESS) {
                    // Erzeuge den neuen Konfigurationspfad
                    std::string nextConfigPath = currentConfigPath + "/" + std::string(subKeyNameBuffer.get());
                    
                    // Rekursiver Aufruf
                    loadKeyRecursiveA(conf, hSubKey, nextConfigPath);
                    
                    RegCloseKey(hSubKey);
                }
            } else {
                std::cerr << "Warning: RegEnumKeyExA failed (Index " << i << "): Error " << lRes << std::endl;
            }
        }
    }