---------------------------------------------------------------------------------------------- [NEW.....] VFP 9.0 FIX - THE MESSAGE() FUNCTION RETURNS THE EXPRESSION ERROR MESSAGE January 2024 ---------------------------------------------------------------------------------------------- CCB 1. BUG: If we enable the MESSAGE() function to return the expression error message (the default setting), we can get the expression error message and the expression source code that caused the error. 2. CAUSE: There are some BUGs in the following code. 3. RESOLUTION: We can write some code to fix the BUG. Fun420bce :: ; proc near push ebp ;0x00420bce : 55 mov ebp , esp ;0x00420bcf : 8bec ; ; ----------------------------------------------------------------------------------- ; VFP 9.0 FIX - THE MESSAGE() FUNCTION RETURNS THE EXPRESSION ERROR MESSAGE ; April 2023 ; ----------------------------------------------------------------------------------- ; CCB ; ; The MESSAGE() function returns the expression error message. ; ; 2023/4/2, by ccb ; ; sub esp , 060h ;0x00420bd1 : 83ec60 sub esp , 070h ;0x00420bd1 : 83ec60 xor eax , eax mov dword ptr [ ebp - 070h ][00h] , eax ;; vfpa_expressionerrormessage_ppcode. mov dword ptr [ ebp - 070h ][04h] , eax ;; vfpa_expressionerrormessage_ppcode_old. mov dword ptr [ ebp - 070h ][08h] , eax mov dword ptr [ ebp - 070h ][0Ch] , eax push ebx ;0x00420bd4 : 53 push esi ;0x00420bd5 : 56 mov esi , dword ptr [ Data9370f0 ] ;0x00420bd6 : 8b35f0709300 push edi ;0x00420bdc : 57 mov edi , dword ptr [ Data93936c ] ;0x00420bdd : 8b3d6c939300 mov ecx , esi ;0x00420be3 : 8bce sub ecx , edi ;0x00420be5 : 2bcf mov eax , 02E8BA2E9h ;0x00420be7 : b8e9a28b2e imul ecx ;0x00420bec : f7e9 mov ecx , dword ptr [ Data939368 ] ;0x00420bee : 8b0d68939300 add ecx , 017h ;0x00420bf4 : 83c117 imul ecx , ecx , 02Ch ;0x00420bf7 : 6bc92c sar edx , 03h ;0x00420bfa : c1fa03 mov eax , edx ;0x00420bfd : 8bc2 shr eax , 01Fh ;0x00420bff : c1e81f add eax , edx ;0x00420c02 : 03c2 xor ebx , ebx ;0x00420c04 : 33db add ecx , edi ;0x00420c06 : 03cf cmp esi , ecx ;0x00420c08 : 3bf1 mov dword ptr [ ebp - 12 ] , eax ;0x00420c0a : 8945f4 mov dword ptr [ ebp - 8 ] , ebx ;0x00420c0d : 895df8 jnb Label5935fa ;0x00420c10 : 0f83e4291700 mov edx , dword ptr [ Data936f10 ] ;0x00420c16 : 8b15106f9300 mov eax , dword ptr [ ebp + 8 ] ;0x00420c1c : 8b4508 mov dword ptr [ Data936f10 ] , eax ;0x00420c1f : a3106f9300 mov dword ptr [ ebp - 4 ] , edx ;0x00420c24 : 8955fc ; ; ----------------------------------------------------------------------------------- ; VFP 9.0 FIX - THE MESSAGE() FUNCTION RETURNS THE EXPRESSION ERROR MESSAGE ; April 2023 ; ----------------------------------------------------------------------------------- ; CCB ; ; The MESSAGE() function returns the expression error message. ; ; 2023/4/2, by ccb ; mov eax , dword ptr [ Data9393ac ] mov dword ptr [ ebp - 070h ][00h] , eax lea edx , dword ptr [ ebp - 16 ] ;0x00420c27 : 8d55f0 lea eax , dword ptr [ ebp - 96 ] ;0x00420c2a : 8d45a0 call Fun42c27f ;0x00420c2d : e84db60000 push ebx ;0x00420c32 : 53 push eax ;0x00420c33 : 50 call Fun42c2be ;0x00420c34 : e885b60000 mov esi , eax ;0x00420c39 : 8bf0 add esp , 08h ;0x00420c3b : 83c408 cmp esi , ebx ;0x00420c3e : 3bf3 jne Label420cda ;0x00420c40 : 0f8594000000 mov ecx , dword ptr [ Data9393ac ] ;0x00420c46 : 8b0dac939300 mov dl , byte ptr [ecx] ;0x00420c4c : 8a11 xor edi , edi ;0x00420c4e : 33ff inc ecx ;0x00420c50 : 41 cmp dl , 0FCh ;0x00420c51 : 80fafc mov dword ptr [ Data936f14 ] , edi ;0x00420c54 : 893d146f9300 mov dword ptr [ Data9393ac ] , ecx ;0x00420c5a : 890dac939300 jne Label59363b ;0x00420c60 : 0f85d5291700 movzx eax ,byte ptr [ecx] ;0x00420c66 : 0fb601 cmp eax , 0FDh ;0x00420c69 : 3dfd000000 je Label420ca7 ;0x00420c6e : 7437 Label420c70 :: inc ecx ;0x00420c70 : 41 cmp eax , 0100h ;0x00420c71 : 3d00010000 mov dword ptr [ Data9393ac ] , ecx ;0x00420c76 : 890dac939300 ja Label593604 ;0x00420c7c : 0f8782291700 call dword ptr [ 4 * eax + offset DataPtr919f90 ] ;0x00420c82 : ff1485909f9100 Label420c89 :: mov edi , dword ptr [ Data936f14 ] ;0x00420c89 : 8b3d146f9300 cmp edi , ebx ;0x00420c8f : 3bfb jne Label4f3372 ;0x00420c91 : 0f85db260d00 Label420c97 :: mov ecx , dword ptr [ Data9393ac ] ;0x00420c97 : 8b0dac939300 movzx eax ,byte ptr [ecx] ;0x00420c9d : 0fb601 cmp eax , 0FDh ;0x00420ca0 : 3dfd000000 jne Label420c70 ;0x00420ca5 : 75c9 Label420ca7 :: inc ecx ;0x00420ca7 : 41 mov dword ptr [ Data9393ac ] , ecx ;0x00420ca8 : 890dac939300 Label420cae :: cmp byte ptr [ Data936f18 ] , bl ;0x00420cae : 381d186f9300 jne Label53e097 ;0x00420cb4 : 0f85ddd31100 Label420cba :: mov ecx , dword ptr [ Data9370f0 ] ;0x00420cba : 8b0df0709300 mov al , byte ptr [ecx] ;0x00420cc0 : 8a01 cmp al , 047h ;0x00420cc2 : 3c47 je Label4ac12f ;0x00420cc4 : 0f8465b40800 cmp al , 04Ah ;0x00420cca : 3c4a je Label4a6bea ;0x00420ccc : 0f84185f0800 cmp al , 05Ah ;0x00420cd2 : 3c5a je Label593660 ;0x00420cd4 : 0f8486291700 Label420cda :: mov eax , dword ptr [ Data937220 ] ;0x00420cda : a120729300 lea edx , dword ptr [ ebp - 96 ] ;0x00420cdf : 8d55a0 cmp edx , eax ;0x00420ce2 : 3bd0 jne Label5936f6 ;0x00420ce4 : 0f850c2a1700 mov eax , dword ptr [ Data937220 ] ;0x00420cea : a120729300 mov eax , dword ptr [ eax + 76 ] ;0x00420cef : 8b404c cmp dword ptr [ ebp - 16 ] , eax ;0x00420cf2 : 3945f0 mov dword ptr [ Data937220 ] , eax ;0x00420cf5 : a320729300 jne Label593700 ;0x00420cfa : 0f85002a1700 cmp esi , ebx ;0x00420d00 : 3bf3 mov ecx , dword ptr [ ebp - 4 ] ;0x00420d02 : 8b4dfc mov dword ptr [ Data936f10 ] , ecx ;0x00420d05 : 890d106f9300 jne Label451a3c ;0x00420d0b : 0f852b0d0300 Label420d11 :: mov eax , dword ptr [ ebp - 8 ] ;0x00420d11 : 8b45f8 cmp eax , ebx ;0x00420d14 : 3bc3 jne Label420d3d ;0x00420d16 : 7525 cmp dword ptr [ Data936f14 ] , ebx ;0x00420d18 : 391d146f9300 jne Label4f3382 ;0x00420d1e : 0f855e260d00 cmp esi , ebx ;0x00420d24 : 3bf3 mov ecx , dword ptr [ Data9370f0 ] ;0x00420d26 : 8b0df0709300 jne Label593721 ;0x00420d2c : 0f85ef291700 Label420d32 :: mov eax , ecx ;0x00420d32 : 8bc1 sub ecx , 02Ch ;0x00420d34 : 83e92c mov dword ptr [ Data9370f0 ] , ecx ;0x00420d37 : 890df0709300 Label420d3d :: pop edi ;0x00420d3d : 5f pop esi ;0x00420d3e : 5e pop ebx ;0x00420d3f : 5b mov esp , ebp ;0x00420d40 : 8be5 pop ebp ;0x00420d42 : 5d ret 04h ;0x00420d43 : c20400 Label451a3c :: ; ; ----------------------------------------------------------------------------------- ; VFP 9.0 FIX - THE MESSAGE() FUNCTION RETURNS THE EXPRESSION ERROR MESSAGE ; April 2023 ; ----------------------------------------------------------------------------------- ; CCB ; ; The MESSAGE() function returns the expression error message. ; ; 2023/4/2, by ccb ; cmp dword ptr vfpa_sys9129_data,00h je Label451a3d cmp esi,00h je Label451a3d mov dword ptr vfpa_expressionerrormessage_errornumber,esi mov byte ptr vfpa_expressionerrormessage_errormessage,00h mov byte ptr vfpa_expressionerrormessage_errorsource,00h push 0FFh lea eax,byte ptr vfpa_expressionerrormessage_errormessage push eax push dword ptr vfpa_expressionerrormessage_errornumber call vfpa_geterrormessage mov eax , dword ptr [ ebp - 070h ][00h] cmp byte ptr [eax] , 0FCh jne Label451a3d mov eax , dword ptr [ Data9393ac ] mov dword ptr [ ebp - 070h ][04h] , eax mov eax , dword ptr [ ebp - 070h ][00h] mov dword ptr [ Data9393ac ] , eax lea ecx,byte ptr vfpa_expressionerrormessage_errorsource mov edx , 01FFFh push 01h push edx push ecx call vfpa_geterrorsource mov eax , dword ptr [ ebp - 070h ][04h] mov dword ptr [ Data9393ac ] , eax Label451a3d :: test byte ptr [ ebp + 8 ] , 01h ;0x00451a3c : f6450801 jne Label59370a ;0x00451a40 : 0f85c41c1400 mov ecx , esi ;0x00451a46 : 8bce call Fun544742 ;0x00451a48 : e8f52c0f00 Label4a6bea :: mov eax , dword ptr [ ebp + 8 ] ;0x004a6bea : 8b4508 test byte ptr ah , 02h ;0x004a6bed : f6c402 je Label593695 ;0x004a6bf0 : 0f849fca0e00 jmp Label420cda ;0x004a6bf6 : e9dfa0f7ff Label4ac12f :: test byte ptr [ ebp + 8 ] , 040h ;0x004ac12f : f6450840 je Label5936c8 ;0x004ac133 : 0f848f750e00 jmp Label420cda ;0x004ac139 : e99c4bf7ff Label4f3372 :: ; ; ----------------------------------------------------------------------------------- ; VFP 9.0 FIX - THE MESSAGE() FUNCTION RETURNS THE EXPRESSION ERROR MESSAGE ; April 2023 ; ----------------------------------------------------------------------------------- ; CCB ; ; The MESSAGE() function returns the expression error message. ; ; 2023/4/2, by ccb ; cmp dword ptr vfpa_sys9129_data,00h je Label4f3373 cmp edi,00h je Label4f3373 mov dword ptr vfpa_expressionerrormessage_errornumber,edi mov byte ptr vfpa_expressionerrormessage_errormessage,00h mov byte ptr vfpa_expressionerrormessage_errorsource,00h push 0FFh lea eax,byte ptr vfpa_expressionerrormessage_errormessage push eax push dword ptr vfpa_expressionerrormessage_errornumber call vfpa_geterrormessage mov eax , dword ptr [ ebp - 070h ][00h] cmp byte ptr [eax] , 0FCh jne Label4f3373 mov eax , dword ptr [ Data9393ac ] mov dword ptr [ ebp - 070h ][04h] , eax mov eax , dword ptr [ ebp - 070h ][00h] mov dword ptr [ Data9393ac ] , eax lea ecx,byte ptr vfpa_expressionerrormessage_errorsource mov edx , 01FFFh push 01h push edx push ecx call vfpa_geterrorsource mov eax , dword ptr [ ebp - 070h ][04h] mov dword ptr [ Data9393ac ] , eax Label4f3373 :: mov al , byte ptr [ ebp + 8 ] ;0x004f3372 : 8a4508 test al , al ;0x004f3375 : 84c0 js Label59362e ;0x004f3377 : 0f88b1020a00 jmp Label420c97 ;0x004f337d : e915d9f2ff Label4f3382 :: mov edx , dword ptr [ ebp - 12 ] ;0x004f3382 : 8b55f4 mov ecx , dword ptr [ Data93936c ] ;0x004f3385 : 8b0d6c939300 imul edx , edx , 02Ch ;0x004f338b : 6bd22c add edx , ecx ;0x004f338e : 03d1 mov ecx , dword ptr [ Data9370f0 ] ;0x004f3390 : 8b0df0709300 cmp ecx , edx ;0x004f3396 : 3bca Label4f3398 :: jne Label420d32 ;0x004f3398 : 0f8594d9f2ff add ecx , 02Ch ;0x004f339e : 83c12c jmp Label420d32 ;0x004f33a1 : e98cd9f2ff Label529526 :: mov cl , byte ptr [eax] ;0x00529526 : 8a08 cmp cl , 04Fh ;0x00529528 : 80f94f je Label53e0b5 ;0x0052952b : 0f84844b0100 cmp cl , 052h ;0x00529531 : 80f952 je Label53e0b5 ;0x00529534 : 0f847b4b0100 cmp dword ptr [ eax + 12 ] , 0FFFFFFFDh ;0x0052953a : 83780cfd je Label53e0b5 ;0x0052953e : 0f84714b0100 mov ecx , dword ptr [ eax + 36 ] ;0x00529544 : 8b4824 mov dword ptr [ eax + 36 ] , ebx ;0x00529547 : 895824 call Fun43b3af ;0x0052954a : e8601ef1ff mov eax , dword ptr [ Data9370f0 ] ;0x0052954f : a1f0709300 jmp Label53e0b5 ;0x00529554 : e95c4b0100 Label53e097 :: mov eax , dword ptr [ Data9370f0 ] ;0x0053e097 : a1f0709300 cmp byte ptr [eax] , 048h ;0x0053e09c : 803848 je Label53e0ac ;0x0053e09f : 740b mov ecx , dword ptr [ eax + 32 ] ;0x0053e0a1 : 8b4820 cmp ecx , ebx ;0x0053e0a4 : 3bcb jne Label53e633 ;0x0053e0a6 : 0f8587050000 Label53e0ac :: cmp dword ptr [ eax + 36 ] , ebx ;0x0053e0ac : 395824 jne Label529526 ;0x0053e0af : 0f8571b4feff Label53e0b5 :: add eax , 02Ch ;0x0053e0b5 : 83c02c call Fun53dffd ;0x0053e0b8 : e840ffffff jmp Label420cba ;0x0053e0bd : e9f82beeff Label53e633 :: call Fun42c1e2 ;0x0053e633 : e8aadbeeff mov ecx , dword ptr [ Data9370f0 ] ;0x0053e638 : 8b0df0709300 mov dword ptr [ ecx + 32 ] , ebx ;0x0053e63e : 895920 mov eax , dword ptr [ Data9370f0 ] ;0x0053e641 : a1f0709300 jmp Label53e0ac ;0x0053e646 : e961faffff Label5935fa :: mov ecx , 0D2h ;0x005935fa : b9d2000000 call Fun544742 ;0x005935ff : e83e11fbff Label593604 :: test byte ptr [ Data936f10 ] , 01h ;0x00593604 : f605106f930001 je Label593624 ;0x0059360b : 7417 cmp edi , ebx ;0x0059360d : 3bfb jne Label420c89 ;0x0059360f : 0f8574d6e8ff mov dword ptr [ Data936f14 ] , 03E7h ;0x00593615 : c705146f9300e7030000 jmp Label420c89 ;0x0059361f : e965d6e8ff Label593624 :: mov ecx , 03E7h ;0x00593624 : b9e7030000 call Fun544742 ;0x00593629 : e81411fbff Label59362e :: mov eax , dword ptr [ Data9370f0 ] ;0x0059362e : a1f0709300 mov dword ptr [ ebp - 8 ] , eax ;0x00593633 : 8945f8 jmp Label420cda ;0x00593636 : e99fd6e8ff Label59363b :: mov eax , dword ptr [ ebp - 4 ] ;0x0059363b : 8b45fc test al , 01h ;0x0059363e : a801 mov dword ptr [ Data936f10 ] , eax ;0x00593640 : a3106f9300 je Label593656 ;0x00593645 : 740f mov dword ptr [ Data936f14 ] , 0386h ;0x00593647 : c705146f930086030000 jmp Label420cae ;0x00593651 : e958d6e8ff Label593656 :: mov ecx , 0386h ;0x00593656 : b986030000 call Fun544742 ;0x0059365b : e8e210fbff Label593660 :: test byte ptr [ ebp + 8 ] , 02h ;0x00593660 : f6450802 jne Label420cda ;0x00593664 : 0f8570d6e8ff mov eax , ecx ;0x0059366a : 8bc1 call Label748407 ;0x0059366c : e8964d1b00 test byte ptr [ Data936f10 ] , 01h ;0x00593671 : f605106f930001 je Label5936c1 ;0x00593678 : 7447 cmp dword ptr [ Data936f14 ] , ebx ;0x0059367a : 391d146f9300 jne Label420cda ;0x00593680 : 0f8554d6e8ff mov dword ptr [ Data936f14 ] , 012Eh ;0x00593686 : c705146f93002e010000 jmp Label420cda ;0x00593690 : e945d6e8ff Label593695 :: mov eax , ecx ;0x00593695 : 8bc1 mov dword ptr [ eax + 8 ] , ebx ;0x00593697 : 895808 test byte ptr [ Data936f10 ] , 01h ;0x0059369a : f605106f930001 mov byte ptr [ecx] , 04Ch ;0x005936a1 : c6014c je Label5936c1 ;0x005936a4 : 741b cmp dword ptr [ Data936f14 ] , ebx ;0x005936a6 : 391d146f9300 jne Label420cda ;0x005936ac : 0f8528d6e8ff mov dword ptr [ Data936f14 ] , 012Eh ;0x005936b2 : c705146f93002e010000 jmp Label420cda ;0x005936bc : e919d6e8ff Label5936c1 :: mov ecx , 012Eh ;0x005936c1 : b92e010000 jmp Label5936f1 ;0x005936c6 : eb29 Label5936c8 :: test byte ptr [ Data936f10 ] , 01h ;0x005936c8 : f605106f930001 je Label5936ec ;0x005936cf : 741b cmp dword ptr [ Data936f14 ] , ebx ;0x005936d1 : 391d146f9300 jne Label420cda ;0x005936d7 : 0f85fdd5e8ff mov dword ptr [ Data936f14 ] , 0390h ;0x005936dd : c705146f930090030000 jmp Label420cda ;0x005936e7 : e9eed5e8ff Label5936ec :: mov ecx , 0390h ;0x005936ec : b990030000 Label5936f1 :: call Fun544742 ;0x005936f1 : e84c10fbff Label5936f6 :: mov ecx , 0Eh ;0x005936f6 : b90e000000 call Fun544742 ;0x005936fb : e84210fbff Label593700 :: mov ecx , 0Eh ;0x00593700 : b90e000000 call Fun544742 ;0x00593705 : e83810fbff Label59370a :: cmp dword ptr [ Data936f14 ] , ebx ;0x0059370a : 391d146f9300 jne Label420d11 ;0x00593710 : 0f85fbd5e8ff mov dword ptr [ Data936f14 ] , esi ;0x00593716 : 8935146f9300 jmp Label420d11 ;0x0059371c : e9f0d5e8ff Label593721 :: mov eax , dword ptr [ ebp - 12 ] ;0x00593721 : 8b45f4 mov esi , dword ptr [ Data93936c ] ;0x00593724 : 8b356c939300 imul eax , eax , 02Ch ;0x0059372a : 6bc02c add eax , esi ;0x0059372d : 03c6 cmp ecx , eax ;0x0059372f : 3bc8 jmp Label4f3398 ;0x00593731 : e962fcf5ff 4. APPLIES TO: VFP 10 (VFP Advanced) 5. REFERENCE WEBSITES: 1, baiyujia.com: http://www.baiyujia.com http://www.baiyujia.com/vfpdocuments/f_vfp9fix263.asp http://www.baiyujia.com/vfpdocuments/f_vfp9fix253.asp http://www.baiyujia.com/vfpdocuments/f_vfp9fix254.asp 6. OTHER: For reference only, there is no guarantees. Any questions or suggestions, please send me an email at ccb2000@163.com. |