James Hawkins : advpack: Implement IsNTAdmin.

Alexandre Julliard julliard at wine.codeweavers.com
Sat Jan 21 12:29:29 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 93cb78f37a182817a790ff6c6e271d824bc499b9
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=93cb78f37a182817a790ff6c6e271d824bc499b9

Author: James Hawkins <truiken at gmail.com>
Date:   Sat Jan 21 19:18:32 2006 +0100

advpack: Implement IsNTAdmin.

---

 dlls/advpack/Makefile.in |    2 +
 dlls/advpack/advpack.c   |   62 ++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 58 insertions(+), 6 deletions(-)

diff --git a/dlls/advpack/Makefile.in b/dlls/advpack/Makefile.in
index a14468d..4538083 100644
--- a/dlls/advpack/Makefile.in
+++ b/dlls/advpack/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = advpack.dll
 IMPORTLIB = libadvpack.$(IMPLIBEXT)
-IMPORTS   = setupapi version user32 kernel32 ntdll
+IMPORTS   = setupapi version user32 advapi32 kernel32 ntdll
 EXTRALIBS = $(LIBUNICODE)
 
 C_SRCS = \
diff --git a/dlls/advpack/advpack.c b/dlls/advpack/advpack.c
index 4fcae96..d07df8c 100644
--- a/dlls/advpack/advpack.c
+++ b/dlls/advpack/advpack.c
@@ -221,14 +221,66 @@ HRESULT WINAPI DoInfInstall(const SETUPC
  *
  * RETURNS
  *   TRUE if user has admin rights, FALSE otherwise.
- *
- * BUGS
- *   Unimplemented.
  */
 BOOL WINAPI IsNTAdmin( DWORD reserved, LPDWORD pReserved )
 {
-    FIXME("(0x%08lx, %p): stub\n", reserved, pReserved);
-    return TRUE;
+    SID_IDENTIFIER_AUTHORITY SidAuthority = {SECURITY_NT_AUTHORITY};
+    PTOKEN_GROUPS pTokenGroups;
+    BOOL bSidFound = FALSE;
+    DWORD dwSize, i;
+    HANDLE hToken;
+    PSID pSid;
+
+    TRACE("(0x%08lx, %p)\n", reserved, pReserved);
+
+    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
+        return FALSE;
+
+    if (!GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwSize))
+    {
+        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+        {
+            CloseHandle(hToken);
+            return FALSE;
+        }
+    }
+
+    pTokenGroups = HeapAlloc(GetProcessHeap(), 0, dwSize);
+    if (!pTokenGroups)
+    {
+        CloseHandle(hToken);
+        return FALSE;
+    }
+
+    if (!GetTokenInformation(hToken, TokenGroups, pTokenGroups, dwSize, &dwSize))
+    {
+        HeapFree(GetProcessHeap(), 0, pTokenGroups);
+        CloseHandle(hToken);
+        return FALSE;
+    }
+
+    CloseHandle(hToken);
+
+    if (!AllocateAndInitializeSid(&SidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
+                                  DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSid))
+    {
+        HeapFree(GetProcessHeap(), 0, pTokenGroups);
+        return FALSE;
+    }
+
+    for (i = 0; i < pTokenGroups->GroupCount; i++)
+    {
+        if (EqualSid(pSid, pTokenGroups->Groups[i].Sid))
+        {
+            bSidFound = TRUE;
+            break;
+        }
+    }
+
+    HeapFree(GetProcessHeap(), 0, pTokenGroups);
+    FreeSid(pSid);
+
+    return bSidFound;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list