------------------------------------------------------------------------------
[ENHANCED] VFP 9.0 FIX - CATCH THE MEMORY ACCESS VIOLATION EXCEPTION
January 2025
------------------------------------------------------------------------------
CCB
1. BUG:
If we enable catching the memory access violation exception in Visual FoxPro Advanced,
when Visual FoxPro causes the memory access violation exception (exception code 0xC0000005),
it will display the exception dialog box twice,
and then it will display a dialog box "Are you sure you want to exit Visual FoxPro?",
if we select "Yes", it will exit Visual FoxPro,
if we select "No", it will cause the error "There is not enough memory to complete this operation (Error 43)",
and then it will return to Visual FoxPro, now we can do some important work, and then exit Visual FoxPro.
It is the startup default for Visual FoxPro Advanced Interactive Development Environment (IDE).
Please refer to the picture testcatchexception.png:
If we disable catching the memory access violation exception in Visual FoxPro Advanced,
when Visual FoxPro causes the memory access violation exception (exception code 0xC0000005),
it will display the exception dialog box twice, and then exit Visual FoxPro.
It is the startup default for Visual FoxPro Advanced Runtime and Visual FoxPro Advanced Multi-threaded Runtime.
2. CAUSE:
There are some BUGs in the following code.
3. RESOLUTION:
We can write some code to fix the BUG.
Fun61ca6d :: ; proc near
pushd 01Ch ;0x0061ca6d : 6a1c
pushd offset Data92b680 ;0x0061ca6f : 6880b69200
call Fun42c14f ;0x0061ca74 : e8d6f6e0ff
mov eax , dword ptr [ ebp + 8 ] ;0x0061ca79 : 8b4508
xor edi , edi ;0x0061ca7c : 33ff
mov dword ptr [ ebp - 28 ] , edi ;0x0061ca7e : 897de4
cmp dword ptr [ ebp + 12 ] , 0C00000FDh ;0x0061ca81 : 817d0cfd0000c0
jne Label61caa3 ;0x0061ca88 : 7519
mov eax , dword ptr [ eax + 4 ] ;0x0061ca8a : 8b4004
mov dword ptr [ eax + 0B8h ] , offset Label61ca63 ;0x0061ca8d : c780b800000063ca6100
call _resetstkoflw ;0x0061ca97 : ff15f4799100
or dword ptr [ ebp - 28 ] , 0FFFFFFFFh ;0x0061ca9d : 834de4ff
jmp Label61cb1c ;0x0061caa1 : eb79
Label61caa3 ::
cmp dword ptr [ ebp + 16 ] , edi ;0x0061caa3 : 397d10
je Label61cb1c ;0x0061caa6 : 7474
push eax ;0x0061caa8 : 50
push edi ;0x0061caa9 : 57
pushd offset Data9259b4 ;0x0061caaa : 68b4599200
call Fun61ca47 ;0x0061caaf : e893ffffff
mov dword ptr [ ebp - 36 ] , eax ;0x0061cab4 : 8945dc
cmp eax , 01h ;0x0061cab7 : 83f801
je Label61cb0f ;0x0061caba : 7453
mov dword ptr [ ebp - 4 ] , edi ;0x0061cabc : 897dfc
call Fun5531c3 ;0x0061cabf : e8ff66f3ff
push dword ptr [ ebp + 12 ] ;0x0061cac4 : ff750c
call Fun846807 ;0x0061cac7 : e83b9d2200
mov esi , eax ;0x0061cacc : 8bf0
mov dword ptr [ ebp - 40 ] , esi ;0x0061cace : 8975d8
cmp esi , edi ;0x0061cad1 : 3bf7
je Label61cb0b ;0x0061cad3 : 7436
mov ecx , 0910h ;0x0061cad5 : b910090000
call Fun42c583 ;0x0061cada : e8a4fae0ff
mov dword ptr [ ebp - 32 ] , eax ;0x0061cadf : 8945e0
pushd 01h ;0x0061cae2 : 6a01
call Fun7bddae ;0x0061cae4 : e8c5121a00
mov eax , dword ptr [esi] ;0x0061cae9 : 8b06
mov dword ptr [ ebp - 44 ] , eax ;0x0061caeb : 8945d4
pushd 010h ;0x0061caee : 6a10
push dword ptr [ ebp - 32 ] ;0x0061caf0 : ff75e0
push eax ;0x0061caf3 : 50
push edi ;0x0061caf4 : 57
call MessageBoxA ;0x0061caf5 : ff15d4729100
mov ecx , esi ;0x0061cafb : 8bce
call Fun42c1e2 ;0x0061cafd : e8e0f6e0ff
;
; -------------------------------------------------------------------
; VFP 9.0 FIX - CATCH THE MEMORY ACCESS VIOLATION EXCEPTION
; May 2022
; -------------------------------------------------------------------
; CCB
;
; Catch the memory access violation exception (exception code 0xC0000005).
;
; 2022/5/13, by ccb
;
cmp dword ptr vfpa_sys9100_data,00h
je Label61cb02
cmp dword ptr [ ebp + 12 ] , 0C0000005h
jne Label61cb02
pushd 00h
pushd 02h
pushd 00h
pushd 00h
lea eax , byte ptr vfpa_sys9100_text
push eax
call Fun6da248
cmp eax , 02h
jne Label61cb02
Label61cb00 ::
mov eax , dword ptr [ ebp + 8 ]
mov eax , dword ptr [ eax + 4 ]
mov dword ptr [ eax + 0B8h ] , offset Label61cb01
call _resetstkoflw
or dword ptr [ ebp - 28 ] , 0FFFFFFFFh
jmp Label61cb1c
Label61cb01 ::
mov ecx , 0B6h
jmp Fun544742
Label61cb02 ::
jmp Label61cb0b ;0x0061cb02 : eb07
Label61cb0b ::
or dword ptr [ ebp - 4 ] , 0FFFFFFFFh ;0x0061cb0b : 834dfcff
Label61cb0f ::
cmp dword ptr [ ebp - 36 ] , 02h ;0x0061cb0f : 837ddc02
jne Label61cb1c ;0x0061cb13 : 7507
mov dword ptr [ ebp - 28 ] , 01h ;0x0061cb15 : c745e401000000
Label61cb1c ::
mov eax , dword ptr [ ebp - 28 ] ;0x0061cb1c : 8b45e4
call Fun42c18a ;0x0061cb1f : e866f6e0ff
ret 0Ch ;0x0061cb24 : c20c00
4. APPLIES TO:
VFP 6.0.8167.0
VFP 6.0.8961.0 (SP5)
VFP 7.0.0.9262
VFP 7.0.0.9465 (SP1)
VFP 8.0.0.2521
VFP 8.0.0.3117 (SP1)
VFP 9.0.0.2412
VFP 9.0.0.3504 (SP1)
VFP 9.0.0.4611 (SP2)
VFP 9.0.0.5015 (SP2)
VFP 9.0.0.5411 (SP2)
VFP 9.0.0.5721 (SP2)
VFP 9.0.0.5815 (SP2)
VFP 9.0.0.6303 (SP2)
VFP 9.0.0.6602 (SP2)
VFP 9.0.0.7423 (SP2)
The bug has been fixed in VFP Advanced.
5. REFERENCE WEBSITES:
1, baiyujia.com:
http://www.baiyujia.com
http://www.baiyujia.com/vfpdocuments/f_vfp9fix212.asp
6. OTHER:
For reference only, there is no guarantees.
Any questions or suggestions, please send me an email at ccb2000@163.com.
|