![](/img/trans.png)
[英]Is “0xffffffff00000000” an indication of a mix-up between 32-bit and 64-bit compilations?
[英]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.