Skip to content

Commit

Permalink
Merge pull request #16997 from n1hility/winstaller-arm-compat
Browse files Browse the repository at this point in the history
Fixes automated WSL installation on ARM
  • Loading branch information
openshift-merge-robot authored Jan 9, 2023
2 parents bc6908e + 54afda2 commit 31e22aa
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 47 deletions.
46 changes: 0 additions & 46 deletions cmd/podman-msihooks/main.go

This file was deleted.

4 changes: 3 additions & 1 deletion contrib/win-installer/build-hooks.bat
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
cd ../..
go build -buildmode=c-shared -o contrib/win-installer/artifacts/podman-msihooks.dll ./cmd/podman-msihooks || exit /b 1
set GOARCH=amd64
go build -ldflags -H=windowsgui -o contrib/win-installer/artifacts/podman-wslkerninst.exe ./cmd/podman-wslkerninst || exit /b 1
cd contrib/win-installer
@rem Build using x86 toolchain, see comments in check.c for rationale and details
x86_64-w64-mingw32-gcc podman-msihooks/check.c -shared -lmsi -mwindows -o artifacts/podman-msihooks.dll || exit /b 1
66 changes: 66 additions & 0 deletions contrib/win-installer/podman-msihooks/check.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#include <windows.h>
#include <MsiQuery.h>

BOOL isWSLEnabled();
LPCWSTR boolToNStr(BOOL bool);

/**
* CheckWSL is a custom action loaded by the Podman Windows installer
* to determine whether the system already has WSL installed.
*
* The intention is that this action is compiled for x86_64, which
* can be ran on both Intel and Arm based systems (the latter through
* emulation). While the code should build fine on MSVC and clang, the
* intended usage is MingW-W64 (cross-compiling gcc targeting Windows).
*
* Previously this was implemented as a Golang c-shared cgo library,
* however, the WoW x86_64 emulation layer struggled with dynamic
* hot-loaded transformation of the goruntime into an existing process
* (required by MSI custom actions). In the future this could be
* converted back, should the emulation issue be resolved.
*/

__declspec(dllexport) UINT __cdecl CheckWSL(MSIHANDLE hInstall) {
BOOL hasWSL = isWSLEnabled();
// Set a property with the WSL state for the installer to operate on
MsiSetPropertyW(hInstall, L"HAS_WSLFEATURE", boolToNStr(hasWSL));

return 0;
}

LPCWSTR boolToNStr(BOOL bool) {
return bool ? L"1" : L"0";
}

BOOL isWSLEnabled() {
/*
* The simplest, and most reliable check across all variants and versions
* of WSL appears to be changing the default version to WSL 2 and check
* for errors, which we need to do anyway.
*/
STARTUPINFOW startup;
PROCESS_INFORMATION process;

ZeroMemory(&startup, sizeof(STARTUPINFOW));
startup.cb = sizeof(STARTUPINFOW);

// These settings hide the console window, so there is no annoying flash
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = SW_HIDE;

// CreateProcessW requires lpCommandLine to be mutable
wchar_t cmd[] = L"wsl --set-default-version 2";
if (! CreateProcessW(NULL, cmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
NULL, NULL, &startup, &process)) {

return FALSE;
}

DWORD exitCode;
WaitForSingleObject(process.hProcess, INFINITE);
if (! GetExitCodeProcess(process.hProcess, &exitCode)) {
return FALSE;
}

return exitCode == 0;
}

0 comments on commit 31e22aa

Please sign in to comment.