/*++

 Copyright (c) 2001 Microsoft Corporation

 Module Name:

    ResumeWriter3.cpp

 Abstract:

    The setup of this app fails to register the OCX'es as it 
    tries loading the DLL's with a hardcoded 'system' path.
    Corrected the path to the 'system32' path.
   
 Notes:

    This is specific to this app.

 History:

    05/22/2001 prashkud Created

--*/

#include "precomp.h"

IMPLEMENT_SHIM_BEGIN(ResumeWriter3)
#include "ShimHookMacro.h"

APIHOOK_ENUM_BEGIN
    APIHOOK_ENUM_ENTRY(LoadLibraryA) 
APIHOOK_ENUM_END


WCHAR g_wszSystemDir[MAX_PATH];

/*++

    Hooks LoadLibraryA and changes the path that contains 'system' in it
    to the  'system32.

--*/

HMODULE
APIHOOK(LoadLibraryA)(
    LPCSTR lpFileName
    )
{
    CSTRING_TRY
    {
        // Bad string pointers can cause failures in CString.
        if (!IsBadStringPtrA(lpFileName, MAX_PATH))
        {
            CString csFileName(lpFileName);
            if (csFileName.Find(L"system") != -1)
            {
                // We have found 'system' in the path
                // Replace it with 'system32'.
                CString csName;
                csFileName.GetLastPathComponent(csName);              
                CString csNewFileName(g_wszSystemDir);
                csNewFileName.AppendPath(csName);

                DPFN(eDbgLevelInfo, "[ResumeWriter3] changed %s to (%s)\n", lpFileName, csNewFileName.GetAnsi());
                return ORIGINAL_API(LoadLibraryA)(csNewFileName.GetAnsi());                
            }
        }
    }
    CSTRING_CATCH
    {
    }

    return ORIGINAL_API(LoadLibraryA)(lpFileName);
}

/*++

    Cache the system directory when we get called in 
    the beginning.

--*/

BOOL
NOTIFY_FUNCTION(
    DWORD fdwReason
    )
{
    if (fdwReason == DLL_PROCESS_ATTACH)
    {
        GetSystemDirectory(g_wszSystemDir, MAX_PATH);
    }
    return TRUE;
}

/*++

 Register hooked functions

--*/

HOOK_BEGIN

    CALL_NOTIFY_FUNCTION
    APIHOOK_ENTRY(KERNEL32.DLL, LoadLibraryA)

HOOK_END

IMPLEMENT_SHIM_END