diff options
| author | David Lönnhager <david.l@mullvad.net> | 2022-01-11 15:34:55 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2022-01-13 15:17:44 +0100 |
| commit | cff1b1bc28d65ed7708ab93fe7e1d5e7d35c2a27 (patch) | |
| tree | 638b5b5491981b5286c9d683ba8e1d89589eb6fa /windows/nsis-plugins/src/msiutil/msiutil.cpp | |
| parent | d61966ed6b53312f9c6c8e379b5ad04d74732a2a (diff) | |
| download | mullvadvpn-cff1b1bc28d65ed7708ab93fe7e1d5e7d35c2a27.tar.xz mullvadvpn-cff1b1bc28d65ed7708ab93fe7e1d5e7d35c2a27.zip | |
Remove msiutil NSIS plugin
Diffstat (limited to 'windows/nsis-plugins/src/msiutil/msiutil.cpp')
| -rw-r--r-- | windows/nsis-plugins/src/msiutil/msiutil.cpp | 214 |
1 files changed, 0 insertions, 214 deletions
diff --git a/windows/nsis-plugins/src/msiutil/msiutil.cpp b/windows/nsis-plugins/src/msiutil/msiutil.cpp deleted file mode 100644 index 7aa5ef3e46..0000000000 --- a/windows/nsis-plugins/src/msiutil/msiutil.cpp +++ /dev/null @@ -1,214 +0,0 @@ -#include "stdafx.h" -#include <msi.h> -#include <windows.h> -#include <nsis/pluginapi.h> -#include "../error.h" -#include <log/log.h> -#include <libcommon/string.h> -#include <libcommon/error.h> - -namespace -{ - -std::wstring PopString() -{ - // - // NSIS functions popstring() and popstringn() require that you definitely size the buffer - // before popping the string. Let's do it ourselves instead. - // - - if (!g_stacktop || !*g_stacktop) - { - THROW_ERROR("NSIS variable stack is corrupted"); - } - - stack_t *th = *g_stacktop; - - std::wstring copy(th->text); - - *g_stacktop = th->next; - GlobalFree((HGLOBAL)th); - - return copy; -} - -EXTERN_C IMAGE_DOS_HEADER __ImageBase; - -void PinDll() -{ - // - // Apparently NSIS loads and unloads the plugin module for EVERY call it makes to the plugin. - // This makes it kind of difficult to maintain state. - // - // We can work around this by incrementing the module reference count. - // When NSIS calls FreeLibrary() the reference count decrements and becomes one. - // - - wchar_t self[MAX_PATH]; - - if (0 == GetModuleFileNameW((HINSTANCE)&__ImageBase, self, _countof(self))) - { - THROW_ERROR("Failed to pin plugin module"); - } - - // - // For some reason, NSIS frees this particular DLL more times than it loads it - // so we have to up the reference count significantly. - // - for (int i = 0; i < 100; ++i) - { - LoadLibraryW(self); - } -} - -int WINAPI InstallerHandler( - LPVOID context, - UINT type, - LPCWSTR message -) -{ - // Do not log potentially sensitive information - if (0 == _wcsnicmp(message, L"Property", _countof(L"Property") - sizeof(L'\0'))) - { - return 0; - } - - PluginLog(message); - // return 0 to pass it on to the installer - return 0; -} - -} // anonymous namespace - - -// -// SilentInstall "installer.msi" -// -// Performs a silent install and logs the results. -// -// Return: Empty string and NsisStatus::SUCCESS on success. -// Otherwise an error string and NsisStatus::GENERAL_ERROR. -// - -void __declspec(dllexport) NSISCALL SilentInstall -( - HWND hwndParent, - int string_size, - LPTSTR variables, - stack_t **stacktop, - extra_parameters *extra, - ... -) -{ - EXDLL_INIT(); - - try - { - const auto msiFile = PopString(); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, nullptr); - MsiSetExternalUIW( - InstallerHandler, - INSTALLLOGMODE_INFO | - INSTALLLOGMODE_WARNING | - INSTALLLOGMODE_ERROR | - INSTALLLOGMODE_FATALEXIT | - INSTALLLOGMODE_OUTOFDISKSPACE | - INSTALLLOGMODE_RMFILESINUSE | - INSTALLLOGMODE_FILESINUSE, - nullptr - ); - - const auto installResult = MsiInstallProductW( - msiFile.c_str(), - L"ACTION=INSTALL " - L"REBOOT=ReallySuppress" - ); - - if (ERROR_SUCCESS != installResult) - { - pushstring(common::string::ToWide(common::error::FormatWindowsError(installResult)).c_str()); - pushint(NsisStatus::GENERAL_ERROR); - return; - } - - pushstring(L""); - pushint(NsisStatus::SUCCESS); - } - catch (std::exception & err) - { - pushstring(common::string::ToWide(err.what()).c_str()); - pushint(NsisStatus::GENERAL_ERROR); - } - catch (...) - { - pushstring(L"Unspecified error"); - pushint(NsisStatus::GENERAL_ERROR); - } -} - -// -// SilentUninstall "installer.msi" -// -// Performs a silent uninstall and logs the results. -// -// Return: Empty string and NsisStatus::SUCCESS on success. -// Otherwise an error string and NsisStatus::GENERAL_ERROR. -// - -void __declspec(dllexport) NSISCALL SilentUninstall -( - HWND hwndParent, - int string_size, - LPTSTR variables, - stack_t **stacktop, - extra_parameters *extra, - ... -) -{ - EXDLL_INIT(); - - try - { - const auto msiFile = PopString(); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, nullptr); - MsiSetExternalUIW( - InstallerHandler, - INSTALLLOGMODE_INFO | - INSTALLLOGMODE_WARNING | - INSTALLLOGMODE_ERROR | - INSTALLLOGMODE_FATALEXIT | - INSTALLLOGMODE_OUTOFDISKSPACE | - INSTALLLOGMODE_RMFILESINUSE | - INSTALLLOGMODE_FILESINUSE, - nullptr - ); - - const auto installResult = MsiInstallProductW( - msiFile.c_str(), - L"REMOVE=ALL " - L"REBOOT=ReallySuppress" - ); - - if (ERROR_SUCCESS != installResult) - { - pushstring(common::string::ToWide(common::error::FormatWindowsError(installResult)).c_str()); - pushint(NsisStatus::GENERAL_ERROR); - return; - } - - pushstring(L""); - pushint(NsisStatus::SUCCESS); - } - catch (std::exception & err) - { - pushstring(common::string::ToWide(err.what()).c_str()); - pushint(NsisStatus::GENERAL_ERROR); - } - catch (...) - { - pushstring(L"Unspecified error"); - pushint(NsisStatus::GENERAL_ERROR); - } -} |
