Сейчас на форуме: jinoweb (+6 невидимых)

 eXeL@B —› Программирование —› Чтение х64 ветки реестра из х86 процесса
Посл.ответ Сообщение


Ранг: 71.5 (постоянный), 95thx
Активность: 0.10.38
Статус: Участник

Создано: 27 декабря 2018 05:46 · Поправил: BlackCode
· Личное сообщение · #1

Всем привет

Собственно основной вопрос, это как прочитать из ветки х64 разрядного реестра необходимое значение, из х86 процесса.
Перед тем как написать сюда, естественно перекопал гугл.
Четкого рабочего метода (кода) не нашел. Куча всяких "рекомендаций" без конкретики. Может правда не там искал.

В общем задача состоит в том, чтобы прочитать из ветки деинсталлятора значение "InstallLocation", т.е. путь куда установлена программа.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Proc_is1]
"InstallLocation"="C:\Program Files\Proc\SuperProc"

К сожалению целевая программа больше не создает никаких ключей в реестре,
из которых можно было бы получить путь ее установки на жестком диске.
Такой код естественно не работает, ключ-то открывает, но RegQueryValueEx выдает в eax == 2, типа не находит значение.
Code:
  1. invoke RegCreateKeyEx,HKEY_LOCAL_MACHINE,chr$("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Proc_is1"),0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,addr hKey,NULL
  2. .if eax
  3. return FALSE
  4. .endif
  5. mov pType,REG_SZ
  6. mov cbData,MAX_PATH
  7. invoke RegQueryValueEx,hKey,chr$("InstallLocation"),NULL,addr pType,lpPath,addr cbData
  8. .if eax != ERROR_SUCCESS
  9. invoke RegCloseKey,hKey
  10. return FALSE
  11. .endif
  12. invoke RegCloseKey,hKey

С флагами, типа KEY_WOW64_32KEY и KEY_WOW64_64KEY поигрался, но безрезультатно.
Большая просьба, если кто-то когда-то сталкивался с аналогичной задачей поделиться опытом, а лучше рабочим кодом
Заранее премного благодарен за участие.
Спасибо, и с наступающим Новым годом




Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

Создано: 27 декабря 2018 06:49
· Личное сообщение · #2

у меня на дельфи 7 такой код воркает:

Code:
  1. Const
  2.   KEY_WOW64_64KEY = $0100;
  3.   KEY_WOW64_32KEY = $0200;
  4. //
  5.   reg := tregistry.create(KEY_READ or KEY_WOW64_64KEY);
  6.   try
  7.     reg.RootKey := HKEY_LOCAL_MACHINE;
  8.     reg.OpenKey('SOFTWARE\Microsoft\Cryptography',false);
  9.     RS := reg.ReadString('MachineGuid');
  10.   finally
  11.     reg.free;
  12.   end;


-----
Array[Login..Logout] of Life


| Сообщение посчитали полезным: BlackCode, TerminatorX


Ранг: 71.5 (постоянный), 95thx
Активность: 0.10.38
Статус: Участник

Создано: 27 декабря 2018 07:31
· Личное сообщение · #3

Kindly пишет:
у меня на дельфи 7 такой код воркает:

Спасибо большое
У меня тоже заработало
Code:
  1. invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,chr$("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Proc_is1"),0,KEY_READ+KEY_WOW64_64KEY,addr hKey
  2. .if eax
  3. return FALSE
  4. .endif
  5. mov pType,REG_SZ
  6. mov cbData,MAX_PATH
  7. invoke RegQueryValueEx,hKey,chr$("InstallLocation"),NULL,addr pType,lpPath,addr cbData
  8. .if eax != ERROR_SUCCESS
  9. invoke RegCloseKey,hKey
  10. return FALSE
  11. .endif
  12. invoke RegCloseKey,hKey
  13. return TRUE

У меня оказывается в иклюде масма было определено так
KEY_WOW64_64KEY = 100
Т.е. десятеричное число, по этому и не работало


 eXeL@B —› Программирование —› Чтение х64 ветки реестра из х86 процесса
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати