mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 06:05:58 -06:00
102 lines
2.5 KiB
C++
102 lines
2.5 KiB
C++
#include "SysInfo.h"
|
|
|
|
#ifdef PLATFORM_WIN32
|
|
|
|
NAMESPACE_UPP
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
// utility function to see if running Vista or newer OSs
|
|
bool IsVistaOrLater(void)
|
|
{
|
|
OSVERSIONINFO osvi;
|
|
|
|
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
|
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
|
|
GetVersionEx(&osvi);
|
|
|
|
return (osvi.dwMajorVersion >= 6);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
// utility function to see if running Xp or newer OSs
|
|
bool IsXpOrLater(void)
|
|
{
|
|
OSVERSIONINFO osvi;
|
|
|
|
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
|
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
|
|
GetVersionEx(&osvi);
|
|
|
|
return (osvi.dwMajorVersion > 5 || (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion >= 1));
|
|
}
|
|
|
|
static BOOL IsGroupMember(DWORD dwRelativeID, BOOL bProcessRelative, BOOL* pIsMember)
|
|
{
|
|
HANDLE hToken, hDupToken;
|
|
PSID pSid = NULL;
|
|
SID_IDENTIFIER_AUTHORITY SidAuthority = SECURITY_NT_AUTHORITY;
|
|
|
|
if (!pIsMember)
|
|
{
|
|
SetLastError(ERROR_INVALID_USER_BUFFER);
|
|
return FALSE;
|
|
}
|
|
|
|
if (bProcessRelative || !OpenThreadToken(GetCurrentThread(), TOKEN_QUERY | TOKEN_DUPLICATE, TRUE, &hToken))
|
|
{
|
|
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &hToken))
|
|
return FALSE;
|
|
}
|
|
|
|
if (!DuplicateToken(hToken, SecurityIdentification, &hDupToken))
|
|
{
|
|
CloseHandle(hToken);
|
|
return FALSE;
|
|
}
|
|
|
|
CloseHandle(hToken);
|
|
hToken = hDupToken;
|
|
|
|
if (!AllocateAndInitializeSid(&SidAuthority, 2,
|
|
SECURITY_BUILTIN_DOMAIN_RID, dwRelativeID, 0, 0, 0, 0, 0, 0,
|
|
&pSid))
|
|
{
|
|
CloseHandle(hToken);
|
|
return FALSE;
|
|
}
|
|
|
|
if (!CheckTokenMembership(hToken, pSid, pIsMember))
|
|
{
|
|
CloseHandle(hToken);
|
|
FreeSid(pSid);
|
|
|
|
*pIsMember = FALSE;
|
|
return FALSE;
|
|
}
|
|
|
|
CloseHandle(hToken);
|
|
FreeSid(pSid);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
// utility functions to check whether an app is running in elevated mode
|
|
bool IsUserAdministrator(void)
|
|
{
|
|
BOOL isAdmin;
|
|
|
|
// always an admin for XP and previous versions
|
|
if(!IsVistaOrLater())
|
|
return true;
|
|
|
|
// check if running in admin mode for Vista or newers
|
|
IsGroupMember(DOMAIN_ALIAS_RID_ADMINS, FALSE, &isAdmin);
|
|
return isAdmin;
|
|
}
|
|
|
|
END_UPP_NAMESPACE
|
|
|
|
#endif
|