Невозможно распечатать подключи подразделов через рекурсию в системном реестре

0

Я пытаюсь найти подразделы подключений для ключа в HIVE.Below опубликовал мой код, я могу получить все вспомогательные ключи в реестре. Однако я не могу получить подразделы для subkeys в registry.I написал рекурсивный код, чтобы сделать это! Однако, это не дает мне выхода! Любая помощь будет высоко оценен!

#include <stdio.h>
#include <windows.h>
#include <tchar.h>

#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383

void QueryKey(HKEY hkey)
{
    TCHAR achKey[MAX_KEY_LENGTH]; 
    DWORD cbName; 
    TCHAR achClass[MAX_PATH] = TEXT("");
    DWORD cchClassName = MAX_PATH; 
    LPBYTE data = (LPBYTE)malloc(512);
    DWORD cSubKeys=0; 
    DWORD dataType,cbMaxSubKey,cchMaxClass,cValues,retcode2,valueType,dataSize;
    long lResult;
    DWORD cchMaxValue,cbMaxValueData; 
    int y;
    DWORD cbSecurityDescriptor;
    char buffer[255]= {0};
    DWORD dwbuffersize = sizeof(buffer);
    FILETIME ftLastWriteTime; 
    DWORD i, retCode,retCode2;
    TCHAR achValue[MAX_VALUE_NAME];
    DWORD cchValue = MAX_VALUE_NAME;

    retCode = RegQueryInfoKey(hkey, 
        (LPWSTR)achClass, &cchClassName,NULL, &cSubKeys,&cbMaxSubKey, &cchMaxClass,  
        &cValues,&cchMaxValue, &cbMaxValueData, &cbSecurityDescriptor,
        &ftLastWriteTime);           
    if(cSubKeys)
    {
        printf("\n Subkey Names:");
        for(i=0; i<cSubKeys; i++)
        {
            cbName = MAX_KEY_LENGTH;
            retCode = RegEnumKeyEx(hkey, i,(LPWSTR)achKey,&cbName,          
                                   NULL,NULL,NULL,&ftLastWriteTime);
            if(retCode == ERROR_SUCCESS)
            {
                printf("\n(%d) %S", i+1, achKey);
                QueryKey((HKEY)subkey);
            }
        }
        printf("\n Number of subkeys: %d\n\n", cSubKeys);
    }
    else
        printf("\n there is no subkey");

    if (cValues) 
    {
        printf( "\nNumber of values: %d\n", cValues);

        for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) 
        { 
            cchValue = MAX_VALUE_NAME; 
            achValue[0] = '\0'; 
            retCode2 = RegEnumValue(hkey, i, achValue, &cchValue, NULL, 
                                    &dataType, data, &dataSize);
            if(retCode2==ERROR_SUCCESS)
                printf("\n%u",&dataType);
            else
                printf("no");

            if (retCode == ERROR_SUCCESS ) 
                _tprintf(TEXT("\n(%d) %s"), i+1,achValue); 
        }
    }
    else
        printf("bye");
}

int main(int argc , char *argv[])
{
    HKEY hTestKey;
    TCHAR buffer[260];
    DWORD bufferSize = sizeof(buffer);

    if(RegOpenKeyEx( HKEY_LOCAL_MACHINE, NULL, 0, KEY_READ, &hTestKey) == ERROR_SUCCESS)
    {
        printf("\n-------Registry Information----------");
        printf("\n HIVE_NAME :  HKEY_LOCAL_MACHINE"); 
        QueryKey(hTestKey);
    }
    else
        printf("bye");

    RegCloseKey(hTestKey);

    return 0;
}
Теги:
recursion
enumeration
system

2 ответа

0
Лучший ответ

Вы не можете просто передать имя строки QueryKey в HKEY для QueryKey. Вам нужно передать фактический HKEY, который вы получите, открыв ключ:

            HKEY subkey;
            LONG r = RegOpenKeyEx(hkey, achKey, 0, KEY_ALL_ACCESS, &subkey);
            if (r == ERROR_SUCCESS) {
                QueryKey(subkey);
                RegCloseKey(subkey);
            }
  • 0
    я попытался поставить это .. но результат тот же!
  • 0
    HKEY подключ; LONG r = RegOpenKeyEx (hkey, achKey, 0, KEY_ALL_ACCESS, & subkey); if (r = ERROR_SUCCESS) {QueryKey (подраздел); RegCloseKey (подключ); } когда я делаю это, я вижу ноль рядом с каждым подразделом в улье! есть идеи по этому поводу?
