-------------------------------------------------------------
                      [BUG/PRB.] VFP 9.0 FIX - CHECK THE FILE DATA BUFFER
                                  August 2024
                 -------------------------------------------------------------
                                     CCB



1. BUG:

     In vfp9 (and vfp7, vfp8), if the file data length is not equal to the file data buffer length (except the last file block),
     it will not display any warning message.

     The bug occurs in vfp7, vfp8 and vfp9, it does not occur in vfp6.

     In VFP Advanced, if the file data length is not equal to the file data buffer length (except the last file block),
     it will display a warning message "File data buffer internal consistency error! The file name is 'name'.
     Press 'OK' to fix the error. Press 'Cancel' to ignore the error, the file will be invalid or corrupted!".

     Please refer to the picture filedatabufferinternalconsistencyerror.png:


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     Fun42d157 :: ; proc near
             push ecx                                                        ;0x0042d157 :        51
             mov eax ,  dword ptr [ Data93757c ]                             ;0x0042d158 :        a17c759300
             push ebx                                                        ;0x0042d15d :        53
             push ebp                                                        ;0x0042d15e :        55
             mov  ebp , dword ptr [ esp + 24 ]                               ;0x0042d15f :        8b6c2418
             push esi                                                        ;0x0042d163 :        56
             push edi                                                        ;0x0042d164 :        57


     ;
     ;                 --------------------------------------------------
     ;                      VFP 9.0 FIX - CHECK THE FILE DATA BUFFER
     ;                                  August 2024
     ;                 --------------------------------------------------
     ;                                     CCB
     ;
     ; Check the file data buffer.
     ;
     ; 2024/8/23, by ccb
     ;

             mov dword ptr vfpa_checkfiledatabuffer_errorcount,00h


             mov  edi , dword ptr [ esp + 24 ]                               ;0x0042d165 :        8b7c2418
             mov ebx , edi                                                   ;0x0042d169 :        8bdf
             imul ebx , ebx , 038h                                           ;0x0042d16b :        6bdb38
             mov  dword ptr [ esp + 16 ] , ebx                               ;0x0042d16e :        895c2410
             add ebx , eax                                                   ;0x0042d172 :        03d8
             test  byte ptr [ ebx + 8 ] , 021h                               ;0x0042d174 :        f6430821
             jne Label43e445                                                 ;0x0042d178 :        0f85c7120100

     Label42d17e ::
             test  byte ptr [ ebx + 44 ] , 02h                               ;0x0042d17e :        f6432c02
             je Label56e449                                                  ;0x0042d182 :        0f84c1121400
             xor eax , eax                                                   ;0x0042d188 :        33c0
             test ebp , ebp                                                  ;0x0042d18a :        85ed
             mov  dword ptr [ esp + 32 ] , eax                               ;0x0042d18c :        89442420
             jbe Label42d1f8                                                 ;0x0042d190 :        7666
             lea esp ,  dword ptr [ esp ]                                    ;0x0042d192 :        8d2424

     Label42d195 ::
             mov  ecx , dword ptr [ Data9370f8 ]                             ;0x0042d195 :        8b0df8709300
             push ebp                                                        ;0x0042d19b :        55
             mov edx , ebx                                                   ;0x0042d19c :        8bd3
             call Fun42d01e                                                  ;0x0042d19e :        e87bfeffff
             mov esi , eax                                                   ;0x0042d1a3 :        8bf0
             mov  edx , dword ptr [ esi + 4 ]                                ;0x0042d1a5 :        8b5604
             mov  eax , dword ptr [ ebx + 4 ]                                ;0x0042d1a8 :        8b4304
             sub eax , edx                                                   ;0x0042d1ab :        2bc2
             mov  edx , dword ptr [ esi + 12 ]                               ;0x0042d1ad :        8b560c


     ;
     ;                 --------------------------------------------------
     ;                      VFP 9.0 FIX - CHECK THE FILE DATA BUFFER
     ;                                  August 2024
     ;                 --------------------------------------------------
     ;                                     CCB
     ;
     ; Check the file data buffer.
     ;
     ; 2024/8/23, by ccb
     ;

     ;         cmp eax , edx                                                   ;0x0042d1b0 :        3bc2
     ;         jnb Label42d1f4                                                 ;0x0042d1b2 :        7340

             cmp eax , edx                                                   ;0x0042d1b0 :        3bc2
             jb Label42d1b4                                                  ;0x0042d1b2 :        7340

             cmp dword ptr vfpa_sys9165_data,00h
             je Label42d1f4
             cmp  edx , dword ptr [ esi + 8 ]
             jae Label42d1f4
             mov ecx , dword ptr [ ebx + 32 ]
             test ecx , ecx
             jl Label42d1f4
             mov ecx , dword ptr [ ebx + 36 ]
             dec ecx
             test ecx , ecx
             jle Label42d1f4
             mov edx , dword ptr [ ebx + 16 ]
             mov edx , dword ptr [edx]
             lea ecx , dword ptr [ edx + 4 * ecx ]
             mov edx , dword ptr [ ebx + 20 ]
             mov ecx , dword ptr [ecx]
             add ecx , dword ptr [edx]
             mov  edx , dword ptr [ esi + 12 ]
             cmp ecx , esi
             je Label42d1f4
             mov ecx ,  dword ptr [ Data937794 ]
             test ecx , ecx
             je Label42d1f4
             cmp dword ptr vfpa_sys9165_data,02h
             je Label42d1b2
             cmp dword ptr vfpa_checkfiledatabuffer_errorcount,00h
             jne Label42d1b2
             push eax
             push edx
             lea eax,byte ptr vfpa_checkfiledatabuffer_errormessage
             push eax
             lea eax,byte ptr vfpa_checkfiledatabuffer_errortext
             push eax
             call lstrcpyA
             mov eax , dword ptr [ ebx + 12 ]
             mov eax , dword ptr [eax]
             push eax
             lea eax,byte ptr vfpa_checkfiledatabuffer_errortext
             push eax
             call lstrcatA
             lea eax,byte ptr vfpa_checkfiledatabuffer_errormessage2
             push eax
             lea eax,byte ptr vfpa_checkfiledatabuffer_errortext
             push eax
             call lstrcatA
             pushd 00h
             pushd 01h
             lea eax,byte ptr vfpa_checkfiledatabuffer_errortext
             push eax
             call Fun6da3d3
             mov ecx , eax
             pop edx
             pop eax
             test ecx,ecx
             je Label42d1f4

     Label42d1b2 ::
             inc dword ptr vfpa_checkfiledatabuffer_errorcount
             mov  edx , dword ptr [ esi + 8 ]
             cmp eax , edx                                                   ;0x0042d1b0 :        3bc2
             jb Label42d1b4                                                  ;0x0042d1b2 :        7340
             jmp Label42d1f4


     Label42d1b4 ::
             sub edx , eax                                                   ;0x0042d1b4 :        2bd0
             cmp ebp , edx                                                   ;0x0042d1b6 :        3bea
             ja Label434cfb                                                  ;0x0042d1b8 :        0f873d7b0000
             mov edx , ebp                                                   ;0x0042d1be :        8bd5

     Label42d1c0 ::
             mov  esi , dword ptr [esi]                                      ;0x0042d1c0 :        8b36
             mov  edi , dword ptr [ esp + 32 ]                               ;0x0042d1c2 :        8b7c2420
             add esi , eax                                                   ;0x0042d1c6 :        03f0
             mov  eax , dword ptr [ esp + 28 ]                               ;0x0042d1c8 :        8b44241c
             add edi , eax                                                   ;0x0042d1cc :        03f8
             mov ecx , edx                                                   ;0x0042d1ce :        8bca
             mov eax , ecx                                                   ;0x0042d1d0 :        8bc1
             shr ecx , 02h                                                   ;0x0042d1d2 :        c1e902
             rep movsd                                                       ;0x0042d1d5 :        f3a5
             mov ecx , eax                                                   ;0x0042d1d7 :        8bc8
             and ecx , 03h                                                   ;0x0042d1d9 :        83e103
             rep movsb                                                       ;0x0042d1dc :        f3a4
             mov  esi , dword ptr [ esp + 32 ]                               ;0x0042d1de :        8b742420
             mov  ecx , dword ptr [ ebx + 4 ]                                ;0x0042d1e2 :        8b4b04
             add esi , edx                                                   ;0x0042d1e5 :        03f2
             add ecx , edx                                                   ;0x0042d1e7 :        03ca
             sub ebp , edx                                                   ;0x0042d1e9 :        2bea
             mov  dword ptr [ esp + 32 ] , esi                               ;0x0042d1eb :        89742420
             mov  dword ptr [ ebx + 4 ] , ecx                                ;0x0042d1ef :        894b04
             jne Label42d195                                                 ;0x0042d1f2 :        75a1

     Label42d1f4 ::
             mov  eax , dword ptr [ esp + 32 ]                               ;0x0042d1f4 :        8b442420

     Label42d1f8 ::
             pop edi                                                         ;0x0042d1f8 :        5f
             pop esi                                                         ;0x0042d1f9 :        5e
             pop ebp                                                         ;0x0042d1fa :        5d
             pop ebx                                                         ;0x0042d1fb :        5b
             pop ecx                                                         ;0x0042d1fc :        59
             ret 0Ch                                                         ;0x0042d1fd :        c20c00


4. APPLIES TO:

     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_vfp9fix338.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix26.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix337.asp


6. OTHER:

     For reference only, there is no guarantees.

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