枚举注册表指下路径下的项RegEnumKeyEx
2023-08-16
48
0
要枚举所有注册表子健的名称,实现原理为先用RegOpenKey函数打开要遍历的注册表子健的父键,然后先调用一次RegEnumKeyEx函数,把索引设置为0,获得第一个子健,最后用循环不断地增加索引,获取其它子健,直到返回的值为非0,表示遍历结束,最后用RegCloseKey函数关闭打开的注册表父键。
其中参数hKey表示要遍历的注册表父键的句柄,dwIndex参数表示子健的索引,以0开始,lpName参数为接收子健名称的缓冲区,lpcName参数为接收子健名称的缓冲区的长度,其它参数较少使用,可以全部传入Null。
#define MAX_KEY_LENGTH 255
void EnumerateSubItem(HKEY hKey, char* subKey)
{
LONG lRes = RegOpenKeyExA(hKey, subKey, 0, KEY_READ, &hKey);
if (lRes == ERROR_SUCCESS)
{
char szValueName[MAX_KEY_LENGTH];
DWORD dwValueNameSize = sizeof(szValueName);
BYTE data[256];
DWORD dataSize = sizeof(data);
DWORD dwIndex = 0;
while (RegEnumValueA(hKey, dwIndex, szValueName, &dwValueNameSize, NULL, NULL, data, &dataSize) != ERROR_NO_MORE_ITEMS)
{
TRACE("\t%s\n", szValueName);
dwValueNameSize = sizeof(szValueName);
dataSize = sizeof(data);
dwIndex++;
}
RegCloseKey(hKey);
}
}
void EnumerateSubKeys(HKEY hKey, const char* subKey)
{
HKEY hSubKey;
if (RegOpenKeyExA(hKey, subKey, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
{
CHAR achKey[MAX_KEY_LENGTH];
DWORD cbName;
DWORD i=0;
cbName = MAX_KEY_LENGTH;
while (RegEnumKeyExA(hSubKey, i++, achKey, &cbName, NULL, NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS)
{
CHAR Path[MAX_KEY_LENGTH] = { 0 };
strcat(Path, subKey);
strcat(Path, "\\");
strcat(Path, achKey);
TRACE("%s\n", achKey);
cbName = MAX_KEY_LENGTH;
EnumerateSubItem(hKey, Path);
}
RegCloseKey(hSubKey);
}
}
例如枚举:
EnumerateSubKeys(HKEY_LOCAL_MACHINE, "SYSTEM\\DriverDatabase\\DeviceIds");