首页
社区
课程
招聘
[求助]删除注册表项代码里面一个离奇的故事
发表于: 2013-5-1 23:23 5268

[求助]删除注册表项代码里面一个离奇的故事

2013-5-1 23:23
5268
#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 下的所有子键

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
SHDeleteKey ~~~
2013-5-2 14:01
0
雪    币: 59
活跃值: (142)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
我知道可以用SHDeleteKey
主要是上面遇到的这个问题  不知道是怎么回事···
2013-5-2 20:38
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
因为HKEY_CURRENT_USER\根本就不存在……这个项是映射出来的……
2013-5-2 20:43
0
雪    币: 59
活跃值: (142)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
大大  我这里没有直接作用HKEY_CURRENT_USER\
我是拼接新的子键路径再  作用的   调试时就直接重新又开始了函数
lpSubKey是函数的参数  都被更新了(大家调试就知道了  )
依然不知道怎么回事

strcat(tcNewSubKey, _T("\\"));

      retCode = RegEnumKeyExA(hSubKey, 0, tcKeyName, &dwKeyNameSize,
        NULL, NULL, NULL, NULL);
      if (retCode == ERROR_NO_MORE_ITEMS)
      {
        break;
      }
      strcat(tcNewSubKey, tcKeyName);  //拼接新的子键路径
2013-5-4 00:01
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
本来就是递归调用,当然会再进函数。你既然是调试,那看栈回溯了没?另递归的函数调试不是很方便,建议用打日志的方法,比如printf,OutputDebugString,DbgPrint等。不要过分依赖调试器而忽略日志。
2013-5-4 13:22
0
雪    币: 59
活跃值: (142)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
小菜眼花了···不好意思···
2013-5-4 20:46
0
游客
登录 | 注册 方可回帖
返回
//