[gelöst] Registry exportieren, Speicherproblem ?
-
Guten morgen erstmal
Mich beschäftigt jetzt schon mehrere Nächte ein Problem..
Mit folgendem Code möchte ich die Registry exportieren:#ifndef _XOURS_REGISTRY #define _XOURS_REGISTRY /// VERSION 0.8: exportRegistry #include <windows.h> #include <fstream> #include "xstring.hpp" #define KEY_WOW64_64KEY 0x0100 #define KEY_WOW64_32KEY 0x0200 #define MAX_EXPORT_SUBKEYS 800 #define MAX_EXPORT_VALUES 1000 #define KEY_ACCESS_MODE (KEY_READ) #ifdef WIN32_REGEXPORT #undef KEY_ACCESS_MODE #define KEY_ACCESS_MODE (KEY_READ | KEY_WOW64_32KEY) #endif #ifdef WIN64_REGEXPORT #undef KEY_ACCESS_MODE #define KEY_ACCESS_MODE (KEY_READ | KEY_WOW64_64KEY) #endif using namespace std; enum { FILE_TRUNCATE = 1, FILE_APPEND = 2 }; bool setPrivilegs (HANDLE token, LPCTSTR privilegs, bool enable); void fileOpen (fstream *stream, char* path, int mode); bool fileWrite (fstream *stream, char* data); void fileClose (fstream *stream); /// TODO /* - [done] Schlüßeltyp beim Export berücksichtigen (Binary, DWORD) - [done] Dateiname angeben lassen - [done] eigene Streamfunktionen zum Schreiben der Datei erstellen (XFile ist ungeeignet) - u.U. Klasse XRegistry erstellen (!) - [done] root = NULL -> next wird auf ParentKey geprüft - [fixed] Crash wenn next = NULL, Ursache war bufferoverflow von subkey bei mehr als MAX_EXPORT_SUBKEYS Subkeys - [fixed] Crash wenn exclude = NULL - [fixed] beim Exportieren ohne Werte wird root-Key nicht mit in Datei geschrieben - [fixed] beim Exportieren mit Werten und next = NULL werden Werte nicht mit exportiert - Programm hängt sich beim Versuch kompletten ParentKey zu exportieren auf, Ursache: keine Berechtigung ! - Programm hängt sich auf, bei zu hoher MAX_EXPORT_SUBKEYS definierung */ int function = 0; bool exportRegistry (HKEY root, XString next, char* fileName, bool getValues = false, XString *exclude = NULL, int numOfExcludes = 0, XString path = "") { [...] if (getValues == true) // Subkeys mit Werten exportieren { RegQueryInfoKey (hTempKey, 0, 0, 0, 0, 0, 0, &numValues, 0, &sizeContent, 0, 0); cout << numValues << " : " << function << " (Content: " << sizeContent << ")" << endl; if (numValues > MAX_EXPORT_VALUES) numValues = MAX_EXPORT_VALUES; for (int x = 0; x < numValues; x++) { sizeName = 1024; sizeContent = 2048; for (int k = 0; k < sizeName; k++) //wenn auf heap, dann *valueName = NULL valueName[k] = '\0'; for (int k = 0; k < sizeContent; k++) //wenn auf heap, dann *valueContent = NULL valueContent[k] = '\0'; RegEnumValue (hTempKey, x, valueName, &sizeName, NULL, &dwGetType, valueContent, &sizeContent); cout << endl << x+1 << " von " << numValues << endl; [...] } } [...] delete [] subkeys; return true; } [...] #endif // _XOURS_REGISTRY
So, bitte micht nicht erschlagen, weil ich euch mit Code erschlage
Jedenfalls soll mir die Funktion mehrere Möglichkeiten bieten:
Einmal das Exportieren ohne der Subkey-Werte und einmal eben mit (getValues).
Außerdem soll über das Argument exludes die Schlüßel angegeben werden, die ignoriert werden sollen (das klappt auch ohne Probleme).Wenn ich mir nur die Subkeys aus z.B. HKEY_LOCAL_MACHINE/Software ausgeben lassen muckt die Funktion auch nicht rum, ABER wenn ich den gesamten HKEY_LOCAL_MACHINE Key exportieren will, steckt die Funktion hier fest:
RegOpenKeyEx (first, buffer.string, 0, KEY_ACCESS_MODE, &hTempKey); if (numValues > MAX_EXPORT_VALUES) numValues = MAX_EXPORT_VALUES; if (getValues == true) // Subkeys mit Werten exportieren { RegQueryInfoKey (hTempKey, 0, 0, 0, 0, 0, 0, &numValues, 0, 0, 0, 0); for (int x = 0; x < numValues; x++) { // ... in dem Teil hakt es jetzt } ...
Prinzipiell zur Funktionsweise: Die Funktion geht anfänglich alle Subkeys durch und speichert diese im String-Array subkeys. Das ist auch die erste for-Schleife. Wenn in dieser Schleife Keys auffällig werden, die mehr als MAX_EXPORT_SUBKEYS Subkeys haben, werden diese einfach übersprungen. Das geht auch einwandfrei (excludes werden da auch berücksichtigt). Danach geht die Funktion den Array subkeys durch, bis durch {EOK} signalisiert wird, dass keine weiteren Subkeys vorhanden sind.
Dann gehts an die Werte. Erst werden die Werte abgefragt, wenn es mehr als MAX_EXPORT_VALUES sind, wird numValues auf MAX_EXPORT_VALUES festgelegt. Wenn dann aus den subkeys die Werte gelesen und geschrieben wurden, kommts zur Rekursion.
Jetzt gibt es 2 Fehler, die immer wieder auftreten und ich nicht gebacken kriege. Erstmal, wenn ich nicht die nötigen Rechte habe, den Key zu öffnen bzw. den Value auszulesen dann bleibt das Programm einfach stehen. Es hängt sich nicht auf, es steht einfach (als hätt ich nen wait reingehängt).
Dann das schwerwiegendere Problem: Sobald ich MAX_EXPORT_VALUES höher setze (wie oben z.B. auf 1000) und eben versuche HKEY_LOCAL_MACHINE komplett zu exportieren, springt mir in der for-Schleife in der die Values gelesen werden sollen numValues plötzlich auf 808460388 obwohl er vorher auf 4 war.
Das Problem ist natürlich, dass die for-Schleife ja einfach weiterläuft, weil numValues so horrend hoch ist ..wenn ich andere Abbruchbedingungen mit einbringe (z.B. ERROR_NO_MORE_ITEMS) saftet mir das Programm einfach weg. Zuerst dacht ich, dass ich numValues iwo veränder aber das ist nicht der Fall.
Der Debugger sagt mir "Program received signal SIGTRAP, Trace/breakpoint trap. In ntdll!TpWaitForAlpcCompletion () (C:\windows\system32\ntdll.dll)" und "Cannot access memory at address 0x0". Das hilft mir bloß leider auch nicht all zu viel, außer dass es iwo ein Speicherproblem geben wird, ich habe bloß keinen blassen Schimmer wo.
Hab das ganze mal zu nem Paket geschnürt inkl. XString und der main.cpp.
Hoffe ihr versteht was mein Problem ist und habt den bestimmt viel zu einfachen Tipp für die LösungDanke schonmal im Voraus.
EDIT: Code aufs (wahrscheinlich) wesentliche gekürzt ^^
-
Wie wäre es wenn Du Fehlerbehandlungen in Deinen Code einbauen würdest?
Die Reg... Funktionen geben direkt den Fehlercode zurück, was schief gegangen ist.
-
Hatte ich schonmal probiert und habe es auch grade nochmals probiert, der Rückgabewert ist immer 0.
Aber dadurch, dass ich es nochmal probiert habe, ist mir der Fehler aufgefallen ^^
Habe die Daten ja von Binär in Hex umgewandelt (dadurch werden die ja 3x so groß) und das Ergebnis in valueContent (3x zu klein für die Daten ^^) reingeschrieben ..
Da hatte der Speicher natürlich was dagegen, 3 mal so viel wie angefordert aufzunehmen ..Hoffe das war das Problem, danke auf jeden Fall für das Beseitigen der Scheuklappen ^^