无法通过系统注册表中的递归打印子项的子项

Unable to print Subkeys of the subkeys through recursion in the System Registry

本文关键字:递归 打印 注册表 系统      更新时间:2023-10-16

我正在尝试为HIVE中的键查找子键的子键。下面发布的是我的代码我可以获得注册表中的所有子项。但是,我无法在注册表中获取子项的子项。我写了一个递归代码来做到这一点!然而,它并没有给我任何输出!如有任何帮助,我们将不胜感激!

#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: %dnn", cSubKeys);
    }
    else
        printf("n there is no subkey");
    if (cValues) 
    {
        printf( "nNumber of values: %dn", cValues);
        for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) 
        { 
            cchValue = MAX_VALUE_NAME; 
            achValue[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;
}

不能只将子键的字符串名称传递给HKEYQueryKey。你需要通过一个实际的HKEY,你可以通过打开密钥获得:

            HKEY subkey;
            LONG r = RegOpenKeyEx(hkey, achKey, 0, KEY_ALL_ACCESS, &subkey);
            if (r == ERROR_SUCCESS) {
                QueryKey(subkey);
                RegCloseKey(subkey);
            }

试试类似的东西:

#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: %un", 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;
}