diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-02-16 15:26:47 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-02-17 13:02:40 +0100 |
| commit | 623a102b094ff85bcc98e60a424ff18df66cc747 (patch) | |
| tree | dfd0b18348400d40843afbe7d6c3bc8094a54659 /windows/nsis-plugins/src | |
| parent | 9f1eeca0791459be6d62bfd7ea687fdfc4833dc8 (diff) | |
| download | mullvadvpn-623a102b094ff85bcc98e60a424ff18df66cc747.tar.xz mullvadvpn-623a102b094ff85bcc98e60a424ff18df66cc747.zip | |
Add "os" NSIS plugin
Diffstat (limited to 'windows/nsis-plugins/src')
| -rw-r--r-- | windows/nsis-plugins/src/os/dllmain.cpp | 11 | ||||
| -rw-r--r-- | windows/nsis-plugins/src/os/os.cpp | 45 | ||||
| -rw-r--r-- | windows/nsis-plugins/src/os/os.def | 5 | ||||
| -rw-r--r-- | windows/nsis-plugins/src/os/os.vcxproj | 124 | ||||
| -rw-r--r-- | windows/nsis-plugins/src/os/os.vcxproj.filters | 19 | ||||
| -rw-r--r-- | windows/nsis-plugins/src/os/stdafx.cpp | 8 | ||||
| -rw-r--r-- | windows/nsis-plugins/src/os/stdafx.h | 16 | ||||
| -rw-r--r-- | windows/nsis-plugins/src/os/targetver.h | 12 | ||||
| -rw-r--r-- | windows/nsis-plugins/src/os/update.cpp | 40 | ||||
| -rw-r--r-- | windows/nsis-plugins/src/os/update.h | 11 |
10 files changed, 291 insertions, 0 deletions
diff --git a/windows/nsis-plugins/src/os/dllmain.cpp b/windows/nsis-plugins/src/os/dllmain.cpp new file mode 100644 index 0000000000..f11c65c519 --- /dev/null +++ b/windows/nsis-plugins/src/os/dllmain.cpp @@ -0,0 +1,11 @@ +#include "stdafx.h" +#include <windows.h> + +BOOL APIENTRY DllMain(HMODULE, DWORD, LPVOID) +{ + // + // Avoid doing work in DllMain since the loader lock is held + // + + return TRUE; +} diff --git a/windows/nsis-plugins/src/os/os.cpp b/windows/nsis-plugins/src/os/os.cpp new file mode 100644 index 0000000000..b5b1e54250 --- /dev/null +++ b/windows/nsis-plugins/src/os/os.cpp @@ -0,0 +1,45 @@ +#include <stdafx.h> +#include "../error.h" +#include "update.h" +#include <libcommon/string.h> +#include <windows.h> +#include <nsis/pluginapi.h> +#include <functional> +#include <vector> + +enum PatchStatus +{ + PATCH_ERROR = 0, + PATCH_PRESENT, + PATCH_MISSING +}; + +void __declspec(dllexport) NSISCALL CheckWindows7Patch +( + HWND hwndParent, + int string_size, + LPTSTR variables, + stack_t** stacktop, + extra_parameters* extra, + ... +) +{ + EXDLL_INIT(); + + try + { + const auto success = update::HasSetupApiSha2Fix(); + pushstring(L""); + pushint(success ? PatchStatus::PATCH_PRESENT : PatchStatus::PATCH_MISSING); + } + catch (const std::exception& err) + { + pushstring(common::string::ToWide(err.what()).c_str()); + pushint(PatchStatus::PATCH_ERROR); + } + catch (...) + { + pushstring(L"Unspecified error"); + pushint(PatchStatus::PATCH_ERROR); + } +} diff --git a/windows/nsis-plugins/src/os/os.def b/windows/nsis-plugins/src/os/os.def new file mode 100644 index 0000000000..47808ce48f --- /dev/null +++ b/windows/nsis-plugins/src/os/os.def @@ -0,0 +1,5 @@ +LIBRARY os + +EXPORTS + +CheckWindows7Patch diff --git a/windows/nsis-plugins/src/os/os.vcxproj b/windows/nsis-plugins/src/os/os.vcxproj new file mode 100644 index 0000000000..daa51758a4 --- /dev/null +++ b/windows/nsis-plugins/src/os/os.vcxproj @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="16.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <VCProjectVersion>16.0</VCProjectVersion> + <ProjectGuid>{5ECCC4BC-599B-4F49-8D8F-63A2CF64764F}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>os</RootNamespace> + <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v142</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="Shared"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir> + <IntDir>$(SolutionDir)bin\temp\$(Platform)-$(Configuration)\$(ProjectName)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir> + <IntDir>$(SolutionDir)bin\temp\$(Platform)-$(Configuration)\$(ProjectName)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>WIN32;_DEBUG;os_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>$(ProjectDir)../../../../dist-assets/binaries/x86_64-pc-windows-msvc/;$(ProjectDir)../../../windows-libraries/src/</AdditionalIncludeDirectories> + <LanguageStandard>stdcpplatest</LanguageStandard> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>$(ProjectDir)../../../../dist-assets/binaries/x86_64-pc-windows-msvc/nsis/;$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>libcommon.lib;pluginapi-x86-unicode.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <IgnoreSpecificDefaultLibraries>libc.lib</IgnoreSpecificDefaultLibraries> + <ModuleDefinitionFile>os.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>WIN32;NDEBUG;os_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>$(ProjectDir)../../../../dist-assets/binaries/x86_64-pc-windows-msvc/;$(ProjectDir)../../../windows-libraries/src/</AdditionalIncludeDirectories> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <LanguageStandard>stdcpplatest</LanguageStandard> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>$(ProjectDir)../../../../dist-assets/binaries/x86_64-pc-windows-msvc/nsis/;$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>libcommon.lib;pluginapi-x86-unicode.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <IgnoreSpecificDefaultLibraries>libc.lib</IgnoreSpecificDefaultLibraries> + <ModuleDefinitionFile>os.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClInclude Include="update.h" /> + <ClInclude Include="stdafx.h" /> + <ClInclude Include="targetver.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="update.cpp" /> + <ClCompile Include="dllmain.cpp" /> + <ClCompile Include="os.cpp" /> + <ClCompile Include="stdafx.cpp"> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> + </ClCompile> + </ItemGroup> + <ItemGroup> + <None Include="os.def" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/windows/nsis-plugins/src/os/os.vcxproj.filters b/windows/nsis-plugins/src/os/os.vcxproj.filters new file mode 100644 index 0000000000..6b31d70d05 --- /dev/null +++ b/windows/nsis-plugins/src/os/os.vcxproj.filters @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClInclude Include="stdafx.h" /> + <ClInclude Include="targetver.h" /> + <ClInclude Include="cleaningops.h" /> + <ClInclude Include="os.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="dllmain.cpp" /> + <ClCompile Include="os.cpp" /> + <ClCompile Include="stdafx.cpp" /> + <ClCompile Include="cleaningops.cpp" /> + <ClCompile Include="os.cpp" /> + </ItemGroup> + <ItemGroup> + <None Include="os.def" /> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/windows/nsis-plugins/src/os/stdafx.cpp b/windows/nsis-plugins/src/os/stdafx.cpp new file mode 100644 index 0000000000..3b6341d106 --- /dev/null +++ b/windows/nsis-plugins/src/os/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// driverlogic.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/windows/nsis-plugins/src/os/stdafx.h b/windows/nsis-plugins/src/os/stdafx.h new file mode 100644 index 0000000000..f3a07375c7 --- /dev/null +++ b/windows/nsis-plugins/src/os/stdafx.h @@ -0,0 +1,16 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include <windows.h> + + + +// TODO: reference additional headers your program requires here diff --git a/windows/nsis-plugins/src/os/targetver.h b/windows/nsis-plugins/src/os/targetver.h new file mode 100644 index 0000000000..ae4a5c032c --- /dev/null +++ b/windows/nsis-plugins/src/os/targetver.h @@ -0,0 +1,12 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include <WinSDKVer.h> + +#define _WIN32_WINNT _WIN32_WINNT_WIN7 + +#include <SDKDDKVer.h> diff --git a/windows/nsis-plugins/src/os/update.cpp b/windows/nsis-plugins/src/os/update.cpp new file mode 100644 index 0000000000..2f349ac687 --- /dev/null +++ b/windows/nsis-plugins/src/os/update.cpp @@ -0,0 +1,40 @@ +#include <stdafx.h> +#include "update.h" +#include <libcommon/error.h> +#include <libcommon/filesystem.h> +#include <algorithm> +#include <fstream> +#include <filesystem> + +namespace +{ + +// Jason found this to be a reliable marker of the signature check fix: +// https://git.zx2c4.com/wireguard-windows/tree/installer/customactions.c#n145 +const char PATCH_MARKER[] = "Signature Hash"; + +} + +namespace update +{ + +bool HasSetupApiSha2Fix() +{ + common::fs::ScopedNativeFileSystem nativeFileSystem; + + const auto systemDir = common::fs::GetKnownFolderPath(FOLDERID_System, KF_FLAG_DEFAULT, NULL); + const auto setupApiPath = std::filesystem::path(systemDir).append(L"setupapi.dll"); + + std::ifstream ifs(setupApiPath, std::ios_base::binary); + if (!ifs) + { + // Maybe sketchy to rely on GLE here + THROW_WINDOWS_ERROR(GetLastError(), "Failed to open setupapi.dll"); + } + + const auto marker_end = PATCH_MARKER + sizeof(PATCH_MARKER) - sizeof('\0'); + const auto last = std::istreambuf_iterator<char>(); + return (last != std::search(std::istreambuf_iterator<char>(ifs), last, PATCH_MARKER, marker_end)); +} + +} diff --git a/windows/nsis-plugins/src/os/update.h b/windows/nsis-plugins/src/os/update.h new file mode 100644 index 0000000000..ae33258b56 --- /dev/null +++ b/windows/nsis-plugins/src/os/update.h @@ -0,0 +1,11 @@ +#pragma once + +namespace update +{ + +// Checks whether SHA-2 signatures can be verified correctly +// on Windows 7. Without this patch, the driver cannot be +// installed from a service. +bool HasSetupApiSha2Fix(); + +} |
