mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-30 04:38:32 +00:00
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
This commit is contained in:
parent
b381f9d095
commit
366398cc53
|
@ -573,12 +573,28 @@ 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;
|
||||
|
||||
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;
|
||||
|
||||
|
@ -600,14 +616,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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue