如何解决编辑注册表值会破坏整个系统
我在制作一个需要编辑一些注册表值的程序时遇到了一些麻烦,而不是让我的整个电脑变砖。所以下面是在错误之前运行的代码也在下面。我已经确认手动编辑注册表值是有效的,但由于某种原因,这会使我的整个电脑变砖(我正在使用虚拟机进行演示)
void startBCPE(DWORD SSIP,DWORD ST,DWORD SP,char CL[20]) {
//Sets registery values for BCPE
HKEY key;
RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SYstem\\Setup",KEY_ALL_ACCESS,&key);
if (RegSetValueExA(key,"SystemSetupInProgress",REG_DWORD,(LPBYTE)&SSIP,sizeof((LPBYTE)&SSIP)) != ERROR_SUCCESS ||
RegSetValueExA(key,"SetupType",(LPBYTE)&ST,sizeof((LPBYTE)&ST)) != ERROR_SUCCESS ||
RegSetValueExA(key,sizeof((LPBYTE)&ST) != ERROR_SUCCESS ||
RegSetValueExA(key,"SetupPhase",(LPBYTE)&SP,sizeof((LPBYTE)&SP)) != ERROR_SUCCESS ||
RegSetValueExA(key,"CmdLine",REG_SZ,(LPBYTE)&CL,sizeof(CL)) != ERROR_SUCCESS)) {
printf("error"); //runs if any above instruction results in an error,THIS CODE DOES NOT RUN
}
RegCloseKey(key);
return;
}
因此在代码运行后,您将无法以管理员身份运行任何内容,并且如果您注销或重新启动,计算机将不会登录。
编辑:你好,我回来了一些新信息,它写入的注册表值似乎已损坏或其他原因,因为 CMDline 是“8}-”
解决方法
这是错误的:
RegSetValueExA(key,"CmdLine",REG_SZ,(LPBYTE)&CL,sizeof(CL));
sizeof(CL)
不是字符串的长度,而是平台上指针的大小(在您的情况下为 4 或 8)。
也不是 sizeof(CL)
声明可能暗示的 char CL[20]
20。在这种情况下,char CL[20]
严格等同于这个 char *CL
。
还有(LPBYTE)&CL
是错误的,你不想要指针的地址,你想要数据的地址,你需要(LPBYTE)CL
(没有&
)。 CL
也已经是指针做你的数据了。
因此,您基本上是在注册表中 Cmdline
键的 SYSTEM\\Setup
值中写入了一些垃圾,这很可能会弄乱 Windows。
所以你想要这个:
RegSetValueExA(key,(LPBYTE)CL,strlen(CL) + 1);
+ 1
用于考虑字符串空终止符。
仔细阅读 RegSetValueExA
documentation 的 lpData
和 cbData
部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。