windows-nt/Source/XPSP1/NT/windows/appcompat/shims/general/ignorevboverflow.cpp
2020-09-26 16:20:57 +08:00

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