注册表操作

那100~泪奔[2014/10/16 23:11]

代码通过修改注册表,使程序能够在系统登录时运行。比较了一下不同编码方式下的情况,可以使用差分工具看一下变化。

1. 代码设置的编码为Unicode,注册表中显示的是乱码
// RegEdit.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{

	wchar_t regname[]=L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	HKEY hkResult;
	int ret;

	//TODO 为了方便,进行了强转
	const unsigned char * SetValue=(const unsigned char *)"%java_home%\\door.exe";
	ret=RegOpenKey(HKEY_CURRENT_USER,regname,&hkResult);

	//打开关键字
	ret=RegSetValueEx(hkResult,L"door",0,REG_SZ,SetValue,sizeof(SetValue));

	//设置键值
	if(ret==0){
		printf("success to write run key \n");
		//RegCloseKey(hkResult);
	}
	else{
		printf("fail to write run key \n");
		return 1;
	}

	wchar_t modlepath[256];
	wchar_t syspath[256];
	GetModuleFileName(NULL,modlepath,sizeof(modlepath));
	printf("%s",modlepath);

	//取得程序的名字
	GetSystemDirectory(syspath,256);
	ret=CopyFile(modlepath,(wchar_t *)strcat((char*)syspath,"\\door.exe"),1);

	if(ret){
		printf("%s has been copyed to dir %s \n",modlepath,syspath);
	}
	else{
		printf("%s is exist",modlepath);
	}
	return 0;
}
2. 设置ASCII编码,同时简单修改程序代码。
// RegEdit.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{

	char regname[]="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	HKEY hkResult;
	int ret;

	//TODO 为了方便,进行了强转
	const unsigned char * SetValue=(const unsigned char *)"%systemroot%\\RegEdit.exe";
	ret=RegOpenKey(HKEY_CURRENT_USER,regname,&hkResult);

	//打开关键字
	//新建了一个环境变量systemroot,值设定为C:\Windows\System32
	ret=RegSetValueEx(hkResult,"reg",0,REG_SZ,SetValue,sizeof("%systemroot%\\RegEdit.exe"));

	//设置键值
	if(ret==0){
		printf("success to write run key \n");
		//RegCloseKey(hkResult);
	}
	else{
		printf("fail to write run key \n");
		return 1;
	}

	char modlepath[256];
	char syspath[256];
	GetModuleFileName(NULL,modlepath,sizeof(modlepath));
	printf("%s",modlepath);

	//取得程序的名字
	GetSystemDirectory(syspath,256);
	ret=CopyFile(modlepath,strcat(syspath,"\\RegEdit.exe"),1);

	if(ret){
		printf("%s has been copyed to dir %s \n",modlepath,syspath);
	}
	else{
		printf("%s is exist",modlepath);
	}
	return 0;
}
3.程序运行的效果图

可以看一下注册表中,确实多了程序中的键值。以及Windows/System32目录下的RegEdit.exe文件。程序里有一处写错了,相信大家能发现的。

相关的函数说明:

1.函数原型:
  DWORD GetModuleFileName(
  HMODULE hModule,
  LPTSTR lpFilename,
  DWORD nSize
  );
  函数参数说明:
  hModule HMODULE 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。
  lpFileName LPTSTR 是你存放返回的名字的内存块的指针,是一个输出参数
  nSize DWORD ,装载到缓冲区lpFileName的最大值
  函数返回值:
  如果返回为成功,将在lpFileName的缓冲区当中返回相应模块的路径,如果所为的nSize过小,哪么返回仅按所设置缓冲区大小返回相应字符串内容。
  如果函数失败,返回值将为0,并返回GetLastError异常代码。
  需要的头文件为:
  include Windows.h

2. 函数CopyFile原型

BOOL CopyFile( 

LPCTSTR lpExistingFileName,  // pointer to name of an existing file
LPCTSTR lpNewFileName, 		 // pointer to filename to copy to
BOOL bFailIfExists 			 // flag for operation if file exists
);
其中各参数的意义:
LPCTSTR lpExistingFileName, // 你要拷贝的源文件名
LPCTSTR lpNewFileName, 		// 你要拷贝的目标文件名
BOOL bFailIfExists 			// 如果目标已经存在,不拷贝(True)并返回False,覆盖目标(false) 

//拷贝文件c:\log.txt到d:\log.txt,如果D:\log.txt已经存在,就覆盖
CopyFile("c:\\log.txt","d:\\log.txt",false);  
4. 注册表的读操作
// RegRead2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	long lRet;
	HKEY hKey;
	TCHAR tchData[64];
	DWORD dwSize;

	//打开注册表
	lRet=RegOpenKeyEx(
		HKEY_LOCAL_MACHINE,
		"Hardware\\Description\\System\\CentralProcessor\\0",
		0,
		KEY_QUERY_VALUE,
		&hKey);

	if(lRet==ERROR_SUCCESS){
		dwSize=sizeof(tchData);
		lRet=RegQueryValueEx(
			hKey,
			"ProcessorNameString",
			NULL,
			NULL,
			(LPBYTE)tchData,
			&dwSize);
		if(lRet==ERROR_SUCCESS){
			printf("CPU INFO :");
			printf("\n%s",tchData);
		}
		else{
			printf("\n CPU INFO UNKNOWN \n");
		}
	}
	else{
		printf("\n KEY OPEN FAILED \n");
	}
	return 0;
}

程序的运行效果图

