呃……突然发现要讲清楚如何修改注册表还不是那么容易的事,上一节中介绍了修改注册表所需要的三个API函数,这一节就接着上一节的思路,给出一个例子好了。
我们将在注册表项中添加自动运行单独由一个函数来完成,将这个函数的原型定义为如下:int autorun_register(const char *exe_filename) 。其中参数中的字符串为需要设置为自动运行的程序的完整路径名。成功返回0,否则返回-1。
在函数体中,我们首先需要做的是定义一些基本变量。
int return_value=0;//记录返回值
HKEY hroot = HKEY_LOCAL_MACHINE,hkey;//前者为根键名,后者用来存储打开的注册表项句柄
const char *subkey = "Software//Microsoft//Windows//CurrentVersion//Run";//需要修改的子健
DWORD dwDisposition;//打开注册表项时用来存放是打开还是创建的信息
long result;//记录调用API的返回值
在定义完这个基本变量之后,我们就可以按照前面所介绍的思路,打开注册表项、修改键值、关闭句柄来完成这个任务了。
打开:
result=RegCreateKeyEx(
hroot, // 根键句柄
subkey, // 子健名
0, // 保留字
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkey, // 存储句柄
&dwDisposition // 存储打开还是创建信息
);
通过调用,若成功,result==ERROR_SUCCESS,打开的句柄将被保存在hkey中。
修改:
if(result==ERROR_SUCCESS) //用于判断前面打开是否成功
{
result=RegSetValueEx(
hkey, //前面打开的句柄
"病毒", //子健名
0, //保留字
REG_SZ, //键值类型
(CONST BYTE *)exe_filename, //键值缓冲区指针
(DWORD)strlen(exe_filename) //缓冲区大小
);
关闭:
if(result!=ERROR_SUCCESS)return_value=-1;//接前面的if语句
RegCloseKey(hkey); //关闭句柄
}
else return_value=-1;
好了,基本流程我想应该已经清楚了吧?现在我把autorun_register这个函数完整的贴出来,大家对照着看,应该很快就会了吧?
int autorun_register(const char *exe_filename)
{
//修改注册表,开机启动
int return_value=0;
HKEY hroot = HKEY_LOCAL_MACHINE,hkey;
const char *subkey = "Software//Microsoft//Windows//CurrentVersion//Run";
DWORD dwDisposition;
long result=RegCreateKeyEx(
hroot,
subkey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkey,
&dwDisposition
);
if(result==ERROR_SUCCESS)
{
result=RegSetValueEx(
hkey,
"病毒",
0,
REG_SZ,
(CONST BYTE *)exe_filename,
(DWORD)strlen(exe_filename)
);
if(result!=ERROR_SUCCESS)return_value=-1;
RegCloseKey(hkey);
}
else return_value=-1;
if(!return_value)printf("开机启动注册成功!/n");
else printf("开机启动注册失败.../n");
return return_value;
}