-----------------------------------------------------------------------------
                      [BUG/PRB.] VFP 9.0 FIX - FIX THE ASTACKINFO() AND SYS(16) FUNCTIONS
                                  April 2025
                 -----------------------------------------------------------------------------
                                     CCB



1. BUG:

     In vfp9 (and vfp6, vfp7, vfp8), when the executing program is part of an application (.app) or an executable (.exe),
     sometimes ASTACKINFO() and SYS(16) return only the name of the program, that is, without the path.

     In Visual FoxPro Advanced, when the executing program is part of an application (.app) or an executable (.exe),
     ASTACKINFO() and SYS(16) always return a full path name.

     There is a test program:

     *testsys16.prg:
     DO ("TESTSYS162A\TESTSYS162A.EXE")
     DO ("TESTSYS163A\TESTSYS163A.EXE")
     DO ("TESTSYS162B\TESTSYS162B.EXE")
     DO ("TESTSYS163B\TESTSYS163B.EXE")
     RETURN

     *testsys162a.prg:
     ?"SYS(16) = "+SYS(16) && it displays "C:\...\TESTSYS16_PROGRAM\TESTSYS162A\TESTSYS162A.EXE" in vfp9 and Visual FoxPro Advanced, ok.
     WAIT
     RETURN

     *testsys163a.prg:
     ?"SYS(16) = "+SYS(16) && it displays "C:\...\TESTSYS16_PROGRAM\TESTSYS163A\TESTSYS163A.EXE" in vfp9 and Visual FoxPro Advanced, ok.
     WAIT
     RETURN

     *testsys162b.prg:
     DO ("TESTSYS168.FXP")
     RETURN
     *testsys168.prg:
     ?"SYS(16) = "+SYS(16) && it displays "TESTSYS168.FXP" (no path) in vfp9,
     WAIT                  && it displays "TESTSYS168.FXP C:\...\TESTSYS16_PROGRAM\TESTSYS162B\TESTSYS162B.EXE" in Visual FoxPro Advanced, ok.
     RETURN

     *testsys163b.prg:
     DO ("TESTSYS168.FXP")
     RETURN
     *testsys168.prg:
     ?"SYS(16) = "+SYS(16) && it displays "TESTSYS168.FXP" (no path) in vfp9,
     WAIT                  && it displays "TESTSYS168.FXP C:\...\TESTSYS16_PROGRAM\TESTSYS163B\TESTSYS163B.EXE" in Visual FoxPro Advanced, ok.
     RETURN


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun527b20 :: ; proc near
             test eax , eax                                                  ;0x00527b20 :        85c0
             mov  byte ptr [edx] , 00h                                       ;0x00527b22 :        c60200
             je Label4aabc6                                                  ;0x00527b25 :        0f849b30f8ff
             mov  eax , dword ptr [eax]                                      ;0x00527b2b :        8b00
             mov  ecx , dword ptr [ eax + 12 ]                               ;0x00527b2d :        8b480c
             test ecx , ecx                                                  ;0x00527b30 :        85c9
             je Label4aabc6                                                  ;0x00527b32 :        0f848e30f8ff
             mov  ecx , dword ptr [ecx]                                      ;0x00527b38 :        8b09
             mov  ax , word ptr [ eax + 16 ]                                 ;0x00527b3a :        668b4010
             cmp  ax , word ptr [ ecx + 34 ]                                 ;0x00527b3e :        663b4122
             push esi                                                        ;0x00527b42 :        56
             jne Label4aabac                                                 ;0x00527b43 :        0f856330f8ff

     Label527b49 ::
             mov  eax , dword ptr [ ecx + 20 ]                               ;0x00527b49 :        8b4114
             mov  eax , dword ptr [eax]                                      ;0x00527b4c :        8b00
             add  eax , dword ptr [ ecx + 24 ]                               ;0x00527b4e :        034118

     Label527b51 ::
             mov  cl , byte ptr [eax]                                        ;0x00527b51 :        8a08
             inc eax                                                         ;0x00527b53 :        40
             mov  byte ptr [edx] , cl                                        ;0x00527b54 :        880a
             inc edx                                                         ;0x00527b56 :        42
             test cl , cl                                                    ;0x00527b57 :        84c9
             jne Label527b51                                                 ;0x00527b59 :        75f6
             pop esi                                                         ;0x00527b5b :        5e
             ret                                                             ;0x00527b5c :        c3

     Label4aabac ::
             mov  esi , dword ptr [ ecx + 20 ]                               ;0x004aabac :        8b7114
             movzx eax , ax                                                  ;0x004aabaf :        0fb7c0
             imul eax , eax , 01Ch                                           ;0x004aabb2 :        6bc01c
             mov  eax , dword ptr [ ecx + eax + 76 ]                         ;0x004aabb5 :        8b44014c
             add  eax , dword ptr [esi]                                      ;0x004aabb9 :        0306


     ;
     ;                 ------------------------------------------------------------------
     ;                      VFP 9.0 FIX - FIX THE ASTACKINFO() AND SYS(16) FUNCTIONS
     ;                                  April 2025
     ;                 ------------------------------------------------------------------
     ;                                     CCB
     ;
     ; In vfp9 (and vfp6, vfp7, vfp8), when the executing program is part of an application (.app) or an executable (.exe),
     ; sometimes ASTACKINFO() and SYS(16) return only the name of the program, that is, without the path.
     ; In Visual FoxPro Advanced, when the executing program is part of an application (.app) or an executable (.exe),
     ; ASTACKINFO() and SYS(16) always return a full path name.
     ;
     ; 2025/4/13, by ccb
     ;

             mov esi , ecx


     Label4aabbb ::
             mov  cl , byte ptr [eax]                                        ;0x004aabbb :        8a08
             inc eax                                                         ;0x004aabbd :        40
             mov  byte ptr [edx] , cl                                        ;0x004aabbe :        880a
             inc edx                                                         ;0x004aabc0 :        42
             test cl , cl                                                    ;0x004aabc1 :        84c9
             jne Label4aabbb                                                 ;0x004aabc3 :        75f6


     ;
     ;                 ------------------------------------------------------------------
     ;                      VFP 9.0 FIX - FIX THE ASTACKINFO() AND SYS(16) FUNCTIONS
     ;                                  April 2025
     ;                 ------------------------------------------------------------------
     ;                                     CCB
     ;
     ; In vfp9 (and vfp6, vfp7, vfp8), when the executing program is part of an application (.app) or an executable (.exe),
     ; sometimes ASTACKINFO() and SYS(16) return only the name of the program, that is, without the path.
     ; In Visual FoxPro Advanced, when the executing program is part of an application (.app) or an executable (.exe),
     ; ASTACKINFO() and SYS(16) always return a full path name.
     ;
     ; 2025/4/13, by ccb
     ;

             cmp dword ptr vfpa_sys9183_data,00h
             je Label4aabc5
             cmp dword ptr [ esp + 4 ] , offset Label65a7e3 ;; Label65a683 ..
             jne Label4aabc3
             jmp Label4aabc4

     Label4aabc3 ::
             cmp dword ptr vfpa_sys9183_data,02h
             jne Label4aabc5
             cmp dword ptr [ esp + 4 ] , offset Label4f46b7 ;; Fun4f4663 .. ; proc near
             jne Label4aabc5
             cmp dword ptr [ esp + 4 + (4+00h+114h) ] , offset Label52a10d ;; Label52a0e2 ..
             jne Label4aabc5
             jmp Label4aabc4

     Label4aabc4 ::
             dec edx
             mov  byte ptr [edx] , 20h
             inc edx
             mov  byte ptr [edx] , 00h
             mov ecx , esi
             jmp Label527b49


     Label4aabc5 ::
             pop esi                                                         ;0x004aabc5 :        5e

     Label4aabc6 ::
             ret                                                             ;0x004aabc6 :        c3


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_vfp9fix376.asp


6. OTHER:

     For reference only, there is no guarantees.

     Any questions or suggestions, please send me an email at ccb2000@163.com.