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