--------------------------------------------------------------------------------------------
                      [ENHANCED] VFP 9.0 FIX - ALWAYS ADD THE READWRITE OPTION IN THE INTO CURSOR CLAUSE
                                September 2024
                 --------------------------------------------------------------------------------------------
                                     CCB



1. BUG:

     In vfp9 (and vfp7, vfp8), it creates a read-write cursor with the READWRITE option,
     it creates a read-only cursor without the READWRITE option.

     In VFP Advanced, if we enable always adding the READWRITE option in the INTO CURSOR clause,
     the INTO CURSOR CursorName clause is the same as the INTO CURSOR CursorName READWRITE clause,
     it always creates a read-write cursor.


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun536d15 :: ; proc near
             sub esp , 0350h                                                 ;0x00536d15 :        81ec50030000
             mov eax ,  dword ptr [ Data937090 ]                             ;0x00536d1b :        a190709300
             mov  ecx , dword ptr [ Data9393ac ]                             ;0x00536d20 :        8b0dac939300
             push ebx                                                        ;0x00536d26 :        53
             push ebp                                                        ;0x00536d27 :        55
             mov  ebp , dword ptr [ esp + 035Ch ]                            ;0x00536d28 :        8bac245c030000
             push esi                                                        ;0x00536d2f :        56
             mov  dword ptr [ esp + 0358h ] , eax                            ;0x00536d30 :        89842458030000
             mov  al , byte ptr [ecx]                                        ;0x00536d37 :        8a01
             push edi                                                        ;0x00536d39 :        57


     ;
     ;                 ---------------------------------------------------------------------------------
     ;                      VFP 9.0 FIX - ALWAYS ADD THE READWRITE OPTION IN THE INTO CURSOR CLAUSE
     ;                                September 2024
     ;                 ---------------------------------------------------------------------------------
     ;                                     CCB
     ;
     ; Always add the READWRITE option in the INTO CURSOR clause.
     ;
     ; 2024/9/8, by ccb
     ;

     Label536d39_start ::
             cmp dword ptr vfpa_sys9168_data,00h
             je Label536d39_end
             or dword ptr [ ebp + 0B4h ] , 03h
     Label536d39_end ::


     Label536d3a ::
             xor edi , edi                                                   ;0x00536d3a :        33ff
             cmp al , 0FEh                                                   ;0x00536d3c :        3cfe
             mov  dword ptr [ esp + 20 ] , edi                               ;0x00536d3e :        897c2414
             je Label536dd3                                                  ;0x00536d42 :        0f848b000000

     Label536d48 ::
             movzx eax , al                                                  ;0x00536d48 :        0fb6c0
             add eax , 0FFFFFFE1h                                            ;0x00536d4b :        83c0e1
             cmp eax , 0DDh                                                  ;0x00536d4e :        3ddd000000
             ja Label4a6598                                                  ;0x00536d53 :        0f873ff8f6ff
             movzx eax ,byte ptr [ eax + offset Data5362d0 ]                          ;0x00536d59 :        0fb680d0625300
             jmp  dword ptr [ 4 * eax + offset DataPtr536df0 ]                           ;0x00536d60 :        ff2485f06d5300

     Label536d67 ::
             lea esi ,  dword ptr [ esp + 24 ]                               ;0x00536d67 :        8d742418
             call Fun42107e                                                  ;0x00536d6b :        e80ea3eeff
             mov  edx , dword ptr [ Data9393ac ]                             ;0x00536d70 :        8b15ac939300
             mov  al , byte ptr [edx]                                        ;0x00536d76 :        8a02
             cmp al , 031h                                                   ;0x00536d78 :        3c31
             je Label5e6d51                                                  ;0x00536d7a :        0f84d1ff0a00
             cmp al , 0BDh                                                   ;0x00536d80 :        3cbd
             jne Label4a6549                                                 ;0x00536d82 :        0f85c1f7f6ff
             lea esi ,  dword ptr [ esp + 24 ]                               ;0x00536d88 :        8d742418
             call Fun42107e                                                  ;0x00536d8c :        e8eda2eeff
             mov eax ,  dword ptr [ Data9393ac ]                             ;0x00536d91 :        a1ac939300
             mov  dword ptr [ ebp + 0164h ] , eax                            ;0x00536d96 :        898564010000
             mov  eax , dword ptr [ ebp + 8 ]                                ;0x00536d9c :        8b4508
             test eax , eax                                                  ;0x00536d9f :        85c0
             jne Label536dc3                                                 ;0x00536da1 :        7520
             pushd 00h                                                       ;0x00536da3 :        6a00
             xor ecx , ecx                                                   ;0x00536da5 :        33c9
             call Fun52ed72                                                  ;0x00536da7 :        e8c67fffff
             mov edx , eax                                                   ;0x00536dac :        8bd0
             mov  dword ptr [ ebp + 0174h ] , eax                            ;0x00536dae :        898574010000
             call Fun531d42                                                  ;0x00536db4 :        e889afffff
             mov esi , eax                                                   ;0x00536db9 :        8bf0
             test esi , esi                                                  ;0x00536dbb :        85f6
             jne Label5e6eee                                                 ;0x00536dbd :        0f852b010b00

     Label536dc3 ::
             mov  ecx , dword ptr [ Data9393ac ]                             ;0x00536dc3 :        8b0dac939300
             mov  al , byte ptr [ecx]                                        ;0x00536dc9 :        8a01
             cmp al , 0FEh                                                   ;0x00536dcb :        3cfe
             jne Label536d48                                                 ;0x00536dcd :        0f8575ffffff

     Label536dd3 ::
             mov  ecx , dword ptr [ esp + 035Ch ]                            ;0x00536dd3 :        8b8c245c030000
             call Fun42bf1d                                                  ;0x00536dda :        e83e51efff
             pop edi                                                         ;0x00536ddf :        5f
             pop esi                                                         ;0x00536de0 :        5e
             pop ebp                                                         ;0x00536de1 :        5d
             pop ebx                                                         ;0x00536de2 :        5b
             add esp , 0350h                                                 ;0x00536de3 :        81c450030000
             ret 04h                                                         ;0x00536de9 :        c20400


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_vfp9fix344.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix342.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix343.asp


6. OTHER:

     For reference only, there is no guarantees.

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