Skip to content

Commit f7954d9

Browse files
author
untermensch
committed
fix Windows 7 compatability, remove depreciated GetVersion()
1 parent bf14d18 commit f7954d9

File tree

2 files changed

+103
-74
lines changed

2 files changed

+103
-74
lines changed

LicenseData/LicenseData.cpp

+95-59
Original file line numberDiff line numberDiff line change
@@ -7,65 +7,111 @@
77
//
88
#include "stdafx.h"
99
#include "LicenseData.h"
10+
#include <VersionHelpers.h>
1011
#include <iostream>
1112
#include <fstream>
1213
using namespace std;
1314
//
1415
GUID MarkerGuid = OA_MARKER;
1516
GUID PublicKeyGuid = OA_PUBLIC_KEY;
1617
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;
2318
//
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;
3547
}
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;
3952
}
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+
}
4475
CloseHandle(hToken);
45-
return FALSE;
76+
return TRUE;
4677
}
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;
58106
}
59-
return ret;
60-
}
61107
//
62108
int _tmain(int argc, _TCHAR* argv[])
63109
{
64110
//
111+
InstallLib lib;
65112
size_t slicsize = 0;
66113
int status = 0;
67114
ifstream slic;
68-
HMODULE hNtdll = NULL;
69115
char* buffer = NULL;
70116
wchar_t* markerguid = NULL;
71117
wchar_t* publickeyguid = NULL;
@@ -79,18 +125,10 @@ int _tmain(int argc, _TCHAR* argv[])
79125
wcout << L"out of memory\n";
80126
goto Exit;
81127
}
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);
85131
//
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-
}
94132
if(argc < 2) {
95133
wcout << L"no arguments\n";
96134
status = 1;
@@ -100,8 +138,8 @@ int _tmain(int argc, _TCHAR* argv[])
100138
// delete
101139
//
102140
if (wcscmp(argv[1], L"0") == 0) {
103-
if (isEfi()) {
104-
AcquirePrivilage();
141+
if (lib.IsEFI) {
142+
lib.AcquirePrivilage();
105143
if (SetFirmwareEnvironmentVariable(TEXT("OaMarker"), markerguid, NULL, 0) != 0) {
106144
wcout << L"marker successfully deleted\n";
107145
}
@@ -133,8 +171,8 @@ int _tmain(int argc, _TCHAR* argv[])
133171
// write slp string
134172
//
135173
else if(wcscmp(argv[1], L"1") == 0 ) {
136-
if(isEfi()) {
137-
AcquirePrivilage();
174+
if(lib.IsEFI) {
175+
lib.AcquirePrivilage();
138176
char slpstr[0x20] = {0};
139177
int len = WideCharToMultiByte(CP_ACP, 0, argv[2], -1, slpstr, 0x20, 0, NULL);
140178
if (SetFirmwareEnvironmentVariable(TEXT("OaSlp"), slpguid, slpstr, len) != 0) {
@@ -176,8 +214,8 @@ int _tmain(int argc, _TCHAR* argv[])
176214
Marker_t* marker = &slictable->Marker;
177215
PublicKey_t* publickey = &slictable->PublicKey;
178216

179-
if (isEfi()) {
180-
AcquirePrivilage();
217+
if (lib.IsEFI) {
218+
lib.AcquirePrivilage();
181219
if (SetFirmwareEnvironmentVariable(TEXT("OaMarker"), markerguid, marker, sizeof(Marker_t)) != 0) {
182220
wcout << L"marker successfully written\n";
183221
}
@@ -200,11 +238,9 @@ int _tmain(int argc, _TCHAR* argv[])
200238
}
201239
}
202240
Exit:
203-
if(hNtdll != NULL) {FreeLibrary(hNtdll);}
204241
if(markerguid != NULL) {delete[] markerguid;};
205242
if(publickeyguid != NULL) {delete[] publickeyguid;};
206243
if(slpguid != NULL) {delete[] slpguid;}
207244
if(buffer != NULL) {delete[] buffer;}
208245
return status;
209-
}
210-
246+
}

libinstaller/libinstaller.cpp

+8-15
Original file line numberDiff line numberDiff line change
@@ -695,31 +695,24 @@ BOOL
695695
return TRUE;
696696
}
697697
//
698-
BOOL
699-
isEfi(VOID)
698+
BOOL
699+
isEfi(VOID)
700700
{
701701
BOOL RetVal = FALSE;
702-
DWORD dwPInfo = NULL;
703-
DWORD dwVersion = NULL;
704-
DWORD dwMajorVersion = NULL;
705-
DWORD dwMinorVersion = NULL;
706-
dwVersion = GetVersion();
707-
dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
708-
dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
709702
if (!InitLib(TRUE)) {
710703
return RetVal;
711704
}
712-
if (dwMajorVersion == 6 || dwMinorVersion == 1) {
705+
if (IsWindows8OrGreater()) {
706+
FIRMWARE_TYPE FirmwareType;
707+
pGetFirmwareType(&FirmwareType);
708+
RetVal = FirmwareType == FirmwareTypeUefi;
709+
}
710+
else if (IsWindows7OrGreater()) {
713711
DWORD buffer[5] = {};
714712
if (pNtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)90, buffer, sizeof(buffer), NULL) == 0 && buffer[4] == 2) {
715713
RetVal = TRUE;
716714
}
717715
}
718-
else if (IsWindows8OrGreater()) {
719-
FIRMWARE_TYPE FirmwareType;
720-
pGetFirmwareType(&FirmwareType);
721-
RetVal = FirmwareType == FirmwareTypeUefi;
722-
}
723716
return RetVal;
724717
}
725718
//

0 commit comments

Comments
 (0)