atl100: Check Administrators group if UAC is disabled.
Vincent Povirk
madewokherd at gmail.com
Sat Nov 21 19:54:57 CST 2015
Fixes http://test.winehq.org/data/b5c0c46cfc0c8590d797d8cbe08b3f0a8cfe751e/win8_kneesaa/atl100:atl.html
-------------- next part --------------
From 30d24fcd92e852205641169947ef90df36363ca3 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Sat, 21 Nov 2015 19:47:40 -0600
Subject: [PATCH] atl100: Check Administrators group if UAC is disabled.
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
---
dlls/atl100/tests/atl.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 59 insertions(+), 2 deletions(-)
diff --git a/dlls/atl100/tests/atl.c b/dlls/atl100/tests/atl.c
index d07a523..c6e5cda 100644
--- a/dlls/atl100/tests/atl.c
+++ b/dlls/atl100/tests/atl.c
@@ -63,10 +63,58 @@ static const WCHAR fileW[] = {'f','i','l','e',':','/','/','/','\0'};
static const WCHAR html_fileW[] = {'t','e','s','t','.','h','t','m','l','\0'};
static const char html_str[] = "<html><body>test</body><html>";
+static BOOL is_token_admin(HANDLE token)
+{
+ PSID administrators = NULL;
+ SID_IDENTIFIER_AUTHORITY nt_authority = { SECURITY_NT_AUTHORITY };
+ DWORD groups_size;
+ PTOKEN_GROUPS groups;
+ DWORD group_index;
+
+ /* Create a well-known SID for the Administrators group. */
+ if (! AllocateAndInitializeSid(&nt_authority, 2, SECURITY_BUILTIN_DOMAIN_RID,
+ DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
+ &administrators))
+ return FALSE;
+
+ /* Get the group info from the token */
+ groups_size = 0;
+ GetTokenInformation(token, TokenGroups, NULL, 0, &groups_size);
+ groups = HeapAlloc(GetProcessHeap(), 0, groups_size);
+ if (groups == NULL)
+ {
+ FreeSid(administrators);
+ return FALSE;
+ }
+ if (! GetTokenInformation(token, TokenGroups, groups, groups_size, &groups_size))
+ {
+ HeapFree(GetProcessHeap(), 0, groups);
+ FreeSid(administrators);
+ return FALSE;
+ }
+
+ /* Now check if the token groups include the Administrators group */
+ for (group_index = 0; group_index < groups->GroupCount; group_index++)
+ {
+ if (EqualSid(groups->Groups[group_index].Sid, administrators))
+ {
+ HeapFree(GetProcessHeap(), 0, groups);
+ FreeSid(administrators);
+ return TRUE;
+ }
+ }
+
+ /* If we end up here we didn't find the Administrators group */
+ HeapFree(GetProcessHeap(), 0, groups);
+ FreeSid(administrators);
+ return FALSE;
+}
+
static BOOL is_process_limited(void)
{
static BOOL (WINAPI *pOpenProcessToken)(HANDLE, DWORD, PHANDLE) = NULL;
HANDLE token;
+ BOOL result=FALSE;
if (!pOpenProcessToken)
{
@@ -83,10 +131,19 @@ static BOOL is_process_limited(void)
DWORD size;
ret = GetTokenInformation(token, TokenElevationType, &type, sizeof(type), &size);
+ if (ret)
+ {
+ if (type == TokenElevationTypeDefault)
+ /* UAC is disabled, check for administrators group */
+ result = !is_token_admin(token);
+ else if (type == TokenElevationTypeFull)
+ result = FALSE;
+ else if (type == TokenElevationTypeLimited)
+ result = TRUE;
+ }
CloseHandle(token);
- return (ret && type == TokenElevationTypeLimited);
}
- return FALSE;
+ return result;
}
static void test_winmodule(void)
--
2.1.4
More information about the wine-patches
mailing list