这个函数是一个Windows程序中的功能,用于让用户选择是否将程序设置为开机自动启动。下面我将详细解释这个函数的各个部分:
功能概述
-
显示警告信息对话框,让用户选择是否将程序设置为开机启动
-
如果用户选择"是",则创建符号链接并将程序添加到注册表启动项
-
如果用户选择"否",程序只运行一次
-
如果用户选择"取消",直接退出程序
详细解析
1. 对话框显示
CString strSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
CString strInfo = _T("该程序只允许用于合法的用途!\n");
strInfo += ("运行该程序,将使得这台机器处于被监控状态!\n");
strInfo += ("按下"是"按钮,该程序将被副指导你的机器上,并随系统启动而自动启动!\n");
strInfo += ("按下"否"按钮,该程序只运行一次,不会再系统内留下任何东西!\n");
int ret = MessageBox(NULL, strInfo, _T("警告"), MB_YESNOCANCEL | MB_ICONWARNING | MB_TOPMOST);
-
设置注册表路径到
Run
键(开机启动项) -
构建警告信息字符串
-
显示一个有"是/否/取消"按钮的警告对话框
2. 用户选择"是"的处理
if (ret == IDYES) {
// 获取当前目录和系统目录
char sPath[MAX_PATH] = "";
char sSys[MAX_PATH] = "";
std::string strExe = "\\RemoteControl.exe ";
GetCurrentDirectoryA(MAX_PATH, sPath);
GetSystemDirectoryA(sSys, sizeof(sSys));
// 创建符号链接命令
std::string strCmd = "mklink"+ std::string(sSys)+ strExe + std::string(sPath) + strExe;
ret = system(strCmd.c_str());
TRACE("ret=%d \r\n", ret);
// 打开注册表键
HKEY hKey = NULL;
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strSubKey, 0, KEY_WRITE | KEY_WOW64_64KEY ,&hKey);
if (ret != ERROR_SUCCESS) {
// 错误处理
}
// 设置注册表值
CString strPath = CString(_T("%SystemRoot%\\system32\\RemoteControl.exe"));
RegSetValueEx(hKey, _T("RemoteControl"), 0, REG_SZ, (BYTE*)(LPCTSTR)strPath, strPath.GetLength() * sizeof(TCHAR));
if (ret != ERROR_SUCCESS) {
// 错误处理
}
RegCloseKey(hKey);
}
-
获取当前程序目录和系统目录
-
尝试使用
mklink
命令在系统目录创建指向程序的符号链接 -
打开注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
-
添加程序路径到注册表实现开机启动
3. 其他选项处理
else if(ret==IDCANCEL){
exit(0); // 用户选择取消,直接退出程序
}
// 选择"否"则不做任何操作,直接返回
安全提示
这段代码实际上是在实现一个类似监控软件的自启动功能,使用时需要注意:
-
必须获得用户明确同意
-
必须有合法的使用目的
-
在大多数情况下,这种功能可能被视为恶意软件行为
这个函数的设计目的是让用户选择是否让程序在开机时自动运行,但实现方式较为隐蔽,可能会引起安全软件的警觉。