Показать ещё 2 комментария
0

Попробуйте что-нибудь еще:

#ifdef UNICODE
#define TCHAR_FMT "%S"
#else
#define TCHAR_FMT "%s"
#endif

typedef std::basic_string<TCHAR> tstring;

void QueryKey(HKEY hkey, const tstring &keyPath)
{
    TCHAR achKey[MAX_KEY_LENGTH]; 
    DWORD cbName; 
    TCHAR achClass[MAX_PATH] = {0};
    DWORD cchClassName = MAX_PATH; 
    DWORD cSubKeys = 0; 
    DWORD dataType, cbMaxSubKey, cchMaxClass, cValues, valueType, dataSize;
    long lResult;
    DWORD cchMaxValue, cbMaxValueData; 
    DWORD cbSecurityDescriptor;
    FILETIME ftLastWriteTime; 
    DWORD i;
    TCHAR achValue[MAX_VALUE_NAME];
    DWORD cchValue = MAX_VALUE_NAME;
    HKEY hTmpKey;

    lResult = RegQueryInfoKey(hkey, 
        achClass, &cchClassName, NULL, &cSubKeys, &cbMaxSubKey, &cchMaxClass,  
        &cValues, &cchMaxValue, &cbMaxValueData, &cbSecurityDescriptor,
        &ftLastWriteTime);           

    if (lResult != ERROR_SUCCESS)
    {
        printf("\n cannot query key: " TCHAR_FMT ", error %d", keyPath.c_str(), lResult);
        return;
    }

    if (cSubKeys)
    {
        printf("\n Number of subkeys: %u", cSubKeys);
        printf("\n Subkey Names:");
        for(i = 0; i < cSubKeys; ++i)
        {
            cbName = MAX_KEY_LENGTH;
            lResult = RegEnumKeyEx(hkey, i, achKey, &cbName,          
                                   NULL, NULL, NULL, &ftLastWriteTime);
            if (lResult == ERROR_SUCCESS)
            {
                achKey[cbName] = 0;
                printf("\n(%u) " TCHAR_FMT, i+1, achKey);

                tstring subkeyPath = keyPath + TEXT("\\") + achKey;

                lResult = RegOpenKeyEx(hKey, achKey, 0, KEY_READ, &hTmpKey);
                if (lResult == ERROR_SUCCESS)
                {
                    QueryKey(hTmpKey, subkeyPath);
                    RegCloseKey(hTmpKey);
                }
                else
                    printf("\n cannot open subkey: " TCHAR_FMT ", error %d", subkeyPath.c_str(), lResult);
            }
            else
                printf("\n cannot query subkey name, error %d", lResult);
        }
    }
    else
        printf("\n there is no subkey");

    if (cValues) 
    {
        printf( "\nNumber of values: %u\n", cValues);

        for (i = 0, i < cValues; ++i) 
        { 
            cchValue = MAX_VALUE_NAME; 
            lResult = RegEnumValue(hkey, i, achValue, &cchValue, NULL, 
                                    &dataType, data, &dataSize);
            if (lResult == ERROR_SUCCESS)
            {
                achValue[cchValue] = 0; 
                printf("\n (%d) %u: " TCHAR_FMT, i+1, dataType, achValue); 
            }
            else
                printf("\n cannot query value name, error %d", lResult);
        }
    }
    else
        printf("\n there is no value");
 }

int main(int argc, char *argv[])
{
    HKEY hTestKey;

    printf("\n-------Registry Information----------");
    printf("\n HIVE_NAME :  HKEY_LOCAL_MACHINE"); 

    if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, NULL, 0, KEY_READ, &hTestKey) == ERROR_SUCCESS)
    {
        QueryKey(hTestKey, TEXT("\\"));
        RegCloseKey(hTestKey);
    }
    else
        printf("\n cannot open hive, error %d", lResult);

    return 0;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню