95 lines
1.4 KiB
C++
95 lines
1.4 KiB
C++
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
IgnoreVBOverflow.cpp
|
|
|
|
Abstract:
|
|
|
|
Some VB applications don't expect full 32-bit handles from some APIs. VB
|
|
type checking typically throws a "Runtime Error 6" message when
|
|
applications try and store a 32-bit value in a 16-bit variable.
|
|
|
|
This fix works with VB5 and VB6 apps.
|
|
|
|
Notes:
|
|
|
|
This is a general purpose shim.
|
|
|
|
History:
|
|
|
|
05/21/2001 linstev Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(IgnoreVBOverflow)
|
|
#include "ShimHookMacro.h"
|
|
|
|
typedef DWORD (WINAPI *_pfn_VB5_vbaI2I4)();
|
|
typedef DWORD (WINAPI *_pfn_VB6_vbaI2I4)();
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_ENTRY(VB5_vbaI2I4)
|
|
APIHOOK_ENUM_ENTRY(VB6_vbaI2I4)
|
|
APIHOOK_ENUM_END
|
|
|
|
/*++
|
|
|
|
Zero the return if ecx > 0xFFFF
|
|
|
|
--*/
|
|
|
|
__declspec(naked)
|
|
VOID
|
|
APIHOOK(VB5_vbaI2I4)()
|
|
{
|
|
__asm {
|
|
test ecx, 0xFFFF0000
|
|
jz Loc1
|
|
xor ecx, ecx
|
|
Loc1:
|
|
mov eax, ecx
|
|
ret
|
|
}
|
|
}
|
|
|
|
/*++
|
|
|
|
Zero the return if ecx > 0xFFFF
|
|
|
|
--*/
|
|
|
|
__declspec(naked)
|
|
VOID
|
|
APIHOOK(VB6_vbaI2I4)()
|
|
{
|
|
__asm {
|
|
test ecx, 0xFFFF0000
|
|
jz Loc1
|
|
xor ecx, ecx
|
|
Loc1:
|
|
mov eax, ecx
|
|
ret
|
|
}
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
HOOK_BEGIN
|
|
|
|
APIHOOK_ENTRY_NAME(MSVBVM50.DLL, VB5_vbaI2I4, __vbaI2I4)
|
|
APIHOOK_ENTRY_NAME(MSVBVM60.DLL, VB6_vbaI2I4, __vbaI2I4)
|
|
|
|
HOOK_END
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|