Commit 366398cc authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

msi: Create the custom action server as an elevated process.

Dragon Naturally Speaking 12.5 manually validates that the custom action server is elevated. One might imagine that the right approach here is to add a manifest to msiexec; however, msiexec does not always trigger a UAC prompt on Windows. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51143
parent b381f9d0
...@@ -573,12 +573,28 @@ UINT CDECL __wine_msi_call_dll_function(DWORD client_pid, const GUID *guid) ...@@ -573,12 +573,28 @@ UINT CDECL __wine_msi_call_dll_function(DWORD client_pid, const GUID *guid)
return r; return r;
} }
static HANDLE get_admin_token(void)
{
TOKEN_ELEVATION_TYPE type;
TOKEN_LINKED_TOKEN linked;
DWORD size;
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) static DWORD custom_start_server(MSIPACKAGE *package, DWORD arch)
{ {
WCHAR path[MAX_PATH], cmdline[MAX_PATH + 23]; WCHAR path[MAX_PATH], cmdline[MAX_PATH + 23];
PROCESS_INFORMATION pi = {0}; PROCESS_INFORMATION pi = {0};
STARTUPINFOW si = {0}; STARTUPINFOW si = {0};
WCHAR buffer[24]; WCHAR buffer[24];
HANDLE token;
void *cookie; void *cookie;
HANDLE pipe; HANDLE pipe;
...@@ -600,14 +616,18 @@ static DWORD custom_start_server(MSIPACKAGE *package, DWORD arch) ...@@ -600,14 +616,18 @@ static DWORD custom_start_server(MSIPACKAGE *package, DWORD arch)
lstrcatW(path, L"\\msiexec.exe"); lstrcatW(path, L"\\msiexec.exe");
swprintf(cmdline, ARRAY_SIZE(cmdline), L"%s -Embedding %d", path, GetCurrentProcessId()); swprintf(cmdline, ARRAY_SIZE(cmdline), L"%s -Embedding %d", path, GetCurrentProcessId());
token = get_admin_token();
if (is_wow64 && arch == SCS_64BIT_BINARY) if (is_wow64 && arch == SCS_64BIT_BINARY)
{ {
Wow64DisableWow64FsRedirection(&cookie); 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); Wow64RevertWow64FsRedirection(cookie);
} }
else 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); CloseHandle(pi.hThread);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment