Commit 71e58e22 authored by jan.koester's avatar jan.koester
Browse files

inital support regedit

parent c88b9140
Loading
Loading
Loading
Loading
+63 −88
Original line number Diff line number Diff line
@@ -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;

@@ -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,
@@ -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,
@@ -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);
            }