https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3b5586f6350a7a74db4d15...
commit 3b5586f6350a7a74db4d15a1f0125cb2394b631f Author: winesync ros-dev@reactos.org AuthorDate: Mon Mar 14 21:57:22 2022 +0100 Commit: Mark Jansen mark.jansen@reactos.org CommitDate: Sun Mar 20 19:28:45 2022 +0100
[WINESYNC] msi: Create the custom action server as an elevated process.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51143 Signed-off-by: Zebediah Figura z.figura12@gmail.com
wine-staging patch by Zebediah Figura z.figura12@gmail.com --- dll/win32/msi/custom.c | 31 ++++++++++- ...ustom_action_server_as_an_elevated_process.diff | 61 ++++++++++++++++++++++ 2 files changed, 90 insertions(+), 2 deletions(-)
diff --git a/dll/win32/msi/custom.c b/dll/win32/msi/custom.c index 143de262971..f29699bd54b 100644 --- a/dll/win32/msi/custom.c +++ b/dll/win32/msi/custom.c @@ -593,12 +593,35 @@ UINT CDECL __wine_msi_call_dll_function(DWORD client_pid, const GUID *guid) return r; }
+static HANDLE get_admin_token(void) +{ + TOKEN_ELEVATION_TYPE type; + TOKEN_LINKED_TOKEN linked; + DWORD size; + +#ifdef __REACTOS__ +#ifndef GetCurrentThreadEffectiveToken +#define GetCurrentProcessToken() ((HANDLE)~(ULONG_PTR)3) +#define GetCurrentThreadEffectiveToken() GetCurrentProcessToken() +#endif +#endif + + if (!GetTokenInformation(GetCurrentThreadEffectiveToken(), TokenElevationType, &type, sizeof(type), &size) + || type == TokenElevationTypeFull) + return NULL; + + if (!GetTokenInformation(GetCurrentThreadEffectiveToken(), TokenLinkedToken, &linked, sizeof(linked), &size)) + return NULL; + return linked.LinkedToken; +} + static DWORD custom_start_server(MSIPACKAGE *package, DWORD arch) { WCHAR path[MAX_PATH], cmdline[MAX_PATH + 23]; PROCESS_INFORMATION pi = {0}; STARTUPINFOW si = {0}; WCHAR buffer[24]; + HANDLE token; void *cookie; HANDLE pipe;
@@ -620,14 +643,18 @@ static DWORD custom_start_server(MSIPACKAGE *package, DWORD arch) lstrcatW(path, L"\msiexec.exe"); swprintf(cmdline, ARRAY_SIZE(cmdline), L"%s -Embedding %d", path, GetCurrentProcessId());
+ token = get_admin_token(); + if (is_wow64 && arch == SCS_64BIT_BINARY) { Wow64DisableWow64FsRedirection(&cookie); - CreateProcessW(path, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + CreateProcessAsUserW(token, path, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); Wow64RevertWow64FsRedirection(cookie); } else - CreateProcessW(path, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + CreateProcessAsUserW(token, path, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + + if (token) CloseHandle(token);
CloseHandle(pi.hThread);
diff --git a/sdk/tools/winesync/msi_staging/0002-msi__Create_the_custom_action_server_as_an_elevated_process.diff b/sdk/tools/winesync/msi_staging/0002-msi__Create_the_custom_action_server_as_an_elevated_process.diff new file mode 100644 index 00000000000..b94f8d06526 --- /dev/null +++ b/sdk/tools/winesync/msi_staging/0002-msi__Create_the_custom_action_server_as_an_elevated_process.diff @@ -0,0 +1,61 @@ +diff --git a/dll/win32/msi/custom.c b/dll/win32/msi/custom.c +index 143de262971..f29699bd54b 100644 +--- a/dll/win32/msi/custom.c ++++ b/dll/win32/msi/custom.c +@@ -593,12 +593,35 @@ UINT CDECL __wine_msi_call_dll_function(DWORD client_pid, const GUID *guid) + return r; + } + ++static HANDLE get_admin_token(void) ++{ ++ TOKEN_ELEVATION_TYPE type; ++ TOKEN_LINKED_TOKEN linked; ++ DWORD size; ++ ++#ifdef __REACTOS__ ++#ifndef GetCurrentThreadEffectiveToken ++#define GetCurrentProcessToken() ((HANDLE)~(ULONG_PTR)3) ++#define GetCurrentThreadEffectiveToken() GetCurrentProcessToken() ++#endif ++#endif ++ ++ if (!GetTokenInformation(GetCurrentThreadEffectiveToken(), TokenElevationType, &type, sizeof(type), &size) ++ || type == TokenElevationTypeFull) ++ return NULL; ++ ++ if (!GetTokenInformation(GetCurrentThreadEffectiveToken(), TokenLinkedToken, &linked, sizeof(linked), &size)) ++ return NULL; ++ return linked.LinkedToken; ++} ++ + static DWORD custom_start_server(MSIPACKAGE *package, DWORD arch) + { + WCHAR path[MAX_PATH], cmdline[MAX_PATH + 23]; + PROCESS_INFORMATION pi = {0}; + STARTUPINFOW si = {0}; + WCHAR buffer[24]; ++ HANDLE token; + void *cookie; + HANDLE pipe; + +@@ -620,14 +643,18 @@ static DWORD custom_start_server(MSIPACKAGE *package, DWORD arch) + lstrcatW(path, L"\msiexec.exe"); + swprintf(cmdline, ARRAY_SIZE(cmdline), L"%s -Embedding %d", path, GetCurrentProcessId()); + ++ token = get_admin_token(); ++ + if (is_wow64 && arch == SCS_64BIT_BINARY) + { + Wow64DisableWow64FsRedirection(&cookie); +- CreateProcessW(path, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); ++ CreateProcessAsUserW(token, path, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + Wow64RevertWow64FsRedirection(cookie); + } + else +- CreateProcessW(path, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); ++ CreateProcessAsUserW(token, path, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); ++ ++ if (token) CloseHandle(token); + + CloseHandle(pi.hThread); +