Issue with automated installation of Gpg4win 5.0.1

Hello,

I am trying to set up an automated installation for Gpg4win version 5.0.1. However, it appears that the installer is ignoring the .ini configuration file passed via the /C parameter and is simply installing with the default options instead.

While the silent parameter /S works as expected, the custom configuration does not seem to be applied.

I have a couple of questions regarding this:

  1. Has the parameter or the required structure of the .ini file changed with the release of version 5.x?

  2. As far as I can tell, the official documentation for automated installations currently only covers up to version 4.x. Is there updated documentation available for the new version?

Any help or guidance would be greatly appreciated.

Thanks & Ciao, Alfred

Okay, it is broken, here is the task ⚓ T7462 gpg4win CLI installation ignores .ini configuration .

A community fix is appreciated. Coordinator via the issue or gnupg-devel@. :slight_smile:
(Info from the German variant of this discussion.)

Still broken in 5.1.1 (I also checked 5.1.0). I tracked it down to the
return path of config_fetch_bool, not the ini parsing itself.

Setup: gpg4win-5.1.1.exe /S /C=C:\temp\gpg4win.ini with inst_gpgol,
inst_gpgoljs, inst_okular = false and inst_desktop = false. Result:
GpgOL, GpgOL/Web, Okular and the desktop shortcut are installed anyway.

What happens:

  • config_init() reads the ini correctly. I compiled that function from
    the 5.1.0 tag and ran it against my file: all 10 keys and values come
    out right.

  • config_fetch_bool() then returns the result with SetUserVariableA(),
    and that function in src/exdll.c computes the variable address in bytes
    instead of WCHARs:

    LPWSTR wideStr = (LPWSTR)((char*)g_variables + varnum * g_stringsize);

    With g_stringsize = 1024, $R0 (index 10) ends up at WCHAR offset 5120,
    which is $5. So the “0”/“1” goes into $5, $R0 keeps its old value, and
    CalcDefaults never selects or unselects anything.

  • setuservariable() in the same file does it right
    ((wchar_t*)g_variables + varnum*g_stringsize), which is why the empty
    result (missing key) works and true/false does not.

  • I confirmed the same thing in the shipped 5.1.1 binary: in
    $PLUGINSDIR\g4wihelp.dll the SetUserVariableA code does
    imul/add without the 2, while setuservariable uses [edx+eax2].

Suggested fix (src/exdll.c, SetUserVariableA):

  •  LPWSTR wideStr = (LPWSTR)((char*)g_variables + varnum * g_stringsize);
    
  •  LPWSTR wideStr = (LPWSTR)g_variables + varnum * g_stringsize;
    

Side note in config_init() (src/g4wihelp.c): cmdline is advanced while
parsing and later passed to free(cmdline), so it frees a pointer that
was not returned by malloc. Keeping the original pointer for free()
would fix it.

Workaround until it is fixed: the installer restores the previous
component selection (NSIS Memento) before reading the ini. Writing it
beforehand in the 64-bit registry view works for a silent install:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Gpg4win
MementoSectionUsed REG_SZ “”
MementoSection_SEC_kleopatra REG_DWORD 1
MementoSection_SEC_gpgex REG_DWORD 1
MementoSection_SEC_gpgol REG_DWORD 0
MementoSection_SEC_gpgoljs REG_DWORD 0
MementoSection_SEC_okular REG_DWORD 0
MementoSection_SEC_gpgpass REG_DWORD 0
MementoSection_SEC_gpgme_browser REG_DWORD 0

With that, 5.1.1 /S installs only Kleopatra, GpgEX and GnuPG (Paperkey
still gets installed, it is a hidden section). The start menu entry is
created and there is no desktop shortcut.