7
7
//
8
8
#include " stdafx.h"
9
9
#include " LicenseData.h"
10
+ #include < VersionHelpers.h>
10
11
#include < iostream>
11
12
#include < fstream>
12
13
using namespace std ;
13
14
//
14
15
GUID MarkerGuid = OA_MARKER;
15
16
GUID PublicKeyGuid = OA_PUBLIC_KEY;
16
17
GUID SlpGuid = OA_SLP10;
17
- typedef NTSTATUS (WINAPI *QuerySystemInformation)(
18
- SYSTEM_INFORMATION_CLASS SystemInformationClass,
19
- PVOID SystemInformation,
20
- ULONG SystemInformationLength,
21
- PULONG ReturnLength);
22
- QuerySystemInformation pNtQuerySystemInformation = NULL ;
23
18
//
24
- BOOL
25
- AcquirePrivilage ()
26
- {
27
- // http://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx
28
- TOKEN_PRIVILEGES NewState;
29
- LUID luid;
30
- HANDLE hToken = NULL ;
31
- //
32
- if (!OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY|TOKEN_QUERY_SOURCE, &hToken)) {
33
- CloseHandle (hToken);
34
- return FALSE ;
19
+ class InstallLib {
20
+ typedef NTSTATUS (WINAPI *QuerySystemInformation)(
21
+ SYSTEM_INFORMATION_CLASS SystemInformationClass,
22
+ PVOID SystemInformation,
23
+ ULONG SystemInformationLength,
24
+ PULONG ReturnLength);
25
+ typedef BOOL (WINAPI *nGetFirmwareType)(
26
+ PFIRMWARE_TYPE FirmwareType);
27
+ public:
28
+ InstallLib ();
29
+ ~InstallLib ();
30
+ BOOL AcquirePrivilage (VOID);
31
+ BOOL IsEFI;
32
+ private:
33
+ HMODULE hNtdll = NULL ;
34
+ HMODULE hKernel32 = NULL ;
35
+ nGetFirmwareType pGetFirmwareType = NULL ;
36
+ QuerySystemInformation pNtQuerySystemInformation = NULL ;
37
+ BOOL isEfi (VOID);
38
+ };
39
+ InstallLib::InstallLib () {
40
+ IsEFI = isEfi ();
41
+ }
42
+ InstallLib::~InstallLib () {
43
+ if (hNtdll) {
44
+ pNtQuerySystemInformation = NULL ;
45
+ FreeLibrary (hNtdll);
46
+ hNtdll = NULL ;
35
47
}
36
- if (!LookupPrivilegeValue (NULL , TEXT (" SeSystemEnvironmentPrivilege" ), &luid)) {
37
- CloseHandle (hToken);
38
- return FALSE ;
48
+ if (hKernel32) {
49
+ pGetFirmwareType = NULL ;
50
+ FreeLibrary (hKernel32);
51
+ hKernel32 = NULL ;
39
52
}
40
- NewState.PrivilegeCount = 1 ;
41
- NewState.Privileges [0 ].Luid = luid;
42
- NewState.Privileges [0 ].Attributes = SE_PRIVILEGE_ENABLED;
43
- if (!AdjustTokenPrivileges (hToken, FALSE , &NewState, sizeof (NewState), NULL , NULL )) {
53
+ }
54
+ BOOL InstallLib::AcquirePrivilage (VOID) {
55
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx
56
+ TOKEN_PRIVILEGES NewState;
57
+ LUID luid;
58
+ HANDLE hToken = NULL ;
59
+ //
60
+ if (!OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_QUERY_SOURCE, &hToken)) {
61
+ CloseHandle (hToken);
62
+ return FALSE ;
63
+ }
64
+ if (!LookupPrivilegeValue (NULL , TEXT (" SeSystemEnvironmentPrivilege" ), &luid)) {
65
+ CloseHandle (hToken);
66
+ return FALSE ;
67
+ }
68
+ NewState.PrivilegeCount = 1 ;
69
+ NewState.Privileges [0 ].Luid = luid;
70
+ NewState.Privileges [0 ].Attributes = SE_PRIVILEGE_ENABLED;
71
+ if (!AdjustTokenPrivileges (hToken, FALSE , &NewState, sizeof (NewState), NULL , NULL )) {
72
+ CloseHandle (hToken);
73
+ return FALSE ;
74
+ }
44
75
CloseHandle (hToken);
45
- return FALSE ;
76
+ return TRUE ;
46
77
}
47
- CloseHandle (hToken);
48
- return TRUE ;
49
- }
50
- //
51
- BOOL
52
- isEfi ()
53
- {
54
- UINT ret = FALSE ;
55
- DWORD buffer[5 ] = {};
56
- if (pNtQuerySystemInformation ((SYSTEM_INFORMATION_CLASS)90 , buffer, sizeof (buffer), NULL ) == 0 && buffer[4 ] == 2 ) {
57
- ret = TRUE ;
78
+ BOOL InstallLib::isEfi (VOID)
79
+ {
80
+ BOOL RetVal = FALSE ;
81
+
82
+ if (IsWindows8OrGreater ()) {
83
+ if (!hKernel32) {
84
+ hKernel32 = LoadLibrary (L" Kernel32.dll" );
85
+ }
86
+ if (hKernel32) {
87
+ pGetFirmwareType = (nGetFirmwareType)GetProcAddress (hKernel32, " GetFirmwareType" );
88
+ }
89
+ FIRMWARE_TYPE FirmwareType;
90
+ pGetFirmwareType (&FirmwareType);
91
+ RetVal = FirmwareType == FirmwareTypeUefi;
92
+ }
93
+ else if (IsWindows7OrGreater ()) {
94
+ if (!hNtdll) {
95
+ hNtdll = LoadLibrary (L" ntdll.dll" );
96
+ }
97
+ if (hNtdll) {
98
+ pNtQuerySystemInformation = (QuerySystemInformation)GetProcAddress (hNtdll, " NtQuerySystemInformation" );
99
+ }
100
+ DWORD buffer[5 ] = {};
101
+ if (pNtQuerySystemInformation ((SYSTEM_INFORMATION_CLASS)90 , buffer, sizeof (buffer), NULL ) == 0 && buffer[4 ] == 2 ) {
102
+ RetVal = TRUE ;
103
+ }
104
+ }
105
+ return RetVal;
58
106
}
59
- return ret;
60
- }
61
107
//
62
108
int _tmain (int argc, _TCHAR* argv[])
63
109
{
64
110
//
111
+ InstallLib lib;
65
112
size_t slicsize = 0 ;
66
113
int status = 0 ;
67
114
ifstream slic;
68
- HMODULE hNtdll = NULL ;
69
115
char * buffer = NULL ;
70
116
wchar_t * markerguid = NULL ;
71
117
wchar_t * publickeyguid = NULL ;
@@ -79,18 +125,10 @@ int _tmain(int argc, _TCHAR* argv[])
79
125
wcout << L" out of memory\n " ;
80
126
goto Exit;
81
127
}
82
- StringFromGUID2 (MarkerGuid, markerguid, MAX_PATH);
83
- StringFromGUID2 (PublicKeyGuid, publickeyguid, MAX_PATH);
84
- StringFromGUID2 (SlpGuid, slpguid, MAX_PATH);
128
+ status = StringFromGUID2 (MarkerGuid, markerguid, MAX_PATH);
129
+ status = StringFromGUID2 (PublicKeyGuid, publickeyguid, MAX_PATH);
130
+ status = StringFromGUID2 (SlpGuid, slpguid, MAX_PATH);
85
131
//
86
- hNtdll = LoadLibrary (L" ntdll.dll" );
87
- if (hNtdll != NULL ) {
88
- pNtQuerySystemInformation = (QuerySystemInformation) GetProcAddress (hNtdll, " NtQuerySystemInformation" );
89
- }
90
- else {
91
- wcout << L" load ntdll.dll failed\n " ;
92
- goto Exit;
93
- }
94
132
if (argc < 2 ) {
95
133
wcout << L" no arguments\n " ;
96
134
status = 1 ;
@@ -100,8 +138,8 @@ int _tmain(int argc, _TCHAR* argv[])
100
138
// delete
101
139
//
102
140
if (wcscmp (argv[1 ], L" 0" ) == 0 ) {
103
- if (isEfi () ) {
104
- AcquirePrivilage ();
141
+ if (lib. IsEFI ) {
142
+ lib. AcquirePrivilage ();
105
143
if (SetFirmwareEnvironmentVariable (TEXT (" OaMarker" ), markerguid, NULL , 0 ) != 0 ) {
106
144
wcout << L" marker successfully deleted\n " ;
107
145
}
@@ -133,8 +171,8 @@ int _tmain(int argc, _TCHAR* argv[])
133
171
// write slp string
134
172
//
135
173
else if (wcscmp (argv[1 ], L" 1" ) == 0 ) {
136
- if (isEfi () ) {
137
- AcquirePrivilage ();
174
+ if (lib. IsEFI ) {
175
+ lib. AcquirePrivilage ();
138
176
char slpstr[0x20 ] = {0 };
139
177
int len = WideCharToMultiByte (CP_ACP, 0 , argv[2 ], -1 , slpstr, 0x20 , 0 , NULL );
140
178
if (SetFirmwareEnvironmentVariable (TEXT (" OaSlp" ), slpguid, slpstr, len) != 0 ) {
@@ -176,8 +214,8 @@ int _tmain(int argc, _TCHAR* argv[])
176
214
Marker_t* marker = &slictable->Marker ;
177
215
PublicKey_t* publickey = &slictable->PublicKey ;
178
216
179
- if (isEfi () ) {
180
- AcquirePrivilage ();
217
+ if (lib. IsEFI ) {
218
+ lib. AcquirePrivilage ();
181
219
if (SetFirmwareEnvironmentVariable (TEXT (" OaMarker" ), markerguid, marker, sizeof (Marker_t)) != 0 ) {
182
220
wcout << L" marker successfully written\n " ;
183
221
}
@@ -200,11 +238,9 @@ int _tmain(int argc, _TCHAR* argv[])
200
238
}
201
239
}
202
240
Exit:
203
- if (hNtdll != NULL ) {FreeLibrary (hNtdll);}
204
241
if (markerguid != NULL ) {delete[] markerguid;};
205
242
if (publickeyguid != NULL ) {delete[] publickeyguid;};
206
243
if (slpguid != NULL ) {delete[] slpguid;}
207
244
if (buffer != NULL ) {delete[] buffer;}
208
245
return status;
209
- }
210
-
246
+ }
0 commit comments