/*++ Copyright (c) 2002 Microsoft Corporation Module Name: VersionLieTemplate.h Abstract: Blank template for version lie shims. History: 09/05/2002 robkenny Created. --*/ extern DWORD MajorVersion; extern DWORD MinorVersion; extern DWORD BuildNumber; extern SHORT SpMajorVersion; extern SHORT SpMinorVersion; extern DWORD PlatformId; extern CString * csServicePack; #define SIZE(x) sizeof(x)/sizeof(x[0]) APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(GetVersionExA) APIHOOK_ENUM_ENTRY(GetVersionExW) APIHOOK_ENUM_ENTRY(GetVersion) APIHOOK_ENUM_END /*++ This stub function fixes up the OSVERSIONINFO structure that is returned to the caller with the specified credentials. --*/ BOOL APIHOOK(GetVersionExA)( OUT LPOSVERSIONINFOA lpVersionInformation ) { BOOL bReturn = FALSE; if (ORIGINAL_API(GetVersionExA)(lpVersionInformation)) { LOGN( eDbgLevelInfo, "[GetVersionExA] called. return %d.%d %S", MajorVersion, MinorVersion, csServicePack->Get()); // // Fixup the structure with the WinXP data. // lpVersionInformation->dwMajorVersion = MajorVersion; lpVersionInformation->dwMinorVersion = MinorVersion; lpVersionInformation->dwBuildNumber = BuildNumber; lpVersionInformation->dwPlatformId = PlatformId; CSTRING_TRY { if (S_OK == StringCbCopyExA(lpVersionInformation->szCSDVersion, SIZE(lpVersionInformation->szCSDVersion), csServicePack->GetAnsi(), NULL , NULL, STRSAFE_NULL_ON_FAILURE)) { if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA) ) { // They passed a OSVERSIONINFOEX structure. LPOSVERSIONINFOEXA osVersionInfo = (LPOSVERSIONINFOEXA)lpVersionInformation; // Set the major and minor service pack numbers. osVersionInfo->wServicePackMajor = SpMajorVersion; osVersionInfo->wServicePackMinor = SpMinorVersion; } bReturn = TRUE; } } CSTRING_CATCH { bReturn = FALSE; } } return bReturn; } /*++ This stub function fixes up the OSVERSIONINFO structure that is returned to the caller with the specified credentials. --*/ BOOL APIHOOK(GetVersionExW)( OUT LPOSVERSIONINFOW lpVersionInformation ) { BOOL bReturn = FALSE; if (ORIGINAL_API(GetVersionExW)(lpVersionInformation)) { LOGN( eDbgLevelInfo, "[GetVersionExW] called. return %d.%d %S", MajorVersion, MinorVersion, csServicePack->Get()); // // Fixup the structure with the WinXP data. // lpVersionInformation->dwMajorVersion = MajorVersion; lpVersionInformation->dwMinorVersion = MinorVersion; lpVersionInformation->dwBuildNumber = BuildNumber; lpVersionInformation->dwPlatformId = PlatformId; if (S_OK == StringCbCopyExW(lpVersionInformation->szCSDVersion, SIZE(lpVersionInformation->szCSDVersion), csServicePack->Get(), NULL , NULL, STRSAFE_NULL_ON_FAILURE)) { if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW) ) { // They passed a OSVERSIONINFOEX structure. LPOSVERSIONINFOEXW osVersionInfo = (LPOSVERSIONINFOEXW)lpVersionInformation; // Set the major and minor service pack numbers. osVersionInfo->wServicePackMajor = SpMajorVersion; osVersionInfo->wServicePackMinor = SpMinorVersion; } bReturn = TRUE; } } return bReturn; } /*++ This stub function returns the specified credentials. --*/ DWORD APIHOOK(GetVersion)( void ) { DWORD dwVersion = ((PlatformId ^ 0x2) << 30) | (BuildNumber << 16) | (MinorVersion << 8) | (MajorVersion) ; LOGN( eDbgLevelInfo, "[GetVersion] called. return 0x%08x", dwVersion); return dwVersion; } BOOL NOTIFY_FUNCTION( DWORD fdwReason ) { if (fdwReason == DLL_PROCESS_ATTACH) { csServicePack = new CString(); if (csServicePack == NULL) { return FALSE; } CSTRING_TRY { if (SpMajorVersion > 0) { csServicePack->Format(L"Service Pack %d", SpMajorVersion); } else { *csServicePack = L""; } } CSTRING_CATCH { return FALSE; } } return TRUE; } /*++ Register hooked functions --*/ HOOK_BEGIN CALL_NOTIFY_FUNCTION APIHOOK_ENTRY(KERNEL32.DLL, GetVersionExA) APIHOOK_ENTRY(KERNEL32.DLL, GetVersionExW) APIHOOK_ENTRY(KERNEL32.DLL, GetVersion) HOOK_END