aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-08-03 08:45:56 +0000
committerJason A. Donenfeld <Jason@zx2c4.com>2019-08-03 08:46:21 +0000
commitbc22e2dd25072a1982ffc216615c7ba91d956317 (patch)
tree1754103e6c6b0ee2203253e17919dcde2c1e3e61
parentShorten README (diff)
downloadwintun-bc22e2dd25072a1982ffc216615c7ba91d956317.tar.xz
wintun-bc22e2dd25072a1982ffc216615c7ba91d956317.zip
GetCurrentProcessToken() is Win8+, so open our own token
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--installer/rundll32.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/installer/rundll32.c b/installer/rundll32.c
index 3a482f1..cc1a6d2 100644
--- a/installer/rundll32.c
+++ b/installer/rundll32.c
@@ -35,7 +35,7 @@ ConsoleLogger(_In_ LOGGER_LEVEL Level, _In_ const TCHAR *LogLine)
static BOOL ElevateToSystem(VOID)
{
- HANDLE ThreadToken, ProcessSnapshot, WinlogonProcess, WinlogonToken, DuplicatedToken;
+ HANDLE CurrentProcessToken, ThreadToken, ProcessSnapshot, WinlogonProcess, WinlogonToken, DuplicatedToken;
PROCESSENTRY32 ProcessEntry = { .dwSize = sizeof(PROCESSENTRY32) };
BOOL Ret;
DWORD LastError = ERROR_SUCCESS;
@@ -50,8 +50,13 @@ static BOOL ElevateToSystem(VOID)
TOKEN_USER MaybeLocalSystem;
CHAR LargeEnoughForLocalSystem[0x400];
} TokenUserBuffer;
- if (!GetTokenInformation(
- GetCurrentProcessToken(), TokenUser, &TokenUserBuffer, sizeof(TokenUserBuffer), &RequiredBytes))
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &CurrentProcessToken))
+ goto cleanup;
+ Ret =
+ GetTokenInformation(CurrentProcessToken, TokenUser, &TokenUserBuffer, sizeof(TokenUserBuffer), &RequiredBytes);
+ LastError = GetLastError();
+ CloseHandle(CurrentProcessToken);
+ if (!Ret)
goto cleanup;
if (EqualSid(TokenUserBuffer.MaybeLocalSystem.User.Sid, LocalSystemSid))
return TRUE;
@@ -116,7 +121,12 @@ RunAsAdministrator(HWND hwnd, TCHAR *Verb, int nCmdShow)
{
TOKEN_ELEVATION Elevation;
DWORD Required;
- if (!GetTokenInformation(GetCurrentProcessToken(), TokenElevation, &Elevation, sizeof(Elevation), &Required))
+ HANDLE CurrentProcessToken;
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &CurrentProcessToken))
+ return;
+ BOOL Ret = GetTokenInformation(CurrentProcessToken, TokenElevation, &Elevation, sizeof(Elevation), &Required);
+ CloseHandle(CurrentProcessToken);
+ if (!Ret)
return;
if (Elevation.TokenIsElevated)
return;
@@ -155,6 +165,6 @@ VOID __stdcall InstallWintun(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int
VOID __stdcall UninstallWintun(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
- RunAsAdministrator(hwnd, TEXT(__FUNCTION__) , nCmdShow);
+ RunAsAdministrator(hwnd, TEXT(__FUNCTION__), nCmdShow);
Do(FALSE, !!nCmdShow);
} \ No newline at end of file