windows-nt/Source/XPSP1/NT/windows/appcompat/shims/specific/schoolhouserockmath.cpp
2020-09-26 16:20:57 +08:00

256 lines
6.7 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
SchoolHouseRockMath.cpp
Abstract:
This shim directs the install to look in the _InstallTo16 and
_InstallFrom16 sections of setup.inf instead of _InstallFrom32 and
_InstallTo32. This is needed because the application tries to use a 16-bit
DLL during gameplay which is allowed in Win9x but produces errors under
Whistler.
History:
10/18/2000 jdoherty Created
--*/
#include "precomp.h"
// This module has been given an official blessing to use the str routines.
#include "LegalStr.h"
IMPLEMENT_SHIM_BEGIN(SchoolHouseRockMath)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(GetPrivateProfileStringA)
APIHOOK_ENUM_ENTRY(GetPrivateProfileStringW)
APIHOOK_ENUM_ENTRY(GetProfileStringA)
APIHOOK_ENUM_ENTRY(GetProfileStringW)
APIHOOK_ENUM_END
/*++
This stub function breaks into GetPrivateProfileString and checks to see the section lpAppName
being referred to is one of the sections in question.
--*/
DWORD
APIHOOK(GetPrivateProfileStringA)(
LPCSTR lpAppName,
LPCSTR lpKeyName,
LPCSTR lpDefault,
LPSTR lpReturnedString,
DWORD nSize,
LPCSTR lpFileName
)
{
DWORD dRet;
int iArraySize = 2;
// The following array specifies what sections to look for and what to
// replace them with when calling GetPrivateProfileString
CHAR *szAppNames[] = {"_INSTALLTO32", "_INSTALLFROM32"};
CHAR *szNewAppNames[] = {"_INSTALLTO16", "_INSTALLFROM16"};
for (int i = 0; i < iArraySize; i++)
{
// Find out if one of the known section names is lpAppName
// if so change lpAppName parameter to new parameter and call API
if ((stristr (szAppNames[i], lpAppName) !=NULL ))
{
return ORIGINAL_API(GetPrivateProfileStringA)(
szNewAppNames[i],
lpKeyName,
lpDefault,
lpReturnedString,
nSize,
lpFileName
);
}
}
return ORIGINAL_API(GetPrivateProfileStringA)(
lpAppName,
lpKeyName,
lpDefault,
lpReturnedString,
nSize,
lpFileName
);
}
/*++
This stub function breaks into GetPrivateProfileString and checks to see the section lpAppName
being referred to is one of the sections in question.
--*/
DWORD
WINAPI
APIHOOK(GetPrivateProfileStringW)(
LPCWSTR lpAppName,
LPCWSTR lpKeyName,
LPCWSTR lpDefault,
LPWSTR lpReturnedString,
DWORD nSize,
LPCWSTR lpFileName
)
{
DWORD dRet;
int iArraySize = 2;
// The following array specifies what sections to look for and what to
// replace them with when calling GetPrivateProfileString
WCHAR *wszAppNames[] = {L"_INSTALLTO32", L"_INSTALLFROM32"};
WCHAR *wszNewAppNames[] = {L"_INSTALLTO16", L"_INSTALLFROM16"};
for (int i = 0; i < iArraySize; i++)
{
// Find out if one of the known section names is lpAppName
// if so change lpAppName parameter to new parameter and call API
if (wcsistr (lpAppName, wszAppNames[i]) != NULL)
{
return ORIGINAL_API(GetPrivateProfileStringW)(
wszNewAppNames[i],
lpKeyName,
lpDefault,
lpReturnedString,
nSize,
lpFileName
);
}
}
return ORIGINAL_API(GetPrivateProfileStringW)(
lpAppName,
lpKeyName,
lpDefault,
lpReturnedString,
nSize,
lpFileName
);
}
/*++
This stub function breaks into GetProfileString and checks to see the section
lpAppName being referred to is one of the sections in question.
--*/
DWORD
APIHOOK(GetProfileStringA)(
LPCSTR lpAppName,
LPCSTR lpKeyName,
LPCSTR lpDefault,
LPSTR lpReturnedString,
DWORD nSize
)
{
DWORD dRet;
int iArraySize = 2;
// The following array specifies what sections to look for and what to
// replace them with when calling GetPrivateProfileString
CHAR *szAppNames[] = {"_INSTALLTO32", "_INSTALLFROM32"};
CHAR *szNewAppNames[] = {"_INSTALLTO16", "_INSTALLFROM16"};
for (int i = 0; i < iArraySize; i++)
{
// Find out if one of the known section names is lpAppName
// if so change lpAppName parameter to new parameter and call API
if (stristr (szAppNames[i], lpAppName) !=NULL )
{
return ORIGINAL_API(GetProfileStringA)(
szNewAppNames[i],
lpKeyName,
lpDefault,
lpReturnedString,
nSize
);
}
}
return ORIGINAL_API(GetProfileStringA)(
lpAppName,
lpKeyName,
lpDefault,
lpReturnedString,
nSize
);
}
/*++
This stub function breaks into GetProfileString and checks to see the section
lpAppName being referred to is one of the sections in question.
--*/
DWORD
APIHOOK(GetProfileStringW)(
LPCWSTR lpAppName,
LPCWSTR lpKeyName,
LPCWSTR lpDefault,
LPWSTR lpReturnedString,
DWORD nSize
)
{
DWORD dRet;
int iArraySize = 2;
// The following array specifies what sections to look for and what to
// replace them with when calling GetPrivateProfileString
WCHAR *wszAppNames[] = {L"_INSTALLTO32", L"_INSTALLFROM32"};
WCHAR *wszNewAppNames[] = {L"_INSTALLTO16", L"_INSTALLFROM16"};
for (int i = 0; i < iArraySize; i++)
{
// Find out if one of the known section names is lpAppName
// if so change lpAppName parameter to new parameter and call API
if (wcsistr (lpAppName, wszAppNames[i]) != NULL)
{
return ORIGINAL_API(GetProfileStringW)(
wszNewAppNames[i],
lpKeyName,
lpDefault,
lpReturnedString,
nSize
);
}
}
return ORIGINAL_API(GetProfileStringW)(
lpAppName,
lpKeyName,
lpDefault,
lpReturnedString,
nSize
);
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(KERNEL32.DLL, GetPrivateProfileStringA)
APIHOOK_ENTRY(KERNEL32.DLL, GetPrivateProfileStringW)
APIHOOK_ENTRY(KERNEL32.DLL, GetProfileStringA)
APIHOOK_ENTRY(KERNEL32.DLL, GetProfileStringW)
HOOK_END
IMPLEMENT_SHIM_END