/*++

 Copyright (c) 2002 Microsoft Corporation

 Module Name:

    NetBackup45.cpp

 Abstract:

    The app calls CString::SetAt with an index > length. This API was
    modified to throw an exception in this case to prevent a buffer 
    overrun.

 Notes:

    This is an app specific shim.

 History:

    07/08/2002 linstev   Created

--*/

#include "precomp.h"

IMPLEMENT_SHIM_BEGIN(NetBackup45)
#include "ShimHookMacro.h"

typedef VOID (WINAPI *_pfn_MFC_CString_SetAt)();

APIHOOK_ENUM_BEGIN
    APIHOOK_ENUM_ENTRY(MFC_CString_SetAt) 
APIHOOK_ENUM_END

/*++

 Only allow the call if index < length

--*/

#if defined(_WIN64)
__declspec()
#else
__declspec(naked)
#endif
VOID
APIHOOK(MFC_CString_SetAt)()
{
	#if defined(_X86_)
    __asm {
      mov  eax, [ecx]
      mov  eax, [eax - 8]       // This gets us the length
      
      cmp  [esp + 4], eax	// [esp + 4] = Index; eax = Length
      jge  Done
      
      push [esp + 8]
      push [esp + 8]
    }

    ORIGINAL_API(MFC_CString_SetAt)();

  Done:

    __asm {
      ret  8
    }
	#endif
}

/*++

 Register hooked functions

--*/

HOOK_BEGIN
    APIHOOK_ENTRY_ORD(MFC42.DLL, MFC_CString_SetAt, 5856)
HOOK_END

IMPLEMENT_SHIM_END

