读写注册表(转)

原创 2007年09月24日 16:03:00
 Win 95及NT的注册数据库(Registry)是系统中非常重要的组成部分。在Win32 API中有一组Reg函数来处理这些问题。其一般的读写过程如下:
 
    1、使用RegOpenKeyEx或RegCreateKeyEx函数打开或创建一个键; 
    2、如果上一步成功,使用RegQueryValueEx读取子键的值,使用RegSetValueEx设置子键值,使用RegEnumKey获得所有子键,使用RegDeleteKey删除一个键; 
    3、完成操作后使用RegCloseKey关闭键。 
    下面这段程序打开HKEY_CURRENT_USER/Software/Zeal SoftStudio/AskPro FTP/LastTime键,然后读取WOL子键的值。 

    HKEY hkey; 
    char sz[256]; 
    DWORD dwtype, sl = 256; 
     
    RegOpenKeyEx(HKEY_CURRENT_USER, 
    "Software//Zeal SoftStudio//AskPro FTP//LastTime", 
    NULL, KEY_ALL_ACCESS, &hkey); 
    RegQueryValueEx(hkey, "WOL", NULL, &dwtype, (LPBYTE)sz, &sl); 
    RegCloseKey(hkey); 
    MFC程序可以使用CRegKey类读写注册表。VB中调用API的办法可以参考QA000226 "如何访问Windows系统注册表"。

    打开注册键
    LONG RegOpenKeyEx( HKEY hKey,  // handle to open key 

    LPCTSTR lpSubKey,              // address of name of subkey to open 
    DWORD ulOptions,               // reserved =0
    REGSAM samDesired,             // security access mask 
    PHKEY phkResult                // address of handle to open key 
    );

    例:
    HKEY hd;
    hd=HKEY_LOCAL_MACHINE;
    char* Regkeyname="SoftWare//Xy123//Poker//";
    LONG a=RegOpenKeyEx(hd,Regkeyname,0,KEY_READ,&hd);   //成功返回ERROR_SUCCESS,否则返回错误代码
 

    关闭注册键
    LONG RegCloseKey( HKEY hKey // handle to key to close );
例:
     RegCloseKey(HKEY_LOCAL_MACHINE);
OR:  RegCloseKey(hd); 
建立注册键
LONG RegCreateKeyEx( HKEY hKey, // handle to an open key 
      LPCTSTR lpSubKey, // address of subkey name 
      DWORD Reserved, // reserved =0
      LPTSTR lpClass, // address of class string 
      DWORD dwOptions, // special options flag 
      REGSAM samDesired, // desired security access 

      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // address of key security         structure 
      PHKEY phkResult, // address of buffer for opened handle 
      LPDWORD lpdwDisposition // address of disposition value buffer );
例:
   char *sclass="";  //类名指定为空
   DWORD nbf=0;    //接受返回值,指明是建立新键还是打开已有的键.(经试验总是返回REG_OPENED_EXISTING_KEY.
   LONG II=RegCreateKeyEx(hd,Regkeyname,0,sclass,REG_OPTION_NON_VOLATILE,
                KEY_READ|KEY_WRITE,NULL,&hd,&nbf);

//REG_OPTION_NON_VOLATILE 指明键永久保留.安全结构指明NULL,自动获得一默认值
//成功返回ERROR_SUCCESS,否则返回错误代码 
枚举键值
LONG RegEnumValue( HKEY hKey, // handle to key to query 
      DWORD dwIndex, // index of value to query 
      LPTSTR lpValueName, // address of buffer for value string 
      LPDWORD lpcbValueName, // address for size of value buffer 
      LPDWORD lpReserved, // reserved =NULL
      LPDWORD lpType, // address of buffer for type code 

      LPBYTE lpData, // address of buffer for value data 
      LPDWORD lpcbData // address for size of data buffer);
例:
   DWORD dinx=0;
   char valuename[70];  //分配数值名称缓冲区
   strcpy(valuename,"DeskPattern");  //随便指定哪个键值名
   DWORD nsize=69;  //数值名称缓冲区大小
   DWORD k=REG_SZ;  //指明数据类型
   unsigned char vari[70]; //分配数值缓冲区
   DWORD ncbvari=69; //数值缓冲区大小
   dinx=0; //从0开始

   while((II=RegEnumValue(hd,dinx,valuename,&nsize,NULL,&k,vari,&ncbvari)) 
          != ERROR_NO_MORE_ITEMS)
   {
       dinx++;//索引 +1,准备取下一个值
       nsize=69; //恢复原来大小
       ncbvari=69;
   }
成功后返回值0,各变量返回后设置如下:
valuename=数值名称,以0结尾;如 : DeskColor
nsize=数值名称长度, 9
k=REG_SZ  DeskColor 的类型为 REG_SZ
vari=键值,32768 DeskColor="32768",
ncbvari=键值长度 REG_SZ包括结尾0,=6, 
读取键值
LONG RegQueryValueEx( HKEY hKey, // handle to key to query 

       LPTSTR lpValueName, // address of name of value to query 
       LPDWORD lpReserved, // reserved 
       LPDWORD lpType, // address of buffer for value type 
       LPBYTE lpData, // address of data buffer 
       LPDWORD lpcbData // address of data buffer size );
例:
   RegQueryValueEx(hd,valuename,NULL,&k,vari,&ncbvari);
变量定义及成功后各变量设置值同RegEnumValueEx 
写键值
LONG RegSetValueEx( HKEY hKey, // handle to key to set value for 
       LPCTSTR lpValueName, // name of the value to set 

       DWORD Reserved, // reserved 
       DWORD dwType, // flag for value type 
       CONST BYTE *lpData, // address of value data 
       DWORD cbData // size of value data );
例:
   strcpy(valuename,"Hello");
   unsigned char vari[10];
   DWORD k=REG_SZ;
   strcpy((char*)vari,"1234567")
   RegSetValueEx(hd,valuename,0,k,vari,7);
成功后在Poker下增加一个键值 Hello : REG_SZ : 1234567
写整型变量:
int hi=8;
RegSetValueEx(pj,valuename,0,REG_BINARY,(unsigned char*)&hi,sizeof(int));

成功后在Poker下增加一个键值 Hello2 : REG_BINARY :08 00 00 00



void AddEventSource()
{
    HKEY hk; 
    DWORD dwData; 
    UCHAR szBuf[80]; 

    // Add your source name as a subkey under the Application 
    // key in the EventLog registry key. 

    if (RegCreateKey(HKEY_LOCAL_MACHINE, 
            "SYSTEM//CurrentControlSet//Services/ 
            //EventLog//Application//SamplApp", &hk)) 
        ErrorExit("Could not create the registry key."); 

    // Set the name of the message file. 

    strcpy(szBuf, "%SystemRoot%//System//SamplApp.dll"); 

    // Add the name to the EventMessageFile subkey. 

    if (RegSetValueEx(hk,             // subkey handle 
            "EventMessageFile",       // value name 
            0,                        // must be zero 
            REG_EXPAND_SZ,            // value type 
            (LPBYTE) szBuf,           // pointer to value data 
            strlen(szBuf) + 1))       // length of value data 

        ErrorExit("Could not set the event message file."); 

    // Set the supported event types in the TypesSupported subkey. 

    dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | 
        EVENTLOG_INFORMATION_TYPE; 

    if (RegSetValueEx(hk,      // subkey handle 
            "TypesSupported",  // value name 
            0,                 // must be zero 
            REG_DWORD,         // value type 
            (LPBYTE) &dwData,  // pointer to value data 

            sizeof(DWORD)))    // length of value data 
        ErrorExit("Could not set the supported types."); 

    RegCloseKey(hk); 




以下代码把注册表自启动shell的键值改写为C:/DK1/ATM/HARP/ExAtmShell.exe:

         HKEY hkey;
LONG res; 
DWORD datatype=REG_SZ; 
unsigned char szvalue[_MAX_PATH];
strcpy((char*)szvalue,"C://DK1//ATM//HARP//ExAtmShell.exe");

res =::RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
"SOFTWARE//Microsoft//Windows NT//CurrentVersion//Winlogon//", 0, 
KEY_WRITE|KEY_READ, &hkey); 

if(res!=ERROR_SUCCESS)
{
AfxMessageBox("aaa");
return;
}
res = ::RegSetValueEx(hkey, "Shell", 0, datatype, szvalue, strlen(LPCSTR(szvalue))); 

RegCloseKey(hkey);
if(res==ERROR_SUCCESS)
::AfxMessageBox("你已经成功地将注册表自启动shell的键值设置为C://DK1//ATM//HARP//ExAtmShell.exe");
else
::AfxMessageBox("设定失败:目标位置不存在这样的键!");

火狐(Firefox)浏览器解决首页捆绑的问题

360是解决不了问题的,因为360的浏览器修复主要是注册表和应用程序捆绑,而且大多是针对基于IE内核的 火狐是拥有的自己的内核和扩展机制,对于火狐主页被捆绑,症状如下: 1.打开火狐,出现...
  • prsniper
  • prsniper
  • 2016年07月30日 20:53
  • 1261

TortoiseGit安装注意事项

1.TortoiseGit安装同QQ,再次不具体说明,但是TortoiseGit安装之后有可能需要做的几个修改 。      (1).regedit打开注册表                     ...
  • Luomingkui1109
  • Luomingkui1109
  • 2017年05月23日 23:02
  • 591

对360沙盒的驱动的一点逆向分析---发文于2014-1-19

主要内容: 一.360Box沙箱DriverEntry函数安装驱动过滤框架分析 二. 360Box沙箱注册表监控分析 三. 360沙箱文件系统监控分析 一.360Box沙箱Driv...
  • feivirus
  • feivirus
  • 2016年01月15日 22:56
  • 1449

深入应用看本质之-ARP协议

深入应用看本质之-ARP协议
  • feipeixuan
  • feipeixuan
  • 2014年04月26日 18:11
  • 968

网易博客搬家之不可删除的广告图标

我遇到了这个木马! 现在的木马不一定破坏系统、盗号,就打广告,我的桌面有一个打广告的图标删不了!怎么删都不行! 我室友问我这个问题时,我真不能解决。 http://www.xaw8.com/wb...
  • gogcc
  • gogcc
  • 2013年11月25日 20:36
  • 535

VB.NET 从XML文件中读取内容到JSON

摘要: 注:本文中记录的只是一些早年练手用的代码,用于JSON和XML简单转换,使用的是自己定义的一个“规则”,不保证转换的正确性 一、关于本文 本文承接了上一篇博客的内容。在上篇博客中,...
  • proppig
  • proppig
  • 2016年12月30日 21:24
  • 241

鼠标右键点击文件夹 用Unity5打开 项目 实现

孙广东   2015.9.12       写了这个小小的 reg 注册表 文件,因为我厌倦了必须通过Unity导航到文件夹 来打开它们。  如果文件夹很容易接近,比如在桌面上 就很不方便。     ...
  • u010019717
  • u010019717
  • 2015年09月12日 16:34
  • 2327

c#FileStream文件读写(转)

//C#文件流写文件,默认追加FileMode.Append              string msg = "okffffffffffffffff";             byte[] ...
  • y1535623813
  • y1535623813
  • 2017年08月04日 16:07
  • 156

c#FileStream文件读写(转)

FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类...
  • chengonghao
  • chengonghao
  • 2014年11月03日 10:55
  • 262

c#FileStream文件读写(转)

http://www.cnblogs.com/Fskjb/archive/2010/03/12/1684753.html FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提...
  • mituan1234567
  • mituan1234567
  • 2014年12月22日 12:10
  • 285
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读写注册表(转)
举报原因:
原因补充:

(最多只允许输入30个字)