📜 ⬆️ ⬇️

About some features of writing distribution packages on NSIS for x64 systems

I came across unexpected (for me) NSIS installer behavior for 64 bit systems.

It is about accessing the Windows registry. For a long time I could not understand why I can get some values ​​from the registry with the standard NSIS tools, and some others I can not.

Answer: in 64-bit systems, the keys are in several different sections - 32 and 64 bits. From the reged for the user, these features are not visible - they are transparent. And, accordingly, to access these keys from NSIS, use the modifiers "SetRegView 64" or "SetRegView 32".

Example:
SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  1. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  2. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  3. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  4. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  5. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  6. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  7. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  8. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  9. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
  10. SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .
SetRegView 64 ReadRegDWORD $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\PowerShell\1" "Install" ${DbgMessageBox} "PowerShell Installed: $0" StrCmp $0 "" psNotInstalled psInstalled psNotInstalled: ${DbgMessageBox} "psNotInstalled" Goto PSAbort psInstalled: ${DbgMessageBox} "psInstalled" Goto CONTINUE3 * This source code was highlighted with Source Code Highlighter .

')
P.S. I wrote it because I spent quite a lot of time searching for a solution to this problem. Use!
P.P.S. $ {DbgMessageBox} is an internal function for displaying values ​​during debugging.

Source: https://habr.com/ru/post/90412/


All Articles