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

161 lines
3.9 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
InstallShield6.cpp
Abstract:
- InstallShield6 is using IKernel.exe. The problem is IKernel.exe is an out-of-process
OLE server that is spawned by svchost. IKernel.exe is located in InstallShield common
folder and it's known as InstallShield engine.
- In order to enable us to do matching against app that is using IKernel, we catch
first call to CreateFileA that has "data1.hdr" filename on the path.
We should be able to use matching info available in the path of this data1.hdr.
(which is located in temp folder in current user setting).
Then we call apphelp!ApphelpCheckExe to verify whether there is a match.
If there is a match, it will call shimeng!SE_DynamicShim to dynamically load additional shim
available for this application.
History:
04/11/2001 andyseti Created
06/27/2001 andyseti Added code to prevent multiple Dynamic Shimming
--*/
#include "precomp.h"
typedef BOOL (WINAPI *_pfn_CheckExe)(LPCWSTR, BOOL, BOOL, BOOL);
IMPLEMENT_SHIM_BEGIN(InstallShield6)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(CreateFileA)
APIHOOK_ENUM_END
HANDLE
APIHOOK(CreateFileA)(
LPSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
)
{
static _pfn_CheckExe pfnCheckExe = NULL;
static const char Apphelp_ModuleName[] = "Apphelp.dll";
static const char CheckExeProcedureName[] = "ApphelpCheckExe";
HMODULE hmodApphelp = 0;
if (pfnCheckExe != NULL)
{
goto Done;
}
CSTRING_TRY
{
CString csFileName(lpFileName);
csFileName.MakeLower();
if (-1 == csFileName.Find(L"data1.hdr"))
{
// not the one that we are looking for.
goto Done;
}
DPFN(
eDbgLevelInfo,
"[CreateFileA] Accessing %S", csFileName.Get());
// load apphelp & shimengine modules
DPFN(
eDbgLevelInfo,
"[CreateFileA] Loading Apphelp");
hmodApphelp = LoadLibraryA(Apphelp_ModuleName);
if (0 == hmodApphelp)
{
DPFN(
eDbgLevelError,
"[CreateFileA] Failed to get apphelp module handle");
goto Done;
}
// Get procedure addresses
DPFN(
eDbgLevelInfo,
"[CreateFileA] Getting ApphelpCheckExe proc address");
pfnCheckExe = (_pfn_CheckExe) GetProcAddress(hmodApphelp, CheckExeProcedureName);
if (NULL == pfnCheckExe)
{
DPFN(
eDbgLevelError,
"[CreateFileA] Failed to get %s procedure from %s module",
CheckExeProcedureName,Apphelp_ModuleName);
goto Done;
}
DPFN(
eDbgLevelInfo,
"[CreateFileA] Calling CheckExe");
if (FALSE == (*pfnCheckExe)(
(WCHAR *)csFileName.Get(),
FALSE,
TRUE,
FALSE
))
{
DPFN(
eDbgLevelError,
"[CreateFileA] There is no match for %S",
csFileName.Get());
goto Done;
}
}
CSTRING_CATCH
{
// Do nothing
}
Done:
HANDLE hRet = ORIGINAL_API(CreateFileA)(
lpFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
return hRet;
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(KERNEL32.DLL, CreateFileA)
HOOK_END
IMPLEMENT_SHIM_END