#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
//该函数用于删除注册表下某个键以及他的所有子键
bool DeleteKey(HKEY hMainKey, LPSTR lpSubKey)
{
HKEY hSubKey;
//打开要删除的这个注册表键的句柄
LONG ReturnValue = ::RegOpenKeyExA (hMainKey, lpSubKey,
0L, KEY_ENUMERATE_SUB_KEYS, &hSubKey);
LONG lDelRetValue;
TCHAR tcNewSubKey[MAX_PATH] = {0};
if (ReturnValue == ERROR_SUCCESS)
{ //循环枚举指定键获得他所有的子键
TCHAR tcKeyName[128];
DWORD dwKeyNameSize = 128;
int i = 0, retCode = 0;
while (1)
{
memset(tcKeyName, 0, 256*sizeof(TCHAR));
strcpy(tcNewSubKey, lpSubKey);
strcat(tcNewSubKey, _T("\\"));
//索引值为0表示获得第一个子键名称。当第二次枚举时,
//因为第一个已经被删除,所以第二个变成了第一个,所以每次都是获得第一个。
retCode = RegEnumKeyExA(hSubKey, 0, tcKeyName, &dwKeyNameSize,
NULL, NULL, NULL, NULL);
if (retCode == ERROR_NO_MORE_ITEMS)
{
break;
}
strcat(tcNewSubKey, tcKeyName); //拼接新的子键路径
//递归调用删除该键及其下面所有子键。
if (!DeleteKey(hMainKey, tcNewSubKey))
{
return FALSE;
//各位大大 小菜不知道为什么从这里调试 直接又跳到了HKEY hSubKey; 这里,
//而且lpSubKey都被更新了 在主函数里面没有while语句
//为什么从这个if出来又开始了 DeleteKey 函数
}
dwKeyNameSize = 128;
}
}
//待注册表键的子键全部删除后再删除它
lDelRetValue = RegDeleteKey(hMainKey, lpSubKey);
return lDelRetValue==ERROR_SUCCESS;
}
int main(int argc, char* argv[])
{
if (DeleteKey(HKEY_CURRENT_USER, "a"))
{
printf("成功删除");
}
else
{
printf("删除失败");
}
return 0;
}
最近在学习编程,看到一个小问题,调试不通过
代码主要目的: 删除HKEY_CURRENT_USER\a 下的所有子键
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)