Commit f1e6904f authored by jan.koester's avatar jan.koester
Browse files

inital support regedit

parent 9d927c73
Loading
Loading
Loading
Loading
+84 −61
Original line number Diff line number Diff line
@@ -80,6 +80,7 @@ namespace confplus {
        
        DWORD dwValues, dwSubKeys, dwMaxValueNameLen, dwMaxValueLen, dwMaxSubKeyLen;
        
        // 1. Hole Infos über den aktuellen Schlüssel
        LONG lRes = RegQueryInfoKeyA(
            hKey, NULL, NULL, NULL, 
            &dwSubKeys, &dwMaxSubKeyLen, NULL, 
@@ -91,7 +92,8 @@ namespace confplus {
            return; 
        }
        
        if (dwValues > 0) {
        // --- 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;

@@ -99,7 +101,8 @@ namespace confplus {
        std::unique_ptr<char[]> dataBuffer(new char[maxDataSize]); 
        DWORD dwSizeValueName, dwSizeData, dwType;

            for (DWORD i = 0; i < dwValues; ++i) {
        // ** ROBUSTE ITERATION ÜBER WERTE **
        for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet
            dwType = 0;
            dwSizeValueName = maxNameSize; 
            dwSizeData = maxDataSize;
@@ -111,8 +114,13 @@ namespace confplus {
                (LPBYTE)dataBuffer.get(), &dwSizeData
            );

            if (lRes == ERROR_NO_MORE_ITEMS) {
                break; // Korrekte Terminierung
            }
            
            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;
                }
@@ -120,6 +128,7 @@ namespace confplus {
                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) {
@@ -136,16 +145,20 @@ 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;
            }
        }

        if (dwSubKeys > 0) {
        // --- 3. Subkeys (Unterschlüssel) rekursiv laden ---
        DWORD maxSubKeySize = dwMaxSubKeyLen > 0 ? dwMaxSubKeyLen + 1 : 1;
        std::unique_ptr<char[]> subKeyNameBuffer(new char[maxSubKeySize]);
        HKEY hSubKey;

            for (DWORD i = 0; i < dwSubKeys; ++i) {
        // ** ROBUSTE ITERATION ÜBER SUBKEYS **
        for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet
            DWORD dwSizeSubKeyName = maxSubKeySize;
            
            lRes = RegEnumKeyExA(
@@ -154,17 +167,27 @@ namespace confplus {
                NULL, NULL, NULL, NULL
            );

            if (lRes == ERROR_NO_MORE_ITEMS) {
                break; // Korrekte Terminierung
            }
            
            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;
            }
        }
    }