/*++ 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