161 lines
4.1 KiB
C++
161 lines
4.1 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
|