我在尝试从注册表中读取MachineGUID时出现错误2,下面是我当前使用的代码:
LSTATUS l = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ | KEY_WOW64_64KEY, &hResult);
CString csError;
if (l == ERROR_SUCCESS)
{
l = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY | RRF_SUBKEY_WOW6464KEY, NULL, szGUID, &lSize);
if (l != ERROR_SUCCESS)
{
l = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ | KEY_WOW64_32KEY, &hResult);
if (l == ERROR_SUCCESS)
{
l = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY | RRF_SUBKEY_WOW6432KEY, NULL, szGUID, &lSize);
if (l != ERROR_SUCCESS)
{
l = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ, &hResult);
if (l == ERROR_SUCCESS)
{
l = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY, NULL, szGUID, &lSize);
if (l != ERROR_SUCCESS)
{
csError.Format("Error %lu reading machine ID.", l);
MessageBox(csError);
}
}
else
{
csError.Format("Error %lu opening machine ID with KEY_READ.", l);
MessageBox(csError);
}
}
}
else
{
csError.Format("Error %lu opening machine ID with KEY_READ | KEY_WOW64_32KEY.", l);
MessageBox(csError);
}
}
}
else
{
csError.Format("Error %lu opening machine ID with KEY_READ | KEY_WOW64_64KEY.", l);
MessageBox(csError);
}
所有的RegOpenKeyEx调用都是为了调试目的而放入的;是的,我知道这个键应该关闭。我只是想看看开放访问是否会有问题,而实际上没有问题。代码一直到最里面的错误消息,即read错误消息。
该代码是使用VS 2017构建的32位代码。这在windows10上运行得很好,有人能告诉我问题出在哪里吗?
这段代码应该会产生问题。它使用MBCS而不是unicode。
#include <windows.h>
#include <winreg.h>
#include <stdio.h>
int main()
{
char szGUID[37];
memset(szGUID, 0, 37);
DWORD lSize = 37;
ULONG ulResult = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY | RRF_SUBKEY_WOW6464KEY, NULL, szGUID, &lSize);
if (ulResult != ERROR_SUCCESS)
{
lSize = 37;
ulResult = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY | RRF_SUBKEY_WOW6432KEY, NULL, szGUID, &lSize);
if (ulResult != ERROR_SUCCESS)
{
lSize = 37;
ulResult = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY, NULL, szGUID, &lSize);
if (ulResult != ERROR_SUCCESS)
{
printf("Error %lu opening SOFTWARE\\Microsoft\\Cryptography\\MachineGUID.\n", ulResult);
}
else
printf("Key SOFTWARE\\Microsoft\\Cryptography\\MachineGUID value %s\n", szGUID);
}
else
printf("Key SOFTWARE\\Microsoft\\Cryptography\\MachineGUID (RRF_SUBKEY_WOW6432KEY) value %s\n", szGUID);
}
else
printf("Key SOFTWARE\\Microsoft\\Cryptography\\MachineGUID (RRF_SUBKEY_WOW6464KEY) value %s\n", szGUID);
return 0;
}
发布于 2018-11-02 16:46:07
在Windows10中引入了RRF_SUBKEY_WOW6432KEY
标志。在以前的Windows版本中忽略了该标志。因此,当你在Windows7和Windows8上使用RegGetValue
时,你实际上是在读取没有MachineGUID
值的SOFTWARE\\Wow6432Node\Microsoft\\Cryptography
密钥。
您可以做的是使用RegOpenKeyEx
和KEY_WOW64_64KEY
标志显式打开"SOFTWARE\\Microsoft\\Cryptography"
密钥,然后在该密钥上使用RegGetValue
。
下面的示例程序演示了这一点。我已经在一个真正的32位版本上进行了测试,但它应该可以按照this SO question的要求工作。
#include <windows.h>
#include <winreg.h>
#include <stdio.h>
int main()
{
char szGUID[37];
memset(szGUID, 0, 37);
DWORD lSize = 37;
ULONG ulResult;
HKEY hkey;
ulResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_WOW64_64KEY + KEY_READ, &hkey);
if (ulResult == 0)
{
ulResult = RegGetValue(hkey, "", "MachineGUID", RRF_RT_ANY, NULL, szGUID, &lSize);
if (ulResult == 0)
{
printf("Key SOFTWARE\\Microsoft\\Cryptography\\MachineGUID value %s\n", szGUID);
}
else
{
printf("Error %lu during RegGetValue of MachineGUID", ulResult);
}
RegCloseKey(hkey);
}
else
{
printf("Error %lu opening HKEY_LOCAL_MACHINE, SOFTWARE\\Microsoft\\Cryptography\\MachineGUID.\n", ulResult);
}
}
https://stackoverflow.com/questions/53100174
复制相似问题