Я получаю ошибку 2, пытаясь прочитать MachineGUID из реестра, вот код, который я сейчас использую:
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 были введены для целей отладки; да, я знаю, ключ должен быть закрыт. Я просто хотел посмотреть, будет ли проблема с открытым доступом, но ее нет. Код полностью опускается до самого внутреннего сообщения об ошибке, сообщения об ошибке чтения.
Код был построен с использованием VS 2017 в качестве 32-битного кода. Это прекрасно работает на Windows 10. Может кто-нибудь сказать мне, в чем проблема?
Этот код должен создать проблему. Он использует 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;
}