-
Notifications
You must be signed in to change notification settings - Fork 7
/
OS.cpp
81 lines (62 loc) · 1.71 KB
/
OS.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "OS.hpp"
#include <Lmcons.h>
string OS::GetCurrentUsername()
{
char username[UNLEN + 1];
DWORD username_len = UNLEN + 1;
if (GetUserNameA(username, &username_len))
{
string user = username;
return user;
}
return NULL;
}
int OS::GetCPUID()
{
int regs[4] = { 0 };
//__cpuid(regs, 0);
return regs[0];
}
bool OS::IsElevated()
{
DWORD dwSize = 0;
HANDLE hToken = NULL;
bool bReturn = false;;
TOKEN_ELEVATION tokenInformation;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
return FALSE;
if (GetTokenInformation(hToken, TokenElevation, &tokenInformation, sizeof(TOKEN_ELEVATION), &dwSize))
{
bReturn = (bool)tokenInformation.TokenIsElevated;
}
CloseHandle(hToken);
return bReturn;
}
bool OS::SetDebugPrivilege(bool Enable)
{
HANDLE hToken{ nullptr };
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
return false;
DWORD dwSize = 0;
TOKEN_ELEVATION tokenInformation;
if (GetTokenInformation(hToken, TokenElevation, &tokenInformation, sizeof(TOKEN_ELEVATION), &dwSize))
{
if (tokenInformation.TokenIsElevated)
return true; //already elevated
}
TOKEN_PRIVILEGES TokenPrivileges{};
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = Enable ? SE_PRIVILEGE_ENABLED : 0;
if (!LookupPrivilegeValueA(nullptr, "SeDebugPrivilege", &TokenPrivileges.Privileges[0].Luid))
{
CloseHandle(hToken);
return false;
}
if (AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr) != ERROR_SUCCESS)
{
CloseHandle(hToken);
return false;
}
CloseHandle(hToken);
return true;
}