----------------------------------------------------------------------------------------------------------
                      [BUG/PRB.] VFP 9.0 FIX - PURGE CACHED MEMORY AND TRY AGAIN AFTER THE FILETOSTR() FUNCTION FAILED
                                  April 2021
                 ----------------------------------------------------------------------------------------------------------
                                     CCB



1. BUG:

     If we disable purging cached memory and try again after the FILETOSTR() function failed in Visual FoxPro Advanced,
     sometimes it occurs the error "There is not enough memory to complete this operation (Error 43)".


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun420d46 :: ; proc near
             cmp eax , 0800h                                                 ;0x00420d46 :        3d00080000
             push ebx                                                        ;0x00420d4b :        53
             mov ebx , 01h                                                   ;0x00420d4c :        bb01000000
             ja Label506b0c                                                  ;0x00420d51 :        0f87b55d0e00

     Label420d57 ::
             mov  edx , dword ptr [ esi + 32 ]                               ;0x00420d57 :        8b5620
             test edx , edx                                                  ;0x00420d5a :        85d2
             je Label42372c                                                  ;0x00420d5c :        0f84ca290000
             mov  ecx , dword ptr [edx]                                      ;0x00420d62 :        8b0a
             mov  ecx , dword ptr [ ecx - 4 ]                                ;0x00420d64 :        8b49fc
             sub ecx , 08h                                                   ;0x00420d67 :        83e908
             cmp ecx , eax                                                   ;0x00420d6a :        3bc8
             jb Label423743                                                  ;0x00420d6c :        0f82d1290000

     Label420d72 ::
             mov eax , ebx                                                   ;0x00420d72 :        8bc3
             pop ebx                                                         ;0x00420d74 :        5b
             ret                                                             ;0x00420d75 :        c3

     Label506b0c ::
             mov  byte ptr [ Data936f18 ] , bl                               ;0x00506b0c :        881d186f9300
             jmp Label420d57                                                 ;0x00506b12 :        e940a2f1ff

     Label42372c ::
             pushd 08h                                                       ;0x0042372c :        6a08
             call Fun42bf2a                                                  ;0x0042372e :        e8f7870000
             mov  dword ptr [ esi + 32 ] , eax                               ;0x00423733 :        894620

     Label423736 ::
             test eax , eax                                                  ;0x00423736 :        85c0
             je Label58dab7                                                  ;0x00423738 :        0f8479a31600
             jmp Label420d72                                                 ;0x0042373e :        e92fd6ffff

     Label423743 ::


     ;
     ;                 -----------------------------------------------------------------------------------------------
     ;                      VFP 9.0 FIX - PURGE CACHED MEMORY AND TRY AGAIN AFTER THE FILETOSTR() FUNCTION FAILED
     ;                                  April 2021
     ;                 -----------------------------------------------------------------------------------------------
     ;                                     CCB
     ;
     ; Purge cached memory and try again after the FILETOSTR() function failed.
     ;
     ; 2021/4/15, by ccb
     ;

             mov ecx , eax
             push ecx
             push edx


             pushd 00h                                                       ;0x00423743 :        6a00
             push edx                                                        ;0x00423745 :        52
             mov ecx , eax                                                   ;0x00423746 :        8bc8
             call Fun42c2c4                                                  ;0x00423748 :        e8778b0000


     ;
     ;                 -----------------------------------------------------------------------------------------------
     ;                      VFP 9.0 FIX - PURGE CACHED MEMORY AND TRY AGAIN AFTER THE FILETOSTR() FUNCTION FAILED
     ;                                  April 2021
     ;                 -----------------------------------------------------------------------------------------------
     ;                                     CCB
     ;
     ; Purge cached memory and try again after the FILETOSTR() function failed.
     ;
     ; 2021/4/15, by ccb
     ;

             pop edx
             pop ecx

             test eax , eax
             jne Label42374d
             cmp dword ptr vfpa_sys9058_data,00h
             je Label42374d
             cmp dword ptr [ esp + 4 ] , offset Label488e1a ;; Label488d4b ::
             jne Label42374d
             push ecx
             push edx
             ;; Purge Cached Virtual Memory
             push esi
             push ecx
             lea esi ,  dword ptr [ esp ]
             mov  dword ptr [ esp ] , 07FFFFFFFh
             call Fun7e0c91
             pop ecx
             pop esi
             ;; Purge Cached File Data Buffer
             mov  eax , 07FFFFFFFh
             call Fun68507b
             pop edx
             pop ecx
             pushd 00h
             push edx
             mov ecx , ecx
             call Fun42c2c4
             jmp Label42374d


     Label42374d ::
             jmp Label423736                                                 ;0x0042374d :        ebe7

     Label58dab7 ::
             test  byte ptr [ Data936f10 ] , bl                              ;0x0058dab7 :        841d106f9300
             je Label58dae3                                                  ;0x0058dabd :        7424
             mov eax ,  dword ptr [ Data936f14 ]                             ;0x0058dabf :        a1146f9300
             test eax , eax                                                  ;0x0058dac4 :        85c0
             jne Label58daed                                                 ;0x0058dac6 :        7525
             mov  dword ptr [ esi + 4 ] , ebx                                ;0x0058dac8 :        895e04
             mov  dword ptr [ Data936f14 ] , 0B6h                            ;0x0058dacb :        c705146f9300b6000000
             mov  byte ptr [esi] , 049h                                      ;0x0058dad5 :        c60649
             mov  dword ptr [ esi + 12 ] , 00h                               ;0x0058dad8 :        c7460c00000000
             xor eax , eax                                                   ;0x0058dadf :        33c0
             pop ebx                                                         ;0x0058dae1 :        5b
             ret                                                             ;0x0058dae2 :        c3

     Label58dae3 ::
             mov ecx , 0B6h                                                  ;0x0058dae3 :        b9b6000000
             call Fun544742                                                  ;0x0058dae8 :        e8556cfbff

     Label58daed ::
             mov  dword ptr [ esi + 4 ] , ebx                                ;0x0058daed :        895e04
             mov  byte ptr [esi] , 049h                                      ;0x0058daf0 :        c60649
             mov  dword ptr [ esi + 12 ] , 00h                               ;0x0058daf3 :        c7460c00000000
             xor eax , eax                                                   ;0x0058dafa :        33c0
             pop ebx                                                         ;0x0058dafc :        5b
             ret                                                             ;0x0058dafd :        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_vfp9fix168.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix166.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix167.asp


6. OTHER:

     For reference only, there is no guarantees.

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