5. 注册表的写操作
// RegWriter.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	//根键、子键名称和到子键的句柄
	HKEY hRoot=HKEY_LOCAL_MACHINE;
	char *szSubKey="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	HKEY hKey;
	DWORD dwDisposition=REG_OPENED_EXISTING_KEY;

	//如果不存在就创建
	LONG lRet=RegCreateKeyEx(
		hRoot,
		szSubKey,
		0,
		NULL,
		REG_OPTION_NON_VOLATILE,
		KEY_ALL_ACCESS,
		NULL,
		&hKey,
		&dwDisposition);
	if(lRet !=ERROR_SUCCESS){
		return -1;
	}
	//得到当前执行文件的文件名(包含路径)
	char szModule[MAX_PATH];
	GetModuleFileName(NULL,szModule,MAX_PATH);
	//创建一个新的键值,设置键值数据为文件名
	lRet=RegSetValueEx(
		hKey,
		"SelfDemo",
		0,
		REG_SZ,
		(BYTE *)szModule,
		strlen(szModule));
	if(lRet==ERROR_SUCCESS){
		printf("self run success \n");
	}
	RegCloseKey(hKey);
	return 0;
}

程序运行的结果:

3.打开一个注册表

LONG WINAPI RegOpenKeyEx(
  _In_      HKEY hKey,
  _In_opt_  LPCTSTR lpSubKey,
  _In_      DWORD ulOptions,
  _In_      REGSAM samDesired,
  _Out_     PHKEY phkResult
);

hKey:可以是以下选项之一
	HKEY_CLASSES_ROOT
	HKEY_CURRENT_CONFIG
	HKEY_CURRENT_USER
	HKEY_LOCAL_MACHINE
	HKEY_USERS

lpSubKey:打开子键的名字,该名字不区分大小写。同时可以为NULL
时间: 2024-07-28 21:26:52

注册表操作的相关文章

【读书笔记】C#高级编程 第二十四章 文件和注册表操作

(一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByRefObject--这是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据. FileSystemInfo--这是表示任何文件系统对象的基类. FileInfo和File--这些类表示文件系统上的文件. DirectoryInfo和Directory--这些类表示文件系统上的文件夹.

c# 注册表操作,创建,删除,修改,判断节点是否存在

用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和 删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1:要操作注册表,我们必须要引入必要的命名空间: C#代码    using Microsoft.Win32; 在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~ 2:命名空间里面提供了一个类:RegistryKey 利用它我们可以定位到注册表最开头的分支: ClassesRoot,CurrentUser,Use

[C#]注册表操作

原文:[C#]注册表操作 概念 在介绍注册表操作前,有必要了解注册表的一些基本常识. 在此简要介绍一下. 注册表 注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.注册表组织层次结构的格式,基于存储在它的元素的逻辑顺序. 当将信息存储在注册表中,选择要存储的信息类型所基于的适当位置. 在Windows 3.x操作系统中,注册表是一个极小文件,其文件名为Reg.dat,里面只存放了某些文件类型

C#简单注册表操作实例

1.简介操作 //设置注册值 private void Button_Click(object sender, RoutedEventArgs e) { //路径及间隔符号要正确 //1.如果指定路径不存在,则创建 //2.如果指定键存在,则覆盖值 string path = "HKEY_CURRENT_USER\\myRegOne"; Registry.SetValue(path, "Expend", "hellow world!"); Mes

C#注册表操作类(完整版)

下面贴出自己用C#写的注册表操作类,欢迎大家拍砖! 1.注册表基项静态域 1 /// <summary> 2 /// 注册表基项静态域 3 /// 4 /// 主要包括: 5 /// 1.Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 6 /// 2.Registry.CurrentUser 对应于HKEY_CURRENT_USER主键 7 /// 3.Registry.LocalMachine 对应于 HKEY_LOCAL_MACHINE主键 8 //

Ch25 文件和注册表操作(2)-- 读写文件

老早之前就有一个想法,写一个小程序,可以读取文档,可以查找替换关键字,其实也是很简单的,正好最近看到文件系统这章,今天下午没事也就做了一个,这里总结一下: 1.用StreamReader读取文本文件,编码用Encoding.Default. StreamReader sr = new StreamReader(filePath,Encoding.Default); rtbContent.Text = sr.ReadToEnd(); sr.Close(); //释放锁定资源 2.统计要查找的字符,

内核模式下的注册表操作

注册表操作 注册表里的几个概念: 1.       创建关闭注册表项 NTSTATUS    ZwCreateKey(     OUT PHANDLE  KeyHandle,     IN ACCESS_MASK  DesiredAccess, //访问权限,一般为KEY_ALL_ACCLESS     IN POBJECT_ATTRIBUTES  ObjectAttributes,     IN ULONG  TitleIndex, //一般为NULL     IN PUNICODE_STRI

delphi 注册表操作(读取、添加、删除、修改)完全手册

DELPHI VS PASCAL(87)  32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create: 2.释放TRegistry对象.对注册表操作结束后,应释放TRegistry对象所占内存:ARegistry.Destroy. 二.指定要操作的键 操作注册表时,首先应指定操作的主键:先给属性R

Windows内核函数(3) - 内核模式下的注册表操作

Windows内核函数(3) - 内核模式下的注册表操作 2010-12-13 13:37:16|  分类: 驱动编程 |  标签:status  hkey  ulsize  注册  kdprint  |举报|字号 订阅 注册表里的几个概念: 1.       创建关闭注册表项 NTSTATUS   ZwCreateKey(    OUT PHANDLE  KeyHandle,    IN ACCESS_MASK  DesiredAccess, //访问权限,一般为KEY_ALL_ACCLESS

C#注册表操作类--完整优化版

using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; namespace Register { public class RegisterHelper { /// <summary> /// 注册表基项静态域 /// /// 主要包括: ///1.Registry.ClassesRoot 对应于 HKEY_CLASSES_ROOT 主键 ///2.Registry.Cu