Проблемы чтения из Windows Реестра - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь прочитать значения из реестра Windows. Я читаю одно значение из HKLM \ System и одно значение из HKLM \ Software . Я могу легко прочитать значение из системы ... но я не могу прочитать значение из программного обеспечения.

Фрагмент из редактора реестра:

image

Фрагмент из ReadReg ():

int ReadReg(LPCTSTR subkey, LPCTSTR name, DWORD type)
{
  HKEY key;
  TCHAR value[255];
  DWORD valuelen = 255;

  LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_READ, &key);
  cout << "RegOpenKeyEx Req is: " << subkey << endl;
  cout << "RegOpenKeyEx result is: " << PrintErrorCode(result) << endl;

  result = RegQueryValueEx(key, name, NULL, &type, (LPBYTE)&value, &valuelen);
  cout << "RegQueryValueEx Req is: " << name << endl;
  cout << "RegQueryValueEx result is: " << PrintErrorCode(result) << "\n" << endl;
  RegCloseKey(key);

  return 0;  
}

Фрагмент из Inject ():

int Inject()
{
  ReadReg("Software\\Microsoft\\Windows NT\\CurrentVersion\\Svchost", "demo", REG_MULTI_SZ);
  ReadReg("System\\CurrentControlSet\\services\\SvcHostDemo\\Parameters", "ServiceDll", REG_EXPAND_SZ);

  return 0;
}

Отрывок от стандартного выхода:

image

Большой вопрос ... почему я не могу посмотреть на значение из "demo"?

1 Ответ

1 голос
/ 14 апреля 2020

Вам необходимо добавить флаг KEY_WOW64_64KEY при вызове RegOpenKeyEx(). И вам следует изменить KEY_READ на KEY_QUERY_VALUE, поскольку вы просто читаете значение и не нуждаетесь в других правах, предоставляемых KEY_READ.

Кроме того, последний параметр RegQueryValueEx() должен быть выражен в байтах, а не в TCHAR s.

#ifndef KEY_WOW64_64KEY
#define KEY_WOW64_64KEY 0x0100
#endif

int ReadReg(LPCTSTR subkey, LPCTSTR name, DWORD type)
{
  HKEY key;
  TCHAR value[255];
  DWORD valuelen = sizeof(value);

  LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &key);
  cout << "RegOpenKeyEx Req is: " << subkey << endl;
  cout << "RegOpenKeyEx result is: " << PrintErrorCode(result) << endl;

  result = RegQueryValueEx(key, name, NULL, &type, (LPBYTE)&value, &valuelen);
  cout << "RegQueryValueEx Req is: " << name << endl;
  cout << "RegQueryValueEx result is: " << PrintErrorCode(result) << "\n" << endl;
  RegCloseKey(key);

  return 0;  
}
...