From 03980448f876a4d9077be85b6626082eef56179c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Fri, 31 Aug 2007 09:49:48 +0000 Subject: [PATCH] Implement IsUserAnAdmin(), by copying implementation of IsUserAdmin() in setupapi (was implemented by Eric Kohl) Redirect setupapi.IsUserAdmin to shell32.IsUserAnAdmin svn path=/trunk/; revision=28693 --- reactos/dll/win32/setupapi/cfgmgr.c | 20 +++--- reactos/dll/win32/setupapi/misc.c | 78 ------------------------ reactos/dll/win32/setupapi/setupapi.spec | 2 +- reactos/dll/win32/shell32/shellord.c | 72 +++++++++++++++++++++- 4 files changed, 81 insertions(+), 91 deletions(-) diff --git a/reactos/dll/win32/setupapi/cfgmgr.c b/reactos/dll/win32/setupapi/cfgmgr.c index afc2d83ae21..f89a154aed7 100644 --- a/reactos/dll/win32/setupapi/cfgmgr.c +++ b/reactos/dll/win32/setupapi/cfgmgr.c @@ -135,7 +135,7 @@ CONFIGRET WINAPI CMP_Report_LogOn( if (!PnpGetLocalHandles(&BindingHandle, NULL)) return CR_FAILURE; - bAdmin = IsUserAdmin(); + bAdmin = IsUserAnAdmin(); for (i = 0; i < 30; i++) { @@ -182,7 +182,7 @@ CONFIGRET WINAPI CM_Add_Empty_Log_Conf_Ex( FIXME("%p %p %lu %lx %p\n", plcLogConf, dnDevInst, Priority, ulFlags, hMachine); - if (!IsUserAdmin()) + if (!IsUserAnAdmin()) return CR_ACCESS_DENIED; if (plcLogConf == NULL) @@ -298,7 +298,7 @@ CONFIGRET WINAPI CM_Add_ID_ExW( TRACE("%p %s %lx %p\n", dnDevInst, debugstr_w(pszID), ulFlags, hMachine); - if (!IsUserAdmin()) + if (!IsUserAnAdmin()) return CR_ACCESS_DENIED; if (dnDevInst == 0) @@ -490,7 +490,7 @@ CONFIGRET WINAPI CM_Create_DevNode_ExW( FIXME("%p %s %p %lx %p\n", pdnDevInst, debugstr_w(pDeviceID), dnParent, ulFlags, hMachine); - if (!IsUserAdmin()) + if (!IsUserAnAdmin()) return CR_ACCESS_DENIED; if (pdnDevInst == NULL) @@ -637,7 +637,7 @@ CONFIGRET WINAPI CM_Disable_DevNode_Ex( FIXME("%p %lx %p\n", dnDevInst, ulFlags, hMachine); - if (!IsUserAdmin()) + if (!IsUserAnAdmin()) return CR_ACCESS_DENIED; if (dnDevInst == 0) @@ -725,7 +725,7 @@ CONFIGRET WINAPI CM_Enable_DevNode_Ex( FIXME("%p %lx %p\n", dnDevInst, ulFlags, hMachine); - if (!IsUserAdmin()) + if (!IsUserAnAdmin()) return CR_ACCESS_DENIED; if (dnDevInst == 0) @@ -961,7 +961,7 @@ CONFIGRET WINAPI CM_Free_Log_Conf_Ex( TRACE("%lx %lx %lx\n", lcLogConfToBeFreed, ulFlags, hMachine); - if (!IsUserAdmin()) + if (!IsUserAnAdmin()) return CR_ACCESS_DENIED; pLogConfInfo = (PLOG_CONF_INFO)lcLogConfToBeFreed; @@ -2707,7 +2707,7 @@ CONFIGRET WINAPI CM_Move_DevNode_Ex( FIXME("%lx %lx %lx %lx\n", dnFromDevInst, dnToDevInst, ulFlags, hMachine); - if (!IsUserAdmin()) + if (!IsUserAnAdmin()) return CR_ACCESS_DENIED; if (dnFromDevInst == 0 || dnToDevInst == 0) @@ -3051,7 +3051,7 @@ CONFIGRET WINAPI CM_Run_Detection_Ex( TRACE("%lx %lx\n", ulFlags, hMachine); - if (!IsUserAdmin()) + if (!IsUserAnAdmin()) return CR_ACCESS_DENIED; if (ulFlags & ~CM_DETECT_BITS) @@ -3525,7 +3525,7 @@ CONFIGRET WINAPI CM_Setup_DevNode_Ex( FIXME("%lx %lx %lx\n", dnDevInst, ulFlags, hMachine); - if (!IsUserAdmin()) + if (!IsUserAnAdmin()) return CR_ACCESS_DENIED; if (dnDevInst == 0) diff --git a/reactos/dll/win32/setupapi/misc.c b/reactos/dll/win32/setupapi/misc.c index 40e0f473394..f5d4690f370 100644 --- a/reactos/dll/win32/setupapi/misc.c +++ b/reactos/dll/win32/setupapi/misc.c @@ -249,84 +249,6 @@ LONG WINAPI QueryRegistryValue(HKEY hKey, } -/************************************************************************** - * IsUserAdmin [SETUPAPI.@] - * - * Checks whether the current user is a member of the Administrators group. - * - * PARAMS - * None - * - * RETURNS - * Success: TRUE - * Failure: FALSE - */ -BOOL WINAPI IsUserAdmin(VOID) -{ - SID_IDENTIFIER_AUTHORITY Authority = {SECURITY_NT_AUTHORITY}; - HANDLE hToken; - DWORD dwSize; - PTOKEN_GROUPS lpGroups; - PSID lpSid; - DWORD i; - BOOL bResult = FALSE; - - TRACE("\n"); - - if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) - { - return FALSE; - } - - if (!GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwSize)) - { - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - { - CloseHandle(hToken); - return FALSE; - } - } - - lpGroups = MyMalloc(dwSize); - if (lpGroups == NULL) - { - CloseHandle(hToken); - return FALSE; - } - - if (!GetTokenInformation(hToken, TokenGroups, lpGroups, dwSize, &dwSize)) - { - MyFree(lpGroups); - CloseHandle(hToken); - return FALSE; - } - - CloseHandle(hToken); - - if (!AllocateAndInitializeSid(&Authority, 2, SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, - &lpSid)) - { - MyFree(lpGroups); - return FALSE; - } - - for (i = 0; i < lpGroups->GroupCount; i++) - { - if (EqualSid(lpSid, lpGroups->Groups[i].Sid)) - { - bResult = TRUE; - break; - } - } - - FreeSid(lpSid); - MyFree(lpGroups); - - return bResult; -} - - /************************************************************************** * MultiByteToUnicode [SETUPAPI.@] * diff --git a/reactos/dll/win32/setupapi/setupapi.spec b/reactos/dll/win32/setupapi/setupapi.spec index d02ce8ac8f0..ca957592bb4 100644 --- a/reactos/dll/win32/setupapi/setupapi.spec +++ b/reactos/dll/win32/setupapi/setupapi.spec @@ -216,7 +216,7 @@ @ stdcall InstallHinfSectionW(long long wstr long) @ stub InstallStop @ stub InstallStopEx -@ stdcall IsUserAdmin() +@ stdcall IsUserAdmin=shell32.IsUserAnAdmin() @ stub LookUpStringInTable @ stub MemoryInitialize @ stdcall MultiByteToUnicode(str long) diff --git a/reactos/dll/win32/shell32/shellord.c b/reactos/dll/win32/shell32/shellord.c index f1032617f83..5b8b5852beb 100644 --- a/reactos/dll/win32/shell32/shellord.c +++ b/reactos/dll/win32/shell32/shellord.c @@ -1227,10 +1227,78 @@ BOOL WINAPI FileIconInit(BOOL bFullInit) /************************************************************************* * IsUserAnAdmin [SHELL32.680] NT 4.0 * + * Checks whether the current user is a member of the Administrators group. + * + * PARAMS + * None + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ BOOL WINAPI IsUserAnAdmin(VOID) -{ FIXME("stub\n"); - return TRUE; +{ + SID_IDENTIFIER_AUTHORITY Authority = {SECURITY_NT_AUTHORITY}; + HANDLE hToken; + DWORD dwSize; + PTOKEN_GROUPS lpGroups; + PSID lpSid; + DWORD i; + BOOL bResult = FALSE; + + TRACE("\n"); + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) + { + return FALSE; + } + + if (!GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwSize)) + { + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + CloseHandle(hToken); + return FALSE; + } + } + + lpGroups = HeapAlloc(GetProcessHeap(), 0, dwSize); + if (lpGroups == NULL) + { + CloseHandle(hToken); + return FALSE; + } + + if (!GetTokenInformation(hToken, TokenGroups, lpGroups, dwSize, &dwSize)) + { + HeapFree(GetProcessHeap(), 0, lpGroups); + CloseHandle(hToken); + return FALSE; + } + + CloseHandle(hToken); + + if (!AllocateAndInitializeSid(&Authority, 2, SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, + &lpSid)) + { + HeapFree(GetProcessHeap(), 0, lpGroups); + return FALSE; + } + + for (i = 0; i < lpGroups->GroupCount; i++) + { + if (EqualSid(lpSid, lpGroups->Groups[i].Sid)) + { + bResult = TRUE; + break; + } + } + + FreeSid(lpSid); + HeapFree(GetProcessHeap(), 0, lpGroups); + + return bResult; } /*************************************************************************