Problem mit Registry-Manager



  • Hallo!

    Ich schreibe ja gerade an einem Registry-Manager und was eig schon problemlos funktioniert ist das auflisten von Subkeys.

    Wo ich aber ein Problem habe, sind die values.

    Bei RegQueryKey bleibt values immer auf 0,
    habs öfter durch den Debugger rennen lassen, komme jedoch nicht auf den Fehler.

    Könnt ihr mir da helfen?

    #include <windows.h>
    #include <winreg.h>
    #include <stdio.h>
    
    int enumsubkeys(HKEY key);
    int enumvalues(HKEY subkey);
    
    extern SOCKET sendsock;
    extern SOCKADDR_IN address;
    
    int parameter=0;
    
    unsigned long int subkeys=0;
    unsigned long int values=0;
    unsigned long int size=200;
    
    unsigned long int index=0;
    
    char string [20] [200];
    char path [20] [200];
    unsigned long int buffersize=200;
    
    unsigned long int i;
    
    unsigned long int subvalues;
    char value[20][200];
    
    unsigned long int zaehler=0;
    
    int rc=0;
    int k=0;
    
    char singlestring[200];
    
    int nummer;
    
    int regeditor(void)
    
    {
    
    HKEY rootkey[4];
    HKEY hkey;
    HKEY newkey[20];
    
    rootkey[0]=HKEY_USERS;
    rootkey[1]=HKEY_CURRENT_USER;
    rootkey[2]=HKEY_LOCAL_MACHINE;
    rootkey[3]=HKEY_USERS;
    rootkey[4]=HKEY_PERFORMANCE_DATA;
    
    i=0;
    
    if(i==0)
    {
    hkey=rootkey[parameter];
    }
    
    strcpy(path[0],singlestring);
    
    do 
    {
    
    RegQueryInfoKey(hkey,NULL,NULL,NULL,&subkeys, NULL,
    		                NULL,&values,NULL,NULL,NULL,NULL);
    
    if(subkeys!=0)
    {
    rc=enumsubkeys(hkey); 
    }
    else
    {
    
      if (values!=0)
    
        {
         enumvalues(hkey);  
    
        }
    
    }
    
    scanf("%i",&nummer);
    
    strcpy(path[i],string[nummer]);
    
    memset(string,0,sizeof(string));
    
    RegOpenKeyEx(hkey,path[i],0,KEY_ALL_ACCESS,&newkey[k]); 
    hkey=newkey[k];
    
    k=k+1;
    i=i+1;
    
    }while(1);
    
    	return 0;
    }
    
    int enumsubkeys(HKEY key)
    
    {
    
    for (zaehler=0,index=0;zaehler<=(subkeys);index++,zaehler++)
    
    {
    
    RegEnumKey(key,index,string[zaehler],buffersize);
    printf("%s\n",string[zaehler]);
    Sleep(90);
    }
    
    return 0;
    }
    
    int enumvalues(HKEY subkey)
    
    {
    
    unsigned long int i;
    unsigned long int valueindex=0;
    unsigned long int values;
    unsigned long int valuesize=sizeof(value);
    
    unsigned long int *a;
    RegQueryInfoKey(subkey,NULL,NULL,NULL,&subvalues,
    		                NULL,NULL,&values,NULL,NULL,NULL,NULL);
    
    for (i=0;i<=values;valueindex++,i++)
    {
    RegEnumValue(subkey,valueindex,value[valueindex],&valuesize,NULL,NULL,NULL,NULL);
    
    printf("%s",value[valueindex]);
    
    }
    
    return 0;
    }
    
    int main()
    
    {
    
    regeditor();
    
    return 0;
    }
    

    MFG



  • Bitte helft mir ich komm da einfach nicht weiter....obwohl ich schon viel ausgebessert habe.

    Jetzt werden zumindest schon ein paar values angezeigt aber mir ist unklar wie ich das beheben könnte.

    Hier mal der verbesserte Code, falls mir jmd helfen will.

    #include <windows.h>
    #include <winreg.h>
    #include <stdio.h>
    
    int enumsubkeys(HKEY key);
    int enumvalues(HKEY subkey);
    
    extern SOCKET sendsock;
    extern SOCKADDR_IN address;
    
    int parameter=0;
    
    unsigned long int subkeys=0;
    unsigned long int values=0;
    unsigned long int size=200;
    
    unsigned long int index=0;
    
    char string [30] [200];
    char path [30] [200];
    unsigned long int buffersize=200;
    
    unsigned long int i;
    
    unsigned long int subvalues;
    char value[20][255];
    
    unsigned long int zaehler=0;
    
    int rc=0;
    int k=0;
    
    char singlestring[200];
    
    int nummer;
    
    int regeditor(void)
    
    {
    
    HKEY rootkey[4];
    HKEY hkey;
    HKEY newkey[20];
    
    rootkey[0]=HKEY_USERS;
    rootkey[1]=HKEY_CURRENT_USER;
    rootkey[2]=HKEY_LOCAL_MACHINE;
    rootkey[3]=HKEY_USERS;
    rootkey[4]=HKEY_PERFORMANCE_DATA;
    
    i=0;
    
    if(i==0)
    {
    hkey=rootkey[parameter];
    }
    
    strcpy(path[0],singlestring);
    
    do 
    {
    
    RegQueryInfoKey(hkey,NULL,NULL,NULL,&subkeys, NULL,
    		                NULL,&values,NULL,NULL,NULL,NULL);
    
    if(subkeys!=0)
    {
    rc=enumsubkeys(hkey); 
    }
    else
    {
    
      if (values!=0)
    
        {
         enumvalues(hkey);  
    
        }
    
    }
    
    scanf("%i",&nummer);
    
    strcpy(path[i],string[nummer]);
    
    memset(string,0,sizeof(string));
    
    RegOpenKeyEx(hkey,path[i],0,KEY_ALL_ACCESS,&newkey[k]); 
    hkey=newkey[k];
    
    k=k+1;
    i=i+1;
    
    }while(1);
    
    return 0;
    }
    
    int enumsubkeys(HKEY key)
    
    {
    
    for (zaehler=0,index=0;zaehler<=(subkeys);index++,zaehler++)
    
    {
    
    RegEnumKey(key,index,string[zaehler],buffersize);
    printf("%s\n",string[zaehler]);
    Sleep(90);
    }
    
    return 0;
    }
    
    int enumvalues(HKEY subkey)
    
    {
    
    unsigned long int valueindex=0;
    unsigned long int valuesize=254;
    unsigned long int *a;
    
    char kA[255];
            NULL,NULL,&values,NULL,NULL,NULL,NULL);
    
    for (;valueindex<=30;valueindex++)
    {
    RegEnumValue(subkey,valueindex,kA,&valuesize,NULL,NULL,NULL,NULL);
    
    printf("%s\n",kA);
    
    }
    
    return 0;
    }
    
    int main()
    
    {
    
    regeditor();
    
    return 0;
    }
    


  • RegEnumValue () hat die unangenehme Eigenschaft, nach Aufruf den Wert des 4. Parameters zu verändern.

    // Zeile 126 :
    
    valuesize = sizeof(kA); // !!! muss immer wieder neu gesetzt werden !!!
    RegEnumValue(subkey,valueindex,kA,&valuesize,NULL,NULL,NULL,NULL);
    


  • DANKE!! es funzt jetzt prima 🙂



  • Ein letztes Problem hab ich aber leider noch,

    Wenn ich beim ersten Mal zb einen Subkey wähle, der keine Unterschlüssel hat, gehts im Programm nicht wirklich weiter.

    Auch hier konnte ich mit dem Debugger noch nichts finden.

    MFG



  • ok, hat sich erledigt,thx,

    jedoch hat sich zeitgleich ein anderes Problem ergeben :D,

    wie soll ich einen binären wert ausgeben? (Konsole)

    mfg



  • Wenn ich beim ersten Mal zb einen Subkey wähle, der keine Unterschlüssel hat, gehts im Programm nicht wirklich weiter.

    Wahrscheinlich ein Problem in der Ablaufsteuerung.

    Gehe das Programm mal mit dem Debugger im Einzelschritt durch und suche die Stelle, an der das Programm dann abbricht bzw. hängenbleibt.

    Irgendwo muss eine Schleife sein, die mit Subkeys ohne Unterschlüssel nichts anfangen kann.



  • Hallo,

    im Grunde genommen war das Problem gar keins, da Standartstrings etc (die leer sind) nicht angezeigt.



  • Leider steht in der FAQ nichts darüber wie ich binäre Keys auslese und ausgebe, kann mir da jmd helfen?

    Sollte die letzte Hürde sein.

    MFG



  • Reicht es viell wenn ich einen binären Wert der in einem char array gespeichert wurde per printf hexadezimal ausgebe?

    Mfg


Anmelden zum Antworten