[UDFS] Explicitly mention the license (GPLv2).
[reactos.git] / reactos / drivers / filesystems / udfs / Include / protect_user_mode.cpp
1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3 // All rights reserved
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
6
7 //#define EVALUATION_TIME_LIMIT
8
9 #ifdef EVALUATION_TIME_LIMIT
10
11 #define VAR_SAVED(preff, n) Var##preff##n##Saved
12
13 #define KEY(preff, n) preff##n##Key
14 #define VAL(preff, n) preff##n##Val
15
16 #define CheckAndSave(preff, n, val, type) \
17 if (!VAR_SAVED(##preff, ##n)) { \
18 if (##type==1) \
19 RegisterDword(KEY(##preff,##n),VAL(##preff,##n),##val ^ XOR_VAR(##preff, ##n) ); \
20 else { \
21 szTemp[16]; \
22 sprintf(szTemp,"0x%08x", ##val ^ XOR_VAR(##preff, ##n)); \
23 RegisterString(KEY(##preff,##n),VAL(##preff,##n), &szTemp[0], FALSE, 0); \
24 }\
25 VAR_SAVED(##preff, ##n) = TRUE; \
26 }
27
28 #define RegisterTrialEnd() \
29 CheckAndSave(TrialEnd, 0, 1, 1); \
30 CheckAndSave(TrialEnd, 1, 1, 1);
31
32 #define ClearTrialEnd() \
33 CheckAndSave(TrialEnd, 0, 0, 1); \
34 CheckAndSave(TrialEnd, 1, 0, 1);
35
36 #define RegisterDate() \
37 CheckAndSave(Date, 0, dwDaysSince2003, 0); \
38 CheckAndSave(Date, 1, dwDaysSince2003, 0);
39
40 #define RegisterVersion() \
41 CheckAndSave(Version, 0, UDF_CURRENT_BUILD, 0); \
42 CheckAndSave(Version, 1, UDF_CURRENT_BUILD, 1);
43
44 #define PATH_VAR_DECL(preff, n) \
45 CHAR KEY(preff, n)[256], VAL(preff, n)[64]; \
46 BOOL VAR_SAVED(preff, n) = FALSE;
47
48
49 #define GET_KEY_DATE(n) GET_DATE_REG_KEY_NAME(Date##n##Key, ##n)
50 #define GET_VAL_DATE(n) GET_DATE_REG_VAL_NAME(Date##n##Val, ##n)
51
52 #define GET_KEY_VERSION(n) GET_VERSION_REG_KEY_NAME(Version##n##Key, ##n)
53 #define GET_VAL_VERSION(n) GET_VERSION_REG_VAL_NAME(Version##n##Val, ##n)
54
55 #define GET_KEY_TRIAL(n) GET_TRIAL_REG_KEY_NAME(TrialEnd##n##Key, ##n)
56 #define GET_VAL_TRIAL(n) GET_TRIAL_REG_VAL_NAME(TrialEnd##n##Val, ##n)
57
58 CHAR szTemp[16];
59 ULONG dwDaysSince2003, dwDaysSince2003fromReg0 = 0, dwDaysSince2003fromReg1 = 0;
60 ULONG TrialEnd0, TrialEnd1;
61 ULONG Version0 = 0, Version1 = 0;
62 SYSTEMTIME SystemTime, SystemTime2003;
63 FILETIME FileTime, FileTime2003;
64 ULARGE_INTEGER Time, Time2003;
65
66
67 #define INCLUDE_XOR_DECL_ONLY
68 #include "protect.h"
69 #undef INCLUDE_XOR_DECL_ONLY
70
71 PATH_VAR_DECL(Date, 0);
72 PATH_VAR_DECL(Date, 1);
73 PATH_VAR_DECL(Version, 0);
74 PATH_VAR_DECL(Version, 1);
75 PATH_VAR_DECL(TrialEnd, 0);
76 PATH_VAR_DECL(TrialEnd, 1);
77
78 GET_KEY_TRIAL(0);
79 GET_VAL_TRIAL(1);
80
81 #ifndef NO_KEY_PRESENCE_CHECK
82 CHAR Key[17];
83 if (GetRegString(UDF_SERVICE_PATH,UDF_LICENSE_KEY_USER,Key, sizeof(Key))) {
84 goto LicenseKeyPresent;
85 }
86 #endif // NO_KEY_PRESENCE_CHECK
87
88 GetSystemTime(&SystemTime);
89 SystemTimeToFileTime(&SystemTime, &FileTime);
90 memset(&SystemTime2003, 0, sizeof(SystemTime2003));
91 SystemTime2003.wYear = 2003;
92
93 GET_KEY_DATE(0);
94 GET_VAL_DATE(0);
95 GET_KEY_VERSION(0);
96
97 SystemTime2003.wMonth = 1;
98 SystemTime2003.wDay = 1;
99
100 GET_VAL_VERSION(1);
101
102 SystemTimeToFileTime(&SystemTime2003, &FileTime2003);
103
104 memcpy(&Time , &FileTime, sizeof(ULARGE_INTEGER));
105 memcpy(&Time2003, &FileTime2003, sizeof(ULARGE_INTEGER));
106 Time.QuadPart -= Time2003.QuadPart;
107
108 GET_KEY_TRIAL(1);
109 GET_VAL_TRIAL(0);
110
111 dwDaysSince2003 = (ULONG)(Time.QuadPart/10000000I64/3600/24);
112
113 GET_KEY_DATE(1);
114 GET_VAL_VERSION(0);
115 GET_KEY_VERSION(1);
116
117 if (GetRegString(KEY(Version, 0), VAL(Version, 0),&szTemp[0], sizeof(szTemp))) {
118 sscanf(szTemp,"0x%08x", &Version0);
119 Version0 ^= XOR_VAR(Version,0);
120 }
121
122 GET_VAL_DATE(1);
123
124 if (GetRegUlong(KEY(Version, 1), VAL(Version, 1),&Version1)) {
125 Version1 ^= XOR_VAR(Version,1);
126 }
127
128 if (Version0 < UDF_CURRENT_BUILD && Version1 < UDF_CURRENT_BUILD) {
129 RegisterVersion();
130 ClearTrialEnd();
131 RegisterDate();
132 return 1;
133 }
134
135 if ((LONGLONG)(Time.QuadPart) < 0 ||
136 GetRegUlong(KEY(TrialEnd, 0), VAL(TrialEnd, 0),&TrialEnd0) && (TrialEnd0 ^ XOR_VAR(TrialEnd, 0)) != 0 ||
137 GetRegUlong(KEY(TrialEnd, 1), VAL(TrialEnd, 1),&TrialEnd1) && (TrialEnd1 ^ XOR_VAR(TrialEnd, 1)) != 0) {
138 RegisterTrialEnd();
139 #ifndef NO_MESSAGE_BOXES
140 if (MyMessageBox(hInst,
141 GetDesktopWindow(),
142 MAKEINTRESOURCE(IDS_EXPIRED_TEXT),
143 MAKEINTRESOURCE(IDS_EXPIRED), MB_YESNO | MB_ICONQUESTION) == IDYES) goto EnterRegistration;
144
145 #endif // NO_MESSAGE_BOXES
146 return 0;
147 }
148
149 if (GetRegString(KEY(Date, 0), VAL(Date, 0),&szTemp[0], sizeof(szTemp))) {
150 sscanf(szTemp,"0x%08x", &dwDaysSince2003fromReg0);
151 dwDaysSince2003fromReg0 ^= XOR_VAR(Date,0);
152 }
153
154 if (GetRegString(KEY(Date, 1), VAL(Date, 1),&szTemp[0], sizeof(szTemp))) {
155 sscanf(szTemp,"0x%08x", &dwDaysSince2003fromReg1);
156 dwDaysSince2003fromReg1 ^= XOR_VAR(Date,1);
157 }
158
159 if (dwDaysSince2003fromReg1 > dwDaysSince2003fromReg0) dwDaysSince2003fromReg0 = dwDaysSince2003fromReg1;
160
161 if (!dwDaysSince2003fromReg0 && !dwDaysSince2003fromReg1) {
162 RegisterDate();
163 dwDaysSince2003fromReg0 = dwDaysSince2003;
164 } else if (!dwDaysSince2003fromReg0) {
165 CheckAndSave(Date, 0, dwDaysSince2003fromReg1, 0);
166 dwDaysSince2003fromReg0 = dwDaysSince2003fromReg1;
167 } else if (!dwDaysSince2003fromReg1) {
168 CheckAndSave(Date, 1, dwDaysSince2003fromReg0, 0);
169 }
170
171 if(dwDaysSince2003 - dwDaysSince2003fromReg0 > EVALUATION_TERM || dwDaysSince2003 < dwDaysSince2003fromReg0 ||
172 dwDaysSince2003 > UDF_MAX_DATE ||
173 dwDaysSince2003 < UDF_MIN_DATE) {
174 RegisterTrialEnd();
175 #ifndef NO_MESSAGE_BOXES
176 if (MyMessageBox(hInst,
177 GetDesktopWindow(),
178 MAKEINTRESOURCE(IDS_EXPIRED_TEXT),
179 MAKEINTRESOURCE(IDS_EXPIRED), MB_YESNO | MB_ICONQUESTION) == IDYES) goto EnterRegistration;
180
181 #endif // NO_MESSAGE_BOXES
182 return 0;
183 }
184
185 #endif EVALUATION_TIME_LIMIT