Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

284 lines
8.7 KiB

  1. /*++
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4. HighVersionLie.cpp
  5. Abstract:
  6. This DLL hooks GetVersion and GetVersionEx so that they return a future OS
  7. version credentials.
  8. Notes:
  9. This is a general purpose shim.
  10. History:
  11. 02/08/2001 clupu Created
  12. 09/21/2001 rparsons Added VLOG on hooks per billshih.
  13. 10/17/2001 rparsons Fixed bugs in GetVersionExW and GetVersion.
  14. 11/27/2001 rparsons Modified the VLOGs so they display what we
  15. used for the API call.
  16. 02/20/2002 rparsons Implemented strsafe functions.
  17. --*/
  18. #include "precomp.h"
  19. IMPLEMENT_SHIM_BEGIN(HighVersionLie)
  20. #include "ShimHookMacro.h"
  21. BEGIN_DEFINE_VERIFIER_LOG(HighVersionLie)
  22. VERIFIER_LOG_ENTRY(VLOG_HIGHVERSION_GETVERSION)
  23. VERIFIER_LOG_ENTRY(VLOG_HIGHVERSION_GETVERSIONEX)
  24. END_DEFINE_VERIFIER_LOG(HighVersionLie)
  25. INIT_VERIFIER_LOG(HighVersionLie);
  26. APIHOOK_ENUM_BEGIN
  27. APIHOOK_ENUM_ENTRY(GetVersionExA)
  28. APIHOOK_ENUM_ENTRY(GetVersionExW)
  29. APIHOOK_ENUM_ENTRY(GetVersion)
  30. APIHOOK_ENUM_END
  31. DWORD g_dwMajorVersion;
  32. DWORD g_dwMinorVersion;
  33. DWORD g_dwBuildNumber;
  34. BOOL
  35. APIHOOK(GetVersionExA)(
  36. OUT LPOSVERSIONINFOA lpVersionInformation
  37. )
  38. {
  39. BOOL bReturn = FALSE;
  40. if (ORIGINAL_API(GetVersionExA)(lpVersionInformation)) {
  41. LOGN(eDbgLevelInfo,
  42. "[GetVersionExA] called. Returning %lu.%lu build %lu",
  43. g_dwMajorVersion,
  44. g_dwMinorVersion,
  45. g_dwBuildNumber);
  46. VLOG(VLOG_LEVEL_INFO,
  47. VLOG_HIGHVERSION_GETVERSIONEX,
  48. "Returned %lu.%lu build number %lu.",
  49. g_dwMajorVersion,
  50. g_dwMinorVersion,
  51. g_dwBuildNumber);
  52. lpVersionInformation->dwMajorVersion = g_dwMajorVersion;
  53. lpVersionInformation->dwMinorVersion = g_dwMinorVersion;
  54. lpVersionInformation->dwBuildNumber = g_dwBuildNumber;
  55. lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;
  56. *lpVersionInformation->szCSDVersion = '\0';
  57. bReturn = TRUE;
  58. }
  59. return bReturn;
  60. }
  61. BOOL
  62. APIHOOK(GetVersionExW)(
  63. OUT LPOSVERSIONINFOW lpVersionInformation
  64. )
  65. {
  66. BOOL bReturn = FALSE;
  67. if (ORIGINAL_API(GetVersionExW)(lpVersionInformation)) {
  68. LOGN(eDbgLevelInfo,
  69. "[GetVersionExW] called. Returning %lu.%lu build %lu",
  70. g_dwMajorVersion,
  71. g_dwMinorVersion,
  72. g_dwBuildNumber);
  73. VLOG(VLOG_LEVEL_INFO,
  74. VLOG_HIGHVERSION_GETVERSIONEX,
  75. "Returned %lu.%lu build number %lu.",
  76. g_dwMajorVersion,
  77. g_dwMinorVersion,
  78. g_dwBuildNumber);
  79. lpVersionInformation->dwMajorVersion = g_dwMajorVersion;
  80. lpVersionInformation->dwMinorVersion = g_dwMinorVersion;
  81. lpVersionInformation->dwBuildNumber = g_dwBuildNumber;
  82. lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;
  83. *lpVersionInformation->szCSDVersion = L'\0';
  84. bReturn = TRUE;
  85. }
  86. return bReturn;
  87. }
  88. DWORD
  89. APIHOOK(GetVersion)(
  90. void
  91. )
  92. {
  93. LOGN(eDbgLevelInfo,
  94. "[GetVersion] called. Returning %lu.%lu build %lu",
  95. g_dwMajorVersion,
  96. g_dwMinorVersion,
  97. g_dwBuildNumber);
  98. VLOG(VLOG_LEVEL_INFO,
  99. VLOG_HIGHVERSION_GETVERSION,
  100. "Returned %lu.%lu build number %lu.",
  101. g_dwMajorVersion,
  102. g_dwMinorVersion,
  103. g_dwBuildNumber);
  104. return (((VER_PLATFORM_WIN32_NT ^ 0x2) << 30) |
  105. (g_dwBuildNumber << 16) |
  106. (g_dwMinorVersion << 8) |
  107. g_dwMajorVersion);
  108. }
  109. INT_PTR CALLBACK
  110. DlgOptions(
  111. HWND hDlg,
  112. UINT message,
  113. WPARAM wParam,
  114. LPARAM lParam
  115. )
  116. {
  117. static LPCWSTR szExeName;
  118. switch (message) {
  119. case WM_INITDIALOG:
  120. {
  121. WCHAR szTemp[20];
  122. //
  123. // Limit the number of characters for each edit control.
  124. //
  125. SendDlgItemMessage(hDlg, IDC_HVL_EDIT_MAJOR_VERSION, EM_LIMITTEXT, (WPARAM)5, 0);
  126. SendDlgItemMessage(hDlg, IDC_HVL_EDIT_MINOR_VERSION, EM_LIMITTEXT, (WPARAM)5, 0);
  127. SendDlgItemMessage(hDlg, IDC_HVL_EDIT_BUILD_NUMBER, EM_LIMITTEXT, (WPARAM)5, 0);
  128. //
  129. // find out what exe we're handling settings for
  130. //
  131. szExeName = ExeNameFromLParam(lParam);
  132. g_dwMajorVersion = GetShimSettingDWORD(L"HighVersionLie", szExeName, L"MajorVersion", 7);
  133. g_dwMinorVersion = GetShimSettingDWORD(L"HighVersionLie", szExeName, L"MinorVersion", 2);
  134. g_dwBuildNumber = GetShimSettingDWORD(L"HighVersionLie", szExeName, L"BuildNumber", 3595);
  135. StringCchPrintf(szTemp, ARRAYSIZE(szTemp), L"%d", g_dwMajorVersion);
  136. SetDlgItemText(hDlg, IDC_HVL_EDIT_MAJOR_VERSION, szTemp);
  137. StringCchPrintf(szTemp, ARRAYSIZE(szTemp), L"%d", g_dwMinorVersion);
  138. SetDlgItemText(hDlg, IDC_HVL_EDIT_MINOR_VERSION, szTemp);
  139. StringCchPrintf(szTemp, ARRAYSIZE(szTemp), L"%d", g_dwBuildNumber);
  140. SetDlgItemText(hDlg, IDC_HVL_EDIT_BUILD_NUMBER, szTemp);
  141. return TRUE;
  142. }
  143. break;
  144. case WM_COMMAND:
  145. switch (LOWORD(wParam)) {
  146. case IDC_HVL_BTN_DEFAULT:
  147. {
  148. WCHAR szTemp[20];
  149. g_dwMajorVersion = 7;
  150. g_dwMinorVersion = 2;
  151. g_dwBuildNumber = 3595;
  152. //
  153. // Limit the number of characters for each edit control.
  154. //
  155. SendDlgItemMessage(hDlg, IDC_HVL_EDIT_MAJOR_VERSION, EM_LIMITTEXT, (WPARAM)5, 0);
  156. SendDlgItemMessage(hDlg, IDC_HVL_EDIT_MINOR_VERSION, EM_LIMITTEXT, (WPARAM)5, 0);
  157. SendDlgItemMessage(hDlg, IDC_HVL_EDIT_BUILD_NUMBER, EM_LIMITTEXT, (WPARAM)5, 0);
  158. StringCchPrintf(szTemp, ARRAYSIZE(szTemp), L"%d", g_dwMajorVersion);
  159. SetDlgItemText(hDlg, IDC_HVL_EDIT_MAJOR_VERSION, szTemp);
  160. StringCchPrintf(szTemp, ARRAYSIZE(szTemp), L"%d", g_dwMinorVersion);
  161. SetDlgItemText(hDlg, IDC_HVL_EDIT_MINOR_VERSION, szTemp);
  162. StringCchPrintf(szTemp, ARRAYSIZE(szTemp), L"%d", g_dwBuildNumber);
  163. SetDlgItemText(hDlg, IDC_HVL_EDIT_BUILD_NUMBER, szTemp);
  164. break;
  165. }
  166. }
  167. break;
  168. case WM_NOTIFY:
  169. switch (((NMHDR FAR *) lParam)->code) {
  170. case PSN_APPLY:
  171. g_dwMajorVersion = GetDlgItemInt(hDlg, IDC_HVL_EDIT_MAJOR_VERSION, NULL, FALSE);
  172. g_dwMinorVersion = GetDlgItemInt(hDlg, IDC_HVL_EDIT_MINOR_VERSION, NULL, FALSE);
  173. g_dwBuildNumber = GetDlgItemInt(hDlg, IDC_HVL_EDIT_BUILD_NUMBER, NULL, FALSE);
  174. SaveShimSettingDWORD(L"HighVersionLie", szExeName, L"MajorVersion", g_dwMajorVersion);
  175. SaveShimSettingDWORD(L"HighVersionLie", szExeName, L"MinorVersion", g_dwMinorVersion);
  176. SaveShimSettingDWORD(L"HighVersionLie", szExeName, L"BuildNumber", g_dwBuildNumber);
  177. break;
  178. }
  179. break;
  180. }
  181. return FALSE;
  182. }
  183. SHIM_INFO_BEGIN()
  184. SHIM_INFO_DESCRIPTION(AVS_HIGHVERSIONLIE_DESC)
  185. SHIM_INFO_FRIENDLY_NAME(AVS_HIGHVERSIONLIE_FRIENDLY)
  186. SHIM_INFO_VERSION(1, 4)
  187. SHIM_INFO_FLAGS(0)
  188. SHIM_INFO_INCLUDE_EXCLUDE("I:msi.dll E:msvcrt.dll msvcirt.dll oleaut32.dll")
  189. SHIM_INFO_OPTIONS_PAGE(IDD_HIGHVERSION_OPTIONS, DlgOptions)
  190. SHIM_INFO_END()
  191. /*++
  192. Register hooked functions
  193. --*/
  194. HOOK_BEGIN
  195. if (fdwReason == DLL_PROCESS_ATTACH) {
  196. //
  197. // get the settings
  198. //
  199. WCHAR szExe[100];
  200. GetCurrentExeName(szExe, 100);
  201. g_dwMajorVersion = GetShimSettingDWORD(L"HighVersionLie", szExe, L"MajorVersion", 7);
  202. g_dwMinorVersion = GetShimSettingDWORD(L"HighVersionLie", szExe, L"MinorVersion", 2);
  203. g_dwBuildNumber = GetShimSettingDWORD(L"HighVersionLie", szExe, L"BuildNumber", 3595);
  204. DUMP_VERIFIER_LOG_ENTRY(VLOG_HIGHVERSION_GETVERSION,
  205. AVS_HIGHVERSION_GETVERSION,
  206. AVS_HIGHVERSION_GETVERSION_R,
  207. AVS_HIGHVERSION_GETVERSION_URL)
  208. DUMP_VERIFIER_LOG_ENTRY(VLOG_HIGHVERSION_GETVERSIONEX,
  209. AVS_HIGHVERSION_GETVERSIONEX,
  210. AVS_HIGHVERSION_GETVERSIONEX_R,
  211. AVS_HIGHVERSION_GETVERSIONEX_URL)
  212. }
  213. APIHOOK_ENTRY(KERNEL32.DLL, GetVersionExA)
  214. APIHOOK_ENTRY(KERNEL32.DLL, GetVersionExW)
  215. APIHOOK_ENTRY(KERNEL32.DLL, GetVersion)
  216. HOOK_END
  217. IMPLEMENT_SHIM_END