-----------------------------------------------------------------------------------------------------------------------
                      [BUG/PRB.] VFP 9.0 FIX - SYS(9164) ENABLES OR DISABLES FIXING THE FILE DATA BUFFER INTERNAL CONSISTENCY ERROR
                                  August 2024
                 -----------------------------------------------------------------------------------------------------------------------
                                     CCB



1. THE SYS(9164) FUNCTION:

     SYS(9164) - Enables or disables fixing the file data buffer internal consistency error

     Enables or disables fixing the file data buffer internal consistency error.

     SYS(9164 [, 0 | 1])

     Parameters
     0
     Disables fixing the file data buffer internal consistency error.
     1
     Enables fixing the file data buffer internal consistency error. 1 is the startup default for Visual FoxPro Advanced.
    
     Return Value
     Character

     Remarks
     If we disable fixing the file data buffer internal consistency error in Visual FoxPro Advanced,
     for example, for the SELECT UNION command with memo fields,
     SELECT k1,fld1,fld2 FROM testa UNION ALL SELECT k1,fld1,fld2 FROM testb INTO TABLE ("testc.dbf")
     ---------------------------------------------------------------------------------------------------------------
     | File Block ID | File Data Offset | File Data Buffer Length | File Data Length    | Note                     |
     ---------------------------------------------------------------------------------------------------------------
     | 0             | 0x0000           | 0x0200                  | 0x0200              | ok.                      |
     | 1             | 0x0200           | 0x0400                  | 0x03CA (?)          | some problems (?)        |
     | 2             | 0x0600           | 0x0800                  | 0x07CB (?)          | some problems (?)        |
     | 3             | 0x0E00           | 0x1000                  | 0x0FCB (?)          | some problems (?)        |
     | 4             | 0x1E00           | 0x2000                  | 0x1FCB (?)          | some problems (?)        |
     | 5             | 0x3E00           | 0x4000                  | 0x2A4C              | the last file block, ok. |
     ---------------------------------------------------------------------------------------------------------------
     there are some problems for some file blocks (the file block 1, 2, 3 and 4).
     It is the same as Visual FoxPro 7.0 and later versions.

     If we enable fixing the file data buffer internal consistency error in Visual FoxPro Advanced,
     for example, for the SELECT UNION command with memo fields,
     SELECT k1,fld1,fld2 FROM testa UNION ALL SELECT k1,fld1,fld2 FROM testb INTO TABLE ("testc.dbf")
     ---------------------------------------------------------------------------------------------------------------
     | File Block ID | File Data Offset | File Data Buffer Length | File Data Length    | Note                     |
     ---------------------------------------------------------------------------------------------------------------
     | 0             | 0x0000           | 0x0200                  | 0x0200              | ok.                      |
     | 1             | 0x0200           | 0x0400                  | 0x0400 (<-- 0x03CA) | ok.                      |
     | 2             | 0x0600           | 0x0800                  | 0x0800 (<-- 0x07CB) | ok.                      |
     | 3             | 0x0E00           | 0x1000                  | 0x1000 (<-- 0x0FCB) | ok.                      |
     | 4             | 0x1E00           | 0x2000                  | 0x2000 (<-- 0x1FCB) | ok.                      |
     | 5             | 0x3E00           | 0x4000                  | 0x2A4C              | the last file block, ok. |
     ---------------------------------------------------------------------------------------------------------------
     for the file block 1, the file data length (0x03CA) will be set to the file data buffer length (0x0400),
     for the file block 2, the file data length (0x07CB) will be set to the file data buffer length (0x0800),
     for the file block 3, the file data length (0x0FCB) will be set to the file data buffer length (0x1000),
     for the file block 4, the file data length (0x1FCB) will be set to the file data buffer length (0x2000),
     so there is no problem for all file blocks.
     It is the same as Visual FoxPro 6.0 and earlier versions.

     For more information about the file data buffer internal consistency error, please refer to:
     -----------------------------------------------------------------------------------------------------------------------------------------------------------
     | Visual FoxPro Version  | File Data Buffer Length              | File Data Length | The Maximum Length for Copying Data in Each Loop | Note              |
     -----------------------------------------------------------------------------------------------------------------------------------------------------------
     | Visual FoxPro 3.0      | 0x200, 0x400, 0x800, ... , 0x8000    | 0x200, 0x3CA, 0x7CB, ...                         | 0x200            | ok.               |
     | Visual FoxPro 5.0      | 0x200, 0x400, 0x800, ... , 0x8000    | 0x200, 0x400 (<-- 0x3CA), 0x800 (<-- 0x7CB), ... | 0x200            | ok.               |
     | Visual FoxPro 6.0      | 0x200, 0x400, 0x800, ... , 0x8000    | 0x200, 0x400 (<-- 0x3CA), 0x800 (<-- 0x7CB), ... | 0x8000           | ok.               |
     | Visual FoxPro 7.0      | 0x200, 0x400, 0x800, ... , 0x8000    | 0x200, 0x3CA (?), 0x7CB (?), ...                 | 0x8000 (?)       | some problems (?) |
     | Visual FoxPro 8.0      | 0x200, 0x400, 0x800, ... , 0x8000    | 0x200, 0x3CA (?), 0x7CB (?), ...                 | 0x8000 (?)       | some problems (?) |
     | Visual FoxPro 9.0      | 0x200, 0x400, 0x800, ... , 0x10000   | 0x200, 0x3CA (?), 0x7CB (?), ...                 | 0x8000 (?)       | some problems (?) |
     | Visual FoxPro Advanced | 0x200, 0x400, 0x800, ... , 0x1000000 | 0x200, 0x400 (<-- 0x3CA), 0x800 (<-- 0x7CB), ... | 0x8000           | ok.               |
     -----------------------------------------------------------------------------------------------------------------------------------------------------------


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun529fca :: ; proc near
             push ebp                                                        ;0x00529fca :        55
             mov ebp , esp                                                   ;0x00529fcb :        8bec
             pushd 0FFFFFFFFh                                                ;0x00529fcd :        6aff
             pushd offset Data922268                                                  ;0x00529fcf :        6868229200
             pushd offset Label9160f9                                                  ;0x00529fd4 :        68f9609100
             mov eax ,  dword ptr fs:[00h]                                   ;0x00529fd9 :        64a100000000
             push eax                                                        ;0x00529fdf :        50
             mov  dword ptr fs:[00h] , esp                                   ;0x00529fe0 :        64892500000000
             push ecx                                                        ;0x00529fe7 :        51
             push ecx                                                        ;0x00529fe8 :        51
             mov eax , 02FBCh                                                ;0x00529fe9 :        b8bc2f0000
             call Fun42c118                                                  ;0x00529fee :        e82521f0ff
             mov eax ,  dword ptr [ Data937090 ]                             ;0x00529ff3 :        a190709300
             mov  dword ptr [ ebp - 28 ] , eax                               ;0x00529ff8 :        8945e4
             push ebx                                                        ;0x00529ffb :        53
             push esi                                                        ;0x00529ffc :        56
             push edi                                                        ;0x00529ffd :        57
             mov  dword ptr [ ebp - 24 ] , esp                               ;0x00529ffe :        8965e8
             xor edi , edi                                                   ;0x0052a001 :        33ff
             mov  dword ptr [ ebp + 0FFFFD114h ] , edi                       ;0x0052a003 :        89bd14d1ffff
             push edi                                                        ;0x0052a009 :        57
             pushd 02710h                                                    ;0x0052a00a :        6810270000
             push edi                                                        ;0x0052a00f :        57
             mov  ebx , dword ptr [ ebp + 8 ]                                ;0x0052a010 :        8b5d08
             mov eax , ebx                                                   ;0x0052a013 :        8bc3
             call Fun529bc5                                                  ;0x0052a015 :        e8abfbffff
             mov  dword ptr [ ebp + 0FFFFD0E4h ] , eax                       ;0x0052a01a :        8985e4d0ffff
             mov  dword ptr [ ebp + 0FFFFD10Ch ] , edi                       ;0x0052a020 :        89bd0cd1ffff
             lea ecx ,  dword ptr [ ebp + 0FFFFFDE0h ]                       ;0x0052a026 :        8d8de0fdffff
             mov  dword ptr [ ebp + 0FFFFD100h ] , ecx                       ;0x0052a02c :        898d00d1ffff
             mov  byte ptr [ ebp + 0FFFFFDE0h ] , 00h                        ;0x0052a032 :        c685e0fdffff00
             movsx eax , ax                                                  ;0x0052a039 :        0fbfc0


     ;
     ;                 ------------------------------------------------------------------------------------------------------------
     ;                      VFP 9.0 FIX - SYS(9164) ENABLES OR DISABLES FIXING THE FILE DATA BUFFER INTERNAL CONSISTENCY ERROR
     ;                                  August 2024
     ;                 ------------------------------------------------------------------------------------------------------------
     ;                                     CCB
     ;
     ; SYS(9164) - Enables or disables fixing the file data buffer internal consistency error.
     ;
     ; 2024/8/23, by ccb
     ;

             cmp eax,9164
             je vfpa_sys9164_start


             pushd 064h                                                      ;0x0052a03c :        6a64
             pop esi                                                         ;0x0052a03e :        5e
             cmp eax , esi                                                   ;0x0052a03f :        3bc6
             jle Label52a0d0                                                 ;0x0052a041 :        0f8e89134000
             mov ecx , 07EAh                                                 ;0x0052a047 :        b9ea070000
             cmp eax , ecx                                                   ;0x0052a04c :        3bc1
             jg Label52a164                                                  ;0x0052a04e :        0f8f10010000
             je Label609b33                                                  ;0x0052a054 :        0f84d9fa0d00
             mov ecx , 04F6h                                                 ;0x0052a05a :        b9f6040000
             cmp eax , ecx                                                   ;0x0052a05f :        3bc1
             jle Label52b6e0                                                 ;0x0052a061 :        0f8e79160000
             mov ecx , 07DBh                                                 ;0x0052a067 :        b9db070000
             cmp eax , ecx                                                   ;0x0052a06c :        3bc1
             jg Label51f355                                                  ;0x0052a06e :        0f8fe152ffff
             je Label609700                                                  ;0x0052a074 :        0f8486f60d00
             add ecx , 0FFFFFFF9h                                            ;0x0052a07a :        83c1f9
             cmp eax , ecx                                                   ;0x0052a07d :        3bc1
             jg Label4a4938                                                  ;0x0052a07f :        0f8fb3a8f7ff
             je Label4f6b07                                                  ;0x0052a085 :        0f847ccafcff
             sub eax , 04F7h                                                 ;0x0052a08b :        2df7040000
             je Label60951e                                                  ;0x0052a090 :        0f8488f40d00
             dec eax                                                         ;0x0052a096 :        48
             je Label60950f                                                  ;0x0052a097 :        0f8472f40d00
             sub eax , 0E4h                                                  ;0x0052a09d :        2de4000000
             je Label609492                                                  ;0x0052a0a2 :        0f84eaf30d00
             sub eax , 01F4h                                                 ;0x0052a0a8 :        2df4010000
             jne Label462026                                                 ;0x0052a0ad :        0f85737ff3ff
             lea eax ,  dword ptr [ ebp + 0FFFFFDE0h ]                       ;0x0052a0b3 :        8d85e0fdffff
             push eax                                                        ;0x0052a0b9 :        50
             push  dword ptr [ ebp + 12 ]                                    ;0x0052a0ba :        ff750c
             mov edx , ebx                                                   ;0x0052a0bd :        8bd3
             call Fun4dc923                                                  ;0x0052a0bf :        e85f28fbff


4. APPLIES TO:

     VFP 10 (VFP Advanced)


5. REFERENCE WEBSITES:

     1, baiyujia.com:
     http://www.baiyujia.com
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix26.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix338.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix339.asp


6. OTHER:

     For reference only, there is no guarantees.

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