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.

209 lines
5.3 KiB

  1. /*++
  2. Copyright (c) 2002 Microsoft Corporation
  3. Module Name:
  4. VersionLieTemplate.h
  5. Abstract:
  6. Blank template for version lie shims.
  7. History:
  8. 09/05/2002 robkenny Created.
  9. --*/
  10. extern DWORD MajorVersion;
  11. extern DWORD MinorVersion;
  12. extern DWORD BuildNumber;
  13. extern SHORT SpMajorVersion;
  14. extern SHORT SpMinorVersion;
  15. extern DWORD PlatformId;
  16. extern CString * csServicePack;
  17. #define SIZE(x) sizeof(x)/sizeof(x[0])
  18. APIHOOK_ENUM_BEGIN
  19. APIHOOK_ENUM_ENTRY(GetVersionExA)
  20. APIHOOK_ENUM_ENTRY(GetVersionExW)
  21. APIHOOK_ENUM_ENTRY(GetVersion)
  22. APIHOOK_ENUM_END
  23. /*++
  24. This stub function fixes up the OSVERSIONINFO structure that is
  25. returned to the caller with the specified credentials.
  26. --*/
  27. BOOL
  28. APIHOOK(GetVersionExA)(
  29. OUT LPOSVERSIONINFOA lpVersionInformation
  30. )
  31. {
  32. BOOL bReturn = FALSE;
  33. if (ORIGINAL_API(GetVersionExA)(lpVersionInformation)) {
  34. LOGN(
  35. eDbgLevelInfo,
  36. "[GetVersionExA] called. return %d.%d %S", MajorVersion, MinorVersion, csServicePack->Get());
  37. //
  38. // Fixup the structure with the WinXP data.
  39. //
  40. lpVersionInformation->dwMajorVersion = MajorVersion;
  41. lpVersionInformation->dwMinorVersion = MinorVersion;
  42. lpVersionInformation->dwBuildNumber = BuildNumber;
  43. lpVersionInformation->dwPlatformId = PlatformId;
  44. CSTRING_TRY
  45. {
  46. if (S_OK == StringCbCopyExA(lpVersionInformation->szCSDVersion,
  47. SIZE(lpVersionInformation->szCSDVersion),
  48. csServicePack->GetAnsi(), NULL , NULL, STRSAFE_NULL_ON_FAILURE))
  49. {
  50. if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA) )
  51. {
  52. // They passed a OSVERSIONINFOEX structure.
  53. LPOSVERSIONINFOEXA osVersionInfo = (LPOSVERSIONINFOEXA)lpVersionInformation;
  54. // Set the major and minor service pack numbers.
  55. osVersionInfo->wServicePackMajor = SpMajorVersion;
  56. osVersionInfo->wServicePackMinor = SpMinorVersion;
  57. }
  58. bReturn = TRUE;
  59. }
  60. }
  61. CSTRING_CATCH
  62. {
  63. bReturn = FALSE;
  64. }
  65. }
  66. return bReturn;
  67. }
  68. /*++
  69. This stub function fixes up the OSVERSIONINFO structure that is
  70. returned to the caller with the specified credentials.
  71. --*/
  72. BOOL
  73. APIHOOK(GetVersionExW)(
  74. OUT LPOSVERSIONINFOW lpVersionInformation
  75. )
  76. {
  77. BOOL bReturn = FALSE;
  78. if (ORIGINAL_API(GetVersionExW)(lpVersionInformation)) {
  79. LOGN(
  80. eDbgLevelInfo,
  81. "[GetVersionExW] called. return %d.%d %S", MajorVersion, MinorVersion, csServicePack->Get());
  82. //
  83. // Fixup the structure with the WinXP data.
  84. //
  85. lpVersionInformation->dwMajorVersion = MajorVersion;
  86. lpVersionInformation->dwMinorVersion = MinorVersion;
  87. lpVersionInformation->dwBuildNumber = BuildNumber;
  88. lpVersionInformation->dwPlatformId = PlatformId;
  89. if (S_OK == StringCbCopyExW(lpVersionInformation->szCSDVersion,
  90. SIZE(lpVersionInformation->szCSDVersion),
  91. csServicePack->Get(), NULL , NULL, STRSAFE_NULL_ON_FAILURE))
  92. {
  93. if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW) )
  94. {
  95. // They passed a OSVERSIONINFOEX structure.
  96. LPOSVERSIONINFOEXW osVersionInfo = (LPOSVERSIONINFOEXW)lpVersionInformation;
  97. // Set the major and minor service pack numbers.
  98. osVersionInfo->wServicePackMajor = SpMajorVersion;
  99. osVersionInfo->wServicePackMinor = SpMinorVersion;
  100. }
  101. bReturn = TRUE;
  102. }
  103. }
  104. return bReturn;
  105. }
  106. /*++
  107. This stub function returns the specified credentials.
  108. --*/
  109. DWORD
  110. APIHOOK(GetVersion)(
  111. void
  112. )
  113. {
  114. DWORD dwVersion = ((PlatformId ^ 0x2) << 30) |
  115. (BuildNumber << 16) |
  116. (MinorVersion << 8) |
  117. (MajorVersion) ;
  118. LOGN(
  119. eDbgLevelInfo,
  120. "[GetVersion] called. return 0x%08x", dwVersion);
  121. return dwVersion;
  122. }
  123. BOOL
  124. NOTIFY_FUNCTION(
  125. DWORD fdwReason
  126. )
  127. {
  128. if (fdwReason == DLL_PROCESS_ATTACH)
  129. {
  130. csServicePack = new CString();
  131. if (csServicePack == NULL)
  132. {
  133. return FALSE;
  134. }
  135. CSTRING_TRY
  136. {
  137. if (SpMajorVersion > 0)
  138. {
  139. csServicePack->Format(L"Service Pack %d", SpMajorVersion);
  140. }
  141. else
  142. {
  143. *csServicePack = L"";
  144. }
  145. }
  146. CSTRING_CATCH
  147. {
  148. return FALSE;
  149. }
  150. }
  151. return TRUE;
  152. }
  153. /*++
  154. Register hooked functions
  155. --*/
  156. HOOK_BEGIN
  157. CALL_NOTIFY_FUNCTION
  158. APIHOOK_ENTRY(KERNEL32.DLL, GetVersionExA)
  159. APIHOOK_ENTRY(KERNEL32.DLL, GetVersionExW)
  160. APIHOOK_ENTRY(KERNEL32.DLL, GetVersion)
  161. HOOK_END