注册表遍历

该程序演示了如何遍历Windows注册表的特定键并枚举其子键和值。主要涉及HKEY_LOCAL_MACHINE下的遍历,通过RegEnumKeyEx和RegEnumValue函数获取键名、值名及数据。程序输出每个键值对的信息,并支持递归遍历子键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序如下:

// 11.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <stdio.h> 

#include <time.h> 

#include <windows.h> 

 

HKEY   hKey[]   =   {HKEY_CLASSES_ROOT, 

      HKEY_CURRENT_USER, 

      HKEY_LOCAL_MACHINE, 

      HKEY_USERS, 

      HKEY_CURRENT_CONFIG}; 

char   *sKey[]   =   { "HEKY_CLASSES_ROOT", 

      "HEKY_CURRENT_USER", 

      "HEKY_LOCAL_MACHINE", 

      "HEKY_USERS", 

      "HEKY_CURRENT_CONFIG"}; 

 

char data_set[1024]; 

DWORD nCount   =   0; //   calculate   the   keys   number 

 

void   EnumValue(HKEY hKey) 

int   dwIndex   =   0; 

char valuename[MAX_PATH   +   1]; 

DWORD valuenamelen; 

DWORD Type; 

union{ 

BYTE data[1024]; 

DWORD idata; 

}lpdata; 

DWORD datalen; 

 

valuenamelen   =   sizeof(valuename); 

datalen   =   sizeof(lpdata); 

memset(&lpdata,0,sizeof(lpdata)); 

while(::RegEnumValue   (hKey,dwIndex,(LPTSTR)valuename,&valuenamelen, 

0,&Type,lpdata.data,&datalen)   !=   ERROR_NO_MORE_ITEMS) 

switch(Type) 

case   REG_SZ: 

printf( "value:/t%s/tdata:/t%s/n ",valuename,(char*)lpdata.data); 

break; 

case   REG_DWORD: 

printf( "value:/t%sdata:/t%ld/n ",valuename,lpdata.idata); 

break; 

default: 

break; 

 

dwIndex   ++; 

valuenamelen   =   sizeof(valuename); 

datalen   =   sizeof(lpdata); 

memset(&lpdata,0,sizeof(lpdata)); 

 

 

void   EnumKey(HKEY hKey,char   *sKey) 

HKEY h; 

int   dwIndex   =   0; 

 

char strkey[2048]; 

char name[1024]   =   {0}; 

DWORD namelen   =   sizeof(name); 

FILETIME ftLastWriteTime; 

//printf("befor RegOpenKeyEx data_set is %s!/n",data_set);

 

if(::RegOpenKeyEx(hKey,(LPTSTR)data_set,0,KEY_READ,&h)!=ERROR_SUCCESS) 

//printf( "cann 't   open   key   %s!/n ",strkey); 

//printf( "cann 't   open   key  %s!/n ",sKey); 

return; 

printf( "open key %s ok!/n ",sKey);

//printf("after RegOpenKeyEx data_set is %s!/n",data_set);

while(::RegEnumKeyEx(h,dwIndex,name,&namelen,0,NULL,NULL,&ftLastWriteTime)!=ERROR_NO_MORE_ITEMS) 

EnumValue(h); 

nCount   ++; 

//printf( "%s//%s/n ",sKey,name);

//strcpy(name,"//");

Sleep(100); 

HKEY hk;

 

if(::RegOpenKeyEx(h,(LPTSTR)name,0,KEY_READ,&hk)   ==   ERROR_SUCCESS) 

{

strcpy(data_set, ""); 

strcpy(strkey,sKey); 

strcat(strkey, "//"); 

strcat(strkey,name);

//printf("--view item %s success!/n",strkey);

EnumKey(hk,strkey); 

::RegCloseKey(hk); 

dwIndex   +=   1; 

namelen   =   sizeof(name); //must   be   specified   every   time!!! 

::RegCloseKey   (hKey); 

 

 

void   main() 

printf( "Enum   all   reg   keys   and   values/n "); 

time_t start,end; 

time(&start); 

//for(int   i   =   0   ;   i   <   5;   i++) 

//{ 

//strcpy(data_set, " "); 

//EnumKey(hKey[i],sKey[i]); 

EnumKey(HKEY_LOCAL_MACHINE,"HEKY_LOCAL_MACHINE");

//} 

time(&end); 

printf( "altogether   %ld   keys!!!/n ",nCount); 

printf( "using   time   :   %ld   seconds!/n ",end   -   start   ); 

 

}

程序来自网上,被我稍微修改了下,修改的地方都注释起来了,是可以用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值