首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用WindowsAPI/C将错误写入Windows 10注册表(奇怪情况)

用WindowsAPI/C将错误写入Windows 10注册表(奇怪情况)
EN

Stack Overflow用户
提问于 2021-12-25 22:21:06
回答 1查看 127关注 0票数 0

我试图写到我的Windows 10注册表,包括一个程序在启动。

目前,我已经编写了以下代码,这些代码并不烦人:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winnt.h>
#include <winreg.h>
    
int main()
{
    const TCHAR* path = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
    LPDWORD holdResult;
    PHKEY hKey;
    int lResult;
    //lResult = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &hKey);
    lResult = RegCreateKeyExA(HKEY_CURRENT_USER, "myprogram", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &holdResult);
    
    if (lResult != ERROR_SUCCESS)
    {
        if (lResult == ERROR_FILE_NOT_FOUND) {
            printf("Key not found.\n");
            return TRUE;
        }
        else {
            printf("Error opening key.\n");
            return FALSE;
        }
    }
    printf("Key already existed or not: %p\n", holdResult);
    
    char* szPath = "C:\\Users\\Myname\\Documents\\coolprogram.exe";
    lResult = RegSetValueExA(hKey, "program", 0, REG_SZ,(LPBYTE)szPath, sizeof(wchar_t)*(wcslen(szPath)+1));
    printf("Key successfully set or not: %d\n", lResult);
    RegCloseKey(hKey);
    return 0;
}

奇怪的是,虽然代码没有向注册表写入任何东西,但我没有收到错误消息,程序执行成功!

这就是当我运行代码时打印到终端的内容:

代码语言:javascript
复制
Key already existed or not: 0000000000000002
Key successfully set or not: 0

因此,密钥已经被创建,并且已经成功地设置好了,而没有发生,在我的注册表中什么也没有。

我认为这是一个权限问题,因为由于某些原因,我无法手动更改注册表权限,即使在将自己设置为所有者之后,我也不可能允许自己使用“完全控制”。

但我预期会出现某种错误,例如“访问被拒绝:权限不足”,但我正在取得成功。真奇怪。

EN

回答 1

Stack Overflow用户

发布于 2021-12-25 22:41:39

您将错误的密钥路径传递到RegCreateKeyEx()。您正在尝试将您的program值写入HKCU\myprogram而不是HKCU\SOFTWARE\Microsoft\...\Run

您还将无效的指针传递到RegCreateKeyEx()。它的最后2个参数期望指向HKEYDWORD变量的指针,但是您将传入指向HKEY*DWORD*变量的指针。

您还将一个不正确的参数传递给RegSetValueExA()。您给它一个ANSI字符串(好,因为它是ANSI函数),但是传入一个Unicode字符串长度,即实际ANSI字符串字节大小的2倍(bad)。

实际上,您的代码甚至不应该如图所示进行编译。

试一试:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winnt.h>
#include <winreg.h>

int main()
{
    const char* szKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
    const char* szPath = "C:\\Users\\Myname\\Documents\\coolprogram.exe";
    DWORD dwDisposition;
    HKEY hKey;
    LSTATUS lResult;

    //lResult = RegOpenKeyExA(HKEY_CURRENT_USER, szKey, 0, KEY_QUERY_VALUE, &hKey);
    lResult = RegCreateKeyExA(HKEY_CURRENT_USER, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, &dwDisposition);

    if (lResult != ERROR_SUCCESS)
    {
        printf("Error creating key: %ld\n", lResult);
        return 0;
    }

    printf("Key already existed or not: %lu\n", dwDisposition);

    lResult = RegSetValueExA(hKey, "program", 0, REG_SZ, (LPBYTE)szPath, sizeof(TCHAR)*(strlen(szPath)+1));
    printf("Key successfully set or not: %ld\n", lResult);
    RegCloseKey(hKey);

    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70483093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档