ReactOS  0.4.15-dev-1386-g5cb9f87
versionlie.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS 'Layers' Shim library
3  * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE: Version lie shims
5  * COPYRIGHT: Copyright 2016,2017 Mark Jansen (mark.jansen@reactos.org)
6  */
7 
8 #define WIN32_NO_STATUS
9 #include <windef.h>
10 #include <winbase.h>
11 #include <shimlib.h>
12 #include <strsafe.h>
13 
14 /* Generic version info to use with the shims */
15 typedef struct VersionLieInfo
16 {
24  char szCSDVersionA[20];
27 
28 VersionLieInfo g_Win95 = { 0xC3B60004, 4, 0, 950, VER_PLATFORM_WIN32_WINDOWS, 0, 0 };
29 VersionLieInfo g_WinNT4SP5 = { 0x05650004, 4, 0, 1381, VER_PLATFORM_WIN32_NT, 5, 0 };
30 VersionLieInfo g_Win98 = { 0xC0000A04, 4, 10, 0x040A08AE, VER_PLATFORM_WIN32_WINDOWS, 0, 0 };
31 
32 VersionLieInfo g_Win2000 = { 0x08930005, 5, 0, 2195, VER_PLATFORM_WIN32_NT, 0, 0 };
33 VersionLieInfo g_Win2000SP1 = { 0x08930005, 5, 0, 2195, VER_PLATFORM_WIN32_NT, 1, 0 };
34 VersionLieInfo g_Win2000SP2 = { 0x08930005, 5, 0, 2195, VER_PLATFORM_WIN32_NT, 2, 0 };
35 VersionLieInfo g_Win2000SP3 = { 0x08930005, 5, 0, 2195, VER_PLATFORM_WIN32_NT, 3, 0 };
36 
37 VersionLieInfo g_WinXP = { 0x0a280105, 5, 1, 2600, VER_PLATFORM_WIN32_NT, 0, 0 };
38 VersionLieInfo g_WinXPSP1 = { 0x0a280105, 5, 1, 2600, VER_PLATFORM_WIN32_NT, 1, 0 };
39 VersionLieInfo g_WinXPSP2 = { 0x0a280105, 5, 1, 2600, VER_PLATFORM_WIN32_NT, 2, 0 };
40 VersionLieInfo g_WinXPSP3 = { 0x0a280105, 5, 1, 2600, VER_PLATFORM_WIN32_NT, 3, 0 };
41 
42 VersionLieInfo g_Win2k3RTM = { 0x0ece0205, 5, 2, 3790, VER_PLATFORM_WIN32_NT, 0, 0 };
43 VersionLieInfo g_Win2k3SP1 = { 0x0ece0205, 5, 2, 3790, VER_PLATFORM_WIN32_NT, 1, 0 };
44 
45 VersionLieInfo g_WinVistaRTM = { 0x17700006, 6, 0, 6000, VER_PLATFORM_WIN32_NT, 0, 0 };
46 VersionLieInfo g_WinVistaSP1 = { 0x17710006, 6, 0, 6001, VER_PLATFORM_WIN32_NT, 1, 0 };
47 VersionLieInfo g_WinVistaSP2 = { 0x17720006, 6, 0, 6002, VER_PLATFORM_WIN32_NT, 2, 0 };
48 
49 VersionLieInfo g_Win7RTM = { 0x1db00106, 6, 1, 7600, VER_PLATFORM_WIN32_NT, 0, 0 };
50 VersionLieInfo g_Win7SP1 = { 0x1db10106, 6, 1, 7601, VER_PLATFORM_WIN32_NT, 1, 0 };
51 
52 VersionLieInfo g_Win8RTM = { 0x23f00206, 6, 2, 9200, VER_PLATFORM_WIN32_NT, 0, 0 };
53 VersionLieInfo g_Win81RTM = { 0x25800306, 6, 3, 9600, VER_PLATFORM_WIN32_NT, 0, 0 };
54 
55 VersionLieInfo g_Win10RTM = { 0x47ba000a, 10, 0, 18362, VER_PLATFORM_WIN32_NT, 0, 0 };
56 
57 VersionLieInfo g_Win2k16RTM = { 0x3fab000a, 10, 0, 16299, VER_PLATFORM_WIN32_NT, 0, 0 };
58 VersionLieInfo g_Win2k19RTM = { 0x4563000a, 10, 0, 17763, VER_PLATFORM_WIN32_NT, 0, 0 };
59 
60 /* Fill the OSVERSIONINFO[EX][W|A] struct with the info from the generic VersionLieInfo */
61 
63 {
64  if (pResult->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA) || pResult->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA) ||
65  pResult->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW) || pResult->dwOSVersionInfoSize == sizeof(OSVERSIONINFOW))
66  {
67  pResult->dwMajorVersion = pFake->dwMajorVersion;
68  pResult->dwMinorVersion = pFake->dwMinorVersion;
69  pResult->dwBuildNumber = pFake->dwBuildNumber;
70  pResult->dwPlatformId = pFake->dwPlatformId;
71  if (pResult->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA) || pResult->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA))
72  {
73  if (FAILED(StringCbCopyA(pResult->szCSDVersion, sizeof(pResult->szCSDVersion), pFake->szCSDVersionA)))
74  return FALSE;
76  {
77  pResult->wServicePackMajor = pFake->wServicePackMajor;
78  pResult->wServicePackMinor = pFake->wServicePackMinor;
79  }
80  }
81  else
82  {
83  LPOSVERSIONINFOEXW pResultW = (LPOSVERSIONINFOEXW)pResult;
84  if (FAILED(StringCbCopyW(pResultW->szCSDVersion, sizeof(pResultW->szCSDVersion), pFake->szCSDVersionW)))
85  return FALSE;
87  {
88  pResultW->wServicePackMajor = pFake->wServicePackMajor;
89  pResultW->wServicePackMinor = pFake->wServicePackMinor;
90  }
91  }
92  return TRUE;
93  }
94  return FALSE;
95 }
96 
98 
99 
100 #define SHIM_NS Win95VersionLie
101 #include <setup_shim.inl>
102 
104 {
105  return g_Win95.FullVersion;
106 }
107 
108 BOOL WINAPI SHIM_OBJ_NAME(APIHook_GetVersionExA)(LPOSVERSIONINFOEXA lpOsVersionInfo)
109 {
110  if (CALL_SHIM(1, GETVERSIONEXAPROC)(lpOsVersionInfo))
111  {
112  return FakeVersion(lpOsVersionInfo, &g_Win95);
113  }
114  return FALSE;
115 }
116 
117 /* We do not call about the actual type, FakeVersion will correctly handle it either way */
118 BOOL WINAPI SHIM_OBJ_NAME(APIHook_GetVersionExW)(LPOSVERSIONINFOEXA lpOsVersionInfo)
119 {
120  if (CALL_SHIM(2, GETVERSIONEXAPROC)(lpOsVersionInfo))
121  {
122  return FakeVersion(lpOsVersionInfo, &g_Win95);
123  }
124  return FALSE;
125 }
126 
127 #define SHIM_NUM_HOOKS 3
128 #define SHIM_SETUP_HOOKS \
129  SHIM_HOOK(0, "KERNEL32.DLL", "GetVersion", SHIM_OBJ_NAME(APIHook_GetVersion)) \
130  SHIM_HOOK(1, "KERNEL32.DLL", "GetVersionExA", SHIM_OBJ_NAME(APIHook_GetVersionExA)) \
131  SHIM_HOOK(2, "KERNEL32.DLL", "GetVersionExW", SHIM_OBJ_NAME(APIHook_GetVersionExW))
132 
133 #include <implement_shim.inl>
134 
135 
136 
137 
138 #define SHIM_NS Win98VersionLie
139 #include <setup_shim.inl>
140 
141 DWORD WINAPI SHIM_OBJ_NAME(APIHook_GetVersion)()
142 {
143  return g_Win98.FullVersion;
144 }
145 
146 BOOL WINAPI SHIM_OBJ_NAME(APIHook_GetVersionExA)(LPOSVERSIONINFOEXA lpOsVersionInfo)
147 {
148  if (CALL_SHIM(0, GETVERSIONEXAPROC)(lpOsVersionInfo))
149  {
150  return FakeVersion(lpOsVersionInfo, &g_Win98);
151  }
152  return FALSE;
153 }
154 
155 /* We do not call about the actual type, FakeVersion will correctly handle it either way */
156 BOOL WINAPI SHIM_OBJ_NAME(APIHook_GetVersionExW)(LPOSVERSIONINFOEXA lpOsVersionInfo)
157 {
158  if (CALL_SHIM(1, GETVERSIONEXAPROC)(lpOsVersionInfo))
159  {
160  return FakeVersion(lpOsVersionInfo, &g_Win98);
161  }
162  return FALSE;
163 }
164 
165 #define SHIM_NUM_HOOKS 3
166 #define SHIM_SETUP_HOOKS \
167  SHIM_HOOK(2, "KERNEL32.DLL", "GetVersion", SHIM_OBJ_NAME(APIHook_GetVersion)) \
168  SHIM_HOOK(0, "KERNEL32.DLL", "GetVersionExA", SHIM_OBJ_NAME(APIHook_GetVersionExA)) \
169  SHIM_HOOK(1, "KERNEL32.DLL", "GetVersionExW", SHIM_OBJ_NAME(APIHook_GetVersionExW))
170 
171 #include <implement_shim.inl>
172 
173 
174 
175 #define SHIM_NS WinNT4SP5VersionLie
176 #define VERSION_INFO g_WinNT4SP5
177 #include "versionlie.inl"
178 
179 
180 #define SHIM_NS Win2000VersionLie
181 #define VERSION_INFO g_Win2000
182 #include "versionlie.inl"
183 
184 #define SHIM_NS Win2000SP1VersionLie
185 #define VERSION_INFO g_Win2000SP1
186 #include "versionlie.inl"
187 
188 #define SHIM_NS Win2000SP2VersionLie
189 #define VERSION_INFO g_Win2000SP2
190 #include "versionlie.inl"
191 
192 #define SHIM_NS Win2000SP3VersionLie
193 #define VERSION_INFO g_Win2000SP3
194 #include "versionlie.inl"
195 
196 
197 #define SHIM_NS WinXPVersionLie
198 #define VERSION_INFO g_WinXP
199 #include "versionlie.inl"
200 
201 #define SHIM_NS WinXPSP1VersionLie
202 #define VERSION_INFO g_WinXPSP1
203 #include "versionlie.inl"
204 
205 #define SHIM_NS WinXPSP2VersionLie
206 #define VERSION_INFO g_WinXPSP2
207 #include "versionlie.inl"
208 
209 #define SHIM_NS WinXPSP3VersionLie
210 #define VERSION_INFO g_WinXPSP3
211 #include "versionlie.inl"
212 
213 
214 #define SHIM_NS Win2k3RTMVersionLie
215 #define VERSION_INFO g_Win2k3RTM
216 #include "versionlie.inl"
217 
218 #define SHIM_NS Win2k3SP1VersionLie
219 #define VERSION_INFO g_Win2k3SP1
220 #include "versionlie.inl"
221 
222 
223 #define SHIM_NS VistaRTMVersionLie
224 #define VERSION_INFO g_WinVistaRTM
225 #include "versionlie.inl"
226 
227 #define SHIM_NS VistaSP1VersionLie
228 #define VERSION_INFO g_WinVistaSP1
229 #include "versionlie.inl"
230 
231 #define SHIM_NS VistaSP2VersionLie
232 #define VERSION_INFO g_WinVistaSP2
233 #include "versionlie.inl"
234 
235 
236 #define SHIM_NS Win7RTMVersionLie
237 #define VERSION_INFO g_Win7RTM
238 #include "versionlie.inl"
239 
240 #define SHIM_NS Win7SP1VersionLie
241 #define VERSION_INFO g_Win7SP1
242 #include "versionlie.inl"
243 
244 
245 #define SHIM_NS Win8RTMVersionLie
246 #define VERSION_INFO g_Win8RTM
247 #include "versionlie.inl"
248 
249 #define SHIM_NS Win81RTMVersionLie
250 #define VERSION_INFO g_Win81RTM
251 #include "versionlie.inl"
252 
253 
254 #define SHIM_NS Win10RTMVersionLie
255 #define VERSION_INFO g_Win10RTM
256 #include "versionlie.inl"
257 
258 
259 #define SHIM_NS Win2k16RTMVersionLie
260 #define VERSION_INFO g_Win2k16RTM
261 #include "versionlie.inl"
262 
263 
264 #define SHIM_NS Win2k19RTMVersionLie
265 #define VERSION_INFO g_Win2k19RTM
266 #include "versionlie.inl"
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:269
#define VER_PLATFORM_WIN32_NT
Definition: rtltypes.h:236
VersionLieInfo g_WinXPSP2
Definition: versionlie.c:39
VersionLieInfo g_WinVistaSP1
Definition: versionlie.c:46
VersionLieInfo g_Win98
Definition: versionlie.c:30
VersionLieInfo g_Win2k19RTM
Definition: versionlie.c:58
BOOL(WINAPI * GETVERSIONEXAPROC)(LPOSVERSIONINFOEXA)
Definition: versionlie.c:97
#define TRUE
Definition: types.h:120
VersionLieInfo g_Win95
Definition: versionlie.c:28
VersionLieInfo g_WinVistaRTM
Definition: versionlie.c:45
VersionLieInfo g_Win7RTM
Definition: versionlie.c:49
VersionLieInfo g_WinNT4SP5
Definition: versionlie.c:29
VersionLieInfo g_Win2k16RTM
Definition: versionlie.c:57
#define BOOL
Definition: nt_native.h:43
ULONG dwMajorVersion
Definition: rtltypes.h:256
VersionLieInfo g_Win2000SP1
Definition: versionlie.c:33
struct _OSVERSIONINFOEXW * LPOSVERSIONINFOEXW
DWORD FullVersion
Definition: versionlie.c:17
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
USHORT wServicePackMinor
Definition: rtltypes.h:262
WORD wServicePackMinor
Definition: versionlie.c:23
WORD wServicePackMajor
Definition: versionlie.c:22
VersionLieInfo g_Win2k3RTM
Definition: versionlie.c:42
STRSAFEAPI StringCbCopyA(STRSAFE_LPSTR pszDest, size_t cbDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:161
VersionLieInfo g_Win2000SP2
Definition: versionlie.c:34
struct VersionLieInfo VersionLieInfo
ULONG dwMinorVersion
Definition: rtltypes.h:257
VersionLieInfo g_Win7SP1
Definition: versionlie.c:50
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:255
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define WINAPI
Definition: msvc.h:6
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
WCHAR szCSDVersionW[20]
Definition: versionlie.c:25
DWORD WINAPI SHIM_OBJ_NAME() APIHook_GetVersion()
Definition: versionlie.c:103
VersionLieInfo g_WinXP
Definition: versionlie.c:37
USHORT wServicePackMajor
Definition: rtltypes.h:261
WCHAR szCSDVersion[128]
Definition: rtltypes.h:274
char szCSDVersionA[20]
Definition: versionlie.c:24
DWORD dwBuildNumber
Definition: versionlie.c:20
VersionLieInfo g_Win8RTM
Definition: versionlie.c:52
CHAR szCSDVersion[128]
Definition: rtltypes.h:260
VersionLieInfo g_Win2000SP3
Definition: versionlie.c:35
struct _OSVERSIONINFOEXA * LPOSVERSIONINFOEXA
WORD dwMinorVersion
Definition: versionlie.c:19
VersionLieInfo g_Win81RTM
Definition: versionlie.c:53
USHORT wServicePackMajor
Definition: rtltypes.h:275
BOOL FakeVersion(LPOSVERSIONINFOEXA pResult, VersionLieInfo *pFake)
Definition: versionlie.c:62
WORD dwMajorVersion
Definition: versionlie.c:18
#define VER_PLATFORM_WIN32_WINDOWS
Definition: rtltypes.h:235
VersionLieInfo g_Win10RTM
Definition: versionlie.c:55
BOOL WINAPI SHIM_OBJ_NAME() APIHook_GetVersionExW(LPOSVERSIONINFOEXA lpOsVersionInfo)
Definition: versionlie.c:118
VersionLieInfo g_WinVistaSP2
Definition: versionlie.c:47
ULONG dwPlatformId
Definition: rtltypes.h:259
WORD dwPlatformId
Definition: versionlie.c:21
VersionLieInfo g_WinXPSP3
Definition: versionlie.c:40
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
VersionLieInfo g_WinXPSP1
Definition: versionlie.c:38
ULONG dwBuildNumber
Definition: rtltypes.h:258
BOOL WINAPI SHIM_OBJ_NAME() APIHook_GetVersionExA(LPOSVERSIONINFOEXA lpOsVersionInfo)
Definition: versionlie.c:108
VersionLieInfo g_Win2k3SP1
Definition: versionlie.c:43
USHORT wServicePackMinor
Definition: rtltypes.h:276
VersionLieInfo g_Win2000
Definition: versionlie.c:32