95 lines
2.2 KiB
C++
95 lines
2.2 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2002 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
Outlook98Wizard.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This DLL hooks VerQueryValue, and will return English Language information
|
||
|
for Japanese outlook 98 setup file.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This is an app specific shim.
|
||
|
|
||
|
History:
|
||
|
|
||
|
01/21/2002 v-rbabu Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
#include "string.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(Outlook98Wizard)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(VerQueryValueA)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
/*++
|
||
|
|
||
|
The actual problem is, the outlook 98 setup is comparing the language
|
||
|
informations of the Shell32.dll and the setup file (outlwzd.exe). But
|
||
|
according to the bug scenario, the system is having English OS and Japanese
|
||
|
Locale. So, Shell32.dll have English language as its language. So, this
|
||
|
differs with the Language informaiton of Japanese Outlook setuip file.
|
||
|
|
||
|
So, setup thorows an error that the Language of the outlook 98 going to be
|
||
|
installed differs with the system language.
|
||
|
|
||
|
This stub function lie about the language information of the outlook setup
|
||
|
file. Though the setup file is Japanese as language informaiton, this shim
|
||
|
returns as if it is English.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
BOOL
|
||
|
APIHOOK(VerQueryValueA)(
|
||
|
const LPVOID pBlock,
|
||
|
LPSTR lpSubBlock,
|
||
|
LPVOID *lplpBuffer,
|
||
|
PUINT puLen
|
||
|
)
|
||
|
{
|
||
|
BOOL bRet = ORIGINAL_API(VerQueryValueA)(pBlock, lpSubBlock, lplpBuffer, puLen);
|
||
|
|
||
|
if (bRet) {
|
||
|
CSTRING_TRY
|
||
|
{
|
||
|
//
|
||
|
// If trying to get the \VarFileInfo\Translation, then assign English
|
||
|
// Language information to the output buffer.
|
||
|
//
|
||
|
CString csSubBlockString(lpSubBlock);
|
||
|
|
||
|
if (lplpBuffer && (csSubBlockString.Find(L"\\VarFileInfo\\Translation") != -1)) {
|
||
|
// Adjust the version info
|
||
|
LOGN(eDbgLevelInfo, "[VerQueryValueA] Return modified version info");
|
||
|
*lplpBuffer = L"03a40409";
|
||
|
}
|
||
|
}
|
||
|
CSTRING_CATCH
|
||
|
{
|
||
|
// Do nothing
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bRet;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
APIHOOK_ENTRY(VERSION.DLL, VerQueryValueA)
|
||
|
HOOK_END
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|