繁体   English   中英

KEY_WOW64_32KEY在32位和64位编译之间给出不同的结果

[英]KEY_WOW64_32KEY giving different results between 32 and 64 bit compilations

您好,我正在尝试使用32位和64位编译代码向注册表读取和写入一个值。 每个编译应在同一位置读取/写入。 我尝试使用KEY_WOW64_32KEY无济于事。

当我使用32位目标编译以下代码时,它将写入和读取值。 当我使用64位目标进行编译时,它无法找到或写入密钥。

编辑:以下代码在Windows XP 64位上的32和64位版本上正常工作。 Windows 7 64位出现问题。

任何帮助,罗布。

#include <windows.h>
#include <stdio.h>

#define ISVALIDHANDLE(x) (x != NULL && x != INVALID_HANDLE_VALUE)
#define KEY_ACCESS_DEF        (KEY_ALL_ACCESS | KEY_READ | KEY_WRITE | KEY_WOW64_32KEY)
#define KEYPATH "SOFTWARE\\X\\Y"
#define KEYNAME "Z"

static bool
doInstallKey(HKEY key, const char *keypath, const char *keyname, const char *keyvalue)
{
    HKEY                 rootKey, myKey;
    bool                 r = false;

    RegOpenKeyEx(key, NULL, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &rootKey);

    if( ISVALIDHANDLE(rootKey) )
    {
        HRESULT                res;
        unsigned long        createType;

        res = RegCreateKeyEx( rootKey, keypath, 0, NULL,
                    REG_OPTION_NON_VOLATILE,
                    KEY_ACCESS_DEF, NULL, &myKey, &createType );

        if( ISVALIDHANDLE(myKey) )
        {
            RegSetValueEx(myKey, keyname, 0,
                REG_SZ, (unsigned char *)keyvalue, strlen(keyvalue)+1);


            RegCloseKey(myKey);

            r  = true;
        }
        else
        {
            // If we cant create it, maybe it already exits,
            // just change the value.

            res = RegOpenKeyEx(rootKey, keypath, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &myKey);

            if( ISVALIDHANDLE(myKey) )
            {
                RegSetValueEx(myKey, keyname, 0,
                    REG_SZ, (unsigned char *)keyvalue, strlen(keyvalue)+1);

                RegCloseKey(myKey);

                r  = true;
            }
            else
            {
                // error
            }
        }

        RegCloseKey(rootKey);
    }

    return r;
}

static int
doGetInstallKey(HKEY key, const char *keypath, const char *keyname,
            char *keyvalue, unsigned long keylen)
{
    HKEY     rootKey, myKey;
    int         valid = 0;

    keyvalue[0] = 0;

    RegOpenKeyEx(key, NULL, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &rootKey);

    if( ISVALIDHANDLE(rootKey) )
    {
        RegOpenKeyEx(key, keypath, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &myKey);

        if( ISVALIDHANDLE(myKey) )
        {
            unsigned long        type = 0;
            HRESULT                res;

            res = RegQueryValueEx(myKey, keyname, NULL,
                        &type, (unsigned char *)keyvalue, &keylen);

            if (res == ERROR_SUCCESS)
                valid = keylen;

            RegCloseKey(myKey);
        }

        RegCloseKey(rootKey);
    }

    return valid;
}


int
main(int argc, char *argv[])
{
    char    buf[1024];
    int        len = 1023;

    // read key
    doGetInstallKey(HKEY_LOCAL_MACHINE, KEYPATH, KEYNAME, buf, len);
    fprintf(stdout, "BEFORE: %s\n", buf);

    // write key
    doInstallKey(HKEY_LOCAL_MACHINE, KEYPATH, KEYNAME, "def64");

    // read key
    doGetInstallKey(HKEY_LOCAL_MACHINE, KEYPATH, KEYNAME, buf, len);
    fprintf(stdout, "AFTER: %s\n", buf);

    return 0;
}

在Windows 7上进行测试时,您是否以管理员身份运行? 您可能正在运行注册表虚拟化

尝试更换

#define KEY_ACCESS_DEF        (KEY_ALL_ACCESS | KEY_READ | KEY_WRITE | KEY_WOW64_32KEY)

对于

#define KEY_ACCESS_DEF        (KEY_READ | KEY_WRITE | KEY_WOW64_32KEY)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM