Ошибка 2 при чтении ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ \ Microsoft \ Cryptography \ MachineGUID на Win 8, 8.1 и 7 - PullRequest
0 голосов
/ 01 ноября 2018

Я получаю ошибку 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;
}

1 Ответ

0 голосов
/ 02 ноября 2018

Флаг RRF_SUBKEY_WOW6432KEY был введен в Windows 10. Он игнорируется в предыдущих версиях Windows. Поэтому, когда вы используете RegGetValue, используя этот флаг в Windows 7 и 8, вы фактически читаете ключ SOFTWARE\\Wow6432Node\Microsoft\\Cryptography, который не имеет значения MachineGUID.

Что вы можете сделать, это открыть ключ "SOFTWARE\\Microsoft\\Cryptography" явно с помощью RegOpenKeyEx и флаг KEY_WOW64_64KEY, а затем использовать RegGetValue для этого ключа.

Пример программы ниже демонстрирует это. Я не тестировал его на истинной 32-битной версии, но он должен работать в соответствии с этим SO вопросом .

#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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...