summaryrefslogtreecommitdiffhomepage
path: root/windows/nsis-plugins/src/msiutil/msiutil.cpp
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2022-01-11 15:34:55 +0100
committerDavid Lönnhager <david.l@mullvad.net>2022-01-13 15:17:44 +0100
commitcff1b1bc28d65ed7708ab93fe7e1d5e7d35c2a27 (patch)
tree638b5b5491981b5286c9d683ba8e1d89589eb6fa /windows/nsis-plugins/src/msiutil/msiutil.cpp
parentd61966ed6b53312f9c6c8e379b5ad04d74732a2a (diff)
downloadmullvadvpn-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.cpp214
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);
- }
-}