/*++ Copyright (c) 2002 Microsoft Corporation Module Name: OmniPagePro11Uninstall.cpp Abstract: An OmniPagePro custom action returns an invalid error code. We cannot shim it directly, but we can shim the custom action, and then trap all calls to GetProcAddress() from MSIExec Notes: This is specific to OmniPage Pro 11 Uninstaller History: 5/14/2002 mikrause Created --*/ #include "precomp.h" #include IMPLEMENT_SHIM_BEGIN(OmniPagePro11Uninstall) #include "ShimHookMacro.h" APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(GetProcAddress) APIHOOK_ENUM_END typedef UINT (WINAPI *_pfn_MsiCustomAction)(MSIHANDLE msiHandle); _pfn_MsiCustomAction g_pfnOriginalULinkToPagis = NULL; UINT CALLBACK ULinkToPagisHook( MSIHANDLE msiHandle ) { UINT uiRet = g_pfnOriginalULinkToPagis(msiHandle); if (uiRet == (UINT)-1) { uiRet = 0; } return uiRet; } FARPROC APIHOOK(GetProcAddress)( HMODULE hModule, // handle to DLL module LPCSTR lpProcName // function name ) { if ((HIWORD(lpProcName) != 0) && (lstrcmpA(lpProcName, "ULinkToPagis") == 0)) { g_pfnOriginalULinkToPagis = (_pfn_MsiCustomAction) GetProcAddress(hModule, lpProcName); if (g_pfnOriginalULinkToPagis) { return (FARPROC)ULinkToPagisHook; } } return ORIGINAL_API(GetProcAddress)(hModule, lpProcName); } HOOK_BEGIN APIHOOK_ENTRY(KERNEL32.DLL, GetProcAddress ) HOOK_END IMPLEMENT_SHIM_END