--------------------------------------------------------------------------------
                      [ENHANCED] VFP 9.0 FIX - OPEN INDEX FILES WITH THE TABLE AUTOMATICALLY
                                 January 2024
                 --------------------------------------------------------------------------------
                                     CCB



1. BUG:

     In vfp9 (and vfp6, vfp7, vfp8), it will open structural compound index files (tablefilename+".cdx") with the table automatically.

     In VFP Advanced, it will open structural compound index files (tablefilename+".cdx") with the table automatically.
     In VFP Advanced, if we enable opening nonstructural compound index files with the table automatically,
     it will open nonstructural compound index files (tablefilename+"_index*.cdx") with the table automatically.
     In VFP Advanced, if we enable opening standalone index files with the table automatically,
     it will open standalone index files (tablefilename+"_index*.idx") with the table automatically.


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun41e4ef :: ; proc near
             push ebp                                                        ;0x0041e4ef :        55
             mov ebp , esp                                                   ;0x0041e4f0 :        8bec
             sub esp , 06Ch                                                  ;0x0041e4f2 :        83ec6c
             mov  eax , dword ptr [ ebp + 8 ]                                ;0x0041e4f5 :        8b4508
             cmp eax , 0FFFFFFFFh                                            ;0x0041e4f8 :        83f8ff
             push ebx                                                        ;0x0041e4fb :        53
             push esi                                                        ;0x0041e4fc :        56
             push edi                                                        ;0x0041e4fd :        57
             mov  dword ptr [ ebp - 20 ] , edx                               ;0x0041e4fe :        8955ec
             mov  dword ptr [ ebp - 4 ] , ecx                                ;0x0041e501 :        894dfc
             mov  dword ptr [ ebp - 12 ] , 0FFFFFFFFh                        ;0x0041e504 :        c745f4ffffffff
             jne Label531dea                                                 ;0x0041e50b :        0f85d9381100

     Label41e511 ::
             lea edx ,  dword ptr [ ebp - 24 ]                               ;0x0041e511 :        8d55e8
             lea eax ,  dword ptr [ ebp - 104 ]                              ;0x0041e514 :        8d4598
             call Fun42c27f                                                  ;0x0041e517 :        e863dd0000
             pushd 00h                                                       ;0x0041e51c :        6a00
             push eax                                                        ;0x0041e51e :        50
             call Fun42c2be                                                  ;0x0041e51f :        e89add0000
             mov  ebx , dword ptr [ ebp + 12 ]                               ;0x0041e524 :        8b5d0c
             add esp , 08h                                                   ;0x0041e527 :        83c408
             test eax , eax                                                  ;0x0041e52a :        85c0
             mov  dword ptr [ ebp - 16 ] , eax                               ;0x0041e52c :        8945f0
             jne Label4d0794                                                 ;0x0041e52f :        0f855f220b00
             mov  ecx , dword ptr [ ebp - 4 ]                                ;0x0041e535 :        8b4dfc
             mov  edx , dword ptr [ ecx + 8 ]                                ;0x0041e538 :        8b5108
             mov  edi , dword ptr [ ebp - 20 ]                               ;0x0041e53b :        8b7dec
             push ebx                                                        ;0x0041e53e :        53
             push edx                                                        ;0x0041e53f :        52
             mov eax , edi                                                   ;0x0041e540 :        8bc7
             call Fun41e620                                                  ;0x0041e542 :        e8d9000000
             mov esi , eax                                                   ;0x0041e547 :        8bf0
             test esi , esi                                                  ;0x0041e549 :        85f6
             mov  dword ptr [ ebp - 8 ] , esi                                ;0x0041e54b :        8975f8
             je Label41f158                                                  ;0x0041e54e :        0f84040c0000
             mov  eax , dword ptr [ esi + 32 ]                               ;0x0041e554 :        8b4620
             test  byte ptr ah , 04h                                         ;0x0041e557 :        f6c404
             jne Label44e19a                                                 ;0x0041e55a :        0f853afc0200

     Label41e560 ::
             mov  ecx , dword ptr [ esi + 32 ]                               ;0x0041e560 :        8b4e20
             mov eax , ecx                                                   ;0x0041e563 :        8bc1
             shr eax , 013h                                                  ;0x0041e565 :        c1e813
             test al , 01h                                                   ;0x0041e568 :        a801
             jne Label619cee                                                 ;0x0041e56a :        0f857eb71f00

     Label41e570 ::
             mov  edi , dword ptr [ ebp - 4 ]                                ;0x0041e570 :        8b7dfc
             mov  eax , dword ptr [ edi + 8 ]                                ;0x0041e573 :        8b4708
             and ebx , 0FFFFFF7Fh                                            ;0x0041e576 :        81e37fffffff
             mov ecx , esi                                                   ;0x0041e57c :        8bce
             mov  dword ptr [ ebp + 12 ] , ebx                               ;0x0041e57e :        895d0c
             call Fun414921                                                  ;0x0041e581 :        e89b63ffff

     Label41e586 ::
             mov eax ,  dword ptr [ Data937220 ]                             ;0x0041e586 :        a120729300
             lea edx ,  dword ptr [ ebp - 104 ]                              ;0x0041e58b :        8d5598
             cmp edx , eax                                                   ;0x0041e58e :        3bd0
             jne Label619d4c                                                 ;0x0041e590 :        0f85b6b71f00
             mov eax ,  dword ptr [ Data937220 ]                             ;0x0041e596 :        a120729300
             mov  eax , dword ptr [ eax + 76 ]                               ;0x0041e59b :        8b404c
             cmp  dword ptr [ ebp - 24 ] , eax                               ;0x0041e59e :        3945e8
             mov dword ptr [ Data937220 ] ,  eax                             ;0x0041e5a1 :        a320729300
             jne Label619d56                                                 ;0x0041e5a6 :        0f85aab71f00
             mov  eax , dword ptr [ ebp - 12 ]                               ;0x0041e5ac :        8b45f4
             cmp eax , 0FFFFFFFFh                                            ;0x0041e5af :        83f8ff
             jne Label531e34                                                 ;0x0041e5b2 :        0f857c381100

     Label41e5b8 ::
             mov  ecx , dword ptr [ ebp - 16 ]                               ;0x0041e5b8 :        8b4df0
             xor eax , eax                                                   ;0x0041e5bb :        33c0
             cmp ecx , eax                                                   ;0x0041e5bd :        3bc8
             jne Label4d079c                                                 ;0x0041e5bf :        0f85d7210b00
             mov  edi , dword ptr [esi]                                      ;0x0041e5c5 :        8b3e
             cmp  edi , dword ptr [ Data937108 ]                             ;0x0041e5c7 :        3b3d08719300
             jnb Label619d6c                                                 ;0x0041e5cd :        0f8399b71f00
             mov  ecx , dword ptr [ Data93757c ]                             ;0x0041e5d3 :        8b0d7c759300
             imul edi , edi , 038h                                           ;0x0041e5d9 :        6bff38
             mov  al , byte ptr [ edi + ecx + 44 ]                           ;0x0041e5dc :        8a440f2c
             add edi , ecx                                                   ;0x0041e5e0 :        03f9
             test al , 01h                                                   ;0x0041e5e2 :        a801
             je Label619d76                                                  ;0x0041e5e4 :        0f848cb71f00
             test  byte ptr [ edi + 8 ] , 01h                                ;0x0041e5ea :        f6470801
             jne Label4f18ae                                                 ;0x0041e5ee :        0f85ba320d00

     Label41e5f4 ::
             mov  edx , dword ptr [ ebp + 8 ]                                ;0x0041e5f4 :        8b5508
             mov ecx , ebx                                                   ;0x0041e5f7 :        8bcb
             or ecx , 01000h                                                 ;0x0041e5f9 :        81c900100000
             push ecx                                                        ;0x0041e5ff :        51
             mov  ecx , dword ptr [ ebp - 4 ]                                ;0x0041e600 :        8b4dfc
             push edx                                                        ;0x0041e603 :        52
             mov edx , esi                                                   ;0x0041e604 :        8bd6
             call Fun41dee2                                                  ;0x0041e606 :        e8d7f8ffff
             mov esi , eax                                                   ;0x0041e60b :        8bf0
             test esi , esi                                                  ;0x0041e60d :        85f6
             jne Label619d80                                                 ;0x0041e60f :        0f856bb71f00


     ;
     ;                 ---------------------------------------------------------------------
     ;                      VFP 9.0 FIX - OPEN INDEX FILES WITH THE TABLE AUTOMATICALLY
     ;                                 January 2024
     ;                 ---------------------------------------------------------------------
     ;                                     CCB
     ;
     ; Open index files with the table automatically.
     ;
     ; 2024/1/17, by ccb
     ;

     Label41e614_cdxfiles_start ::
             cmp dword ptr vfpa_sys9144_data,00h
             je Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_incopycommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_increatecommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_inmodifycommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_inimportcommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_inopendatabasecommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_insetclasslibcommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_insetresourcecommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_inaddclasscommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_inbuildcommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_injoincommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_insortcommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_intotalcommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_inselectintotablecommand,00h
             jne Label41e614_cdxfiles_end
             cmp dword ptr vfpa_openindexfiles_inpackdbfcommand,00h
             jne Label41e614_cdxfiles_end
             mov  eax , dword ptr [ ebp - 8 ]
             mov  eax , dword ptr [eax]
             call Fun53b58b
             test  byte ptr [ eax + 8 ] , 10h
             jne Label41e614_cdxfiles_end
             push 02h
             push dword ptr [ ebp - 4 ]
             call vfpa_openindexfiles
             mov esi , eax
             test esi , esi
             jne Label619d80
     Label41e614_cdxfiles_end ::

     Label41e614_idxfiles_start ::
             cmp dword ptr vfpa_sys9145_data,00h
             je Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_incopycommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_increatecommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_inmodifycommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_inimportcommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_inopendatabasecommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_insetclasslibcommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_insetresourcecommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_inaddclasscommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_inbuildcommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_injoincommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_insortcommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_intotalcommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_inselectintotablecommand,00h
             jne Label41e614_idxfiles_end
             cmp dword ptr vfpa_openindexfiles_inpackdbfcommand,00h
             jne Label41e614_idxfiles_end
             mov  eax , dword ptr [ ebp - 8 ]
             mov  eax , dword ptr [eax]
             call Fun53b58b
             test  byte ptr [ eax + 8 ] , 10h
             jne Label41e614_idxfiles_end
             push 03h
             push dword ptr [ ebp - 4 ]
             call vfpa_openindexfiles
             mov esi , eax
             test esi , esi
             jne Label619d80
     Label41e614_idxfiles_end ::


     Label41e615 ::
             pop edi                                                         ;0x0041e615 :        5f
             mov eax , esi                                                   ;0x0041e616 :        8bc6
             pop esi                                                         ;0x0041e618 :        5e
             pop ebx                                                         ;0x0041e619 :        5b
             mov esp , ebp                                                   ;0x0041e61a :        8be5
             pop ebp                                                         ;0x0041e61c :        5d
             ret 08h                                                         ;0x0041e61d :        c20800


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.

     IMPORTANT NOTE:
     The following commands will open index files with the table automatically:
     ALTER - SQL command
     DELETE - SQL command
     DO FORM command - DataEnvironment object
     INSERT - SQL command
     LABEL FORM command - DataEnvironment object
     REPORT FORM command - DataEnvironment object
     SELECT - SQL command
     UPDATE - SQL command
     USE command

     The following commands will not open index files with the (destination) table automatically:
     ADD CLASS command
     BUILD command
     COPY command
     CREATE command
     IMPORT command
     JOIN command
     MODIFY command
     OPEN DATABASE command
     PACK command
     SELECT ... INTO CURSOR NOFILTER - SQL command
     SELECT ... INTO TABLE - SQL command
     SET CLASSLIB command
     SET RESOURCE command
     SORT command
     TOTAL command

     The following functions will not open index files with the table (cursor) automatically:
     SQLCOLUMNS() function
     SQLEXEC() function
     SQLMORERESULTS() function
     SQLPREPARE() function
     SQLTABLES() function
     XMLTOCURSOR() function

     When VFP Advanced opening the following table files, it will not open index files automatically:
     Database table files (.dbc, .dct, .dcx)
     Form table files (.scx, .sct)
     Label table files (.lbx, .lbt)
     Menu table files (.mnx, .mnt)
     Project table files (.pjx, .pjt)
     Report table files (.frx, .frt)
     Table files without a file extension
     Temporary table (cursor) files (.tmp)
     Visual class library table files (.vcx, .vct)

     For the COPY ... WITH CDX command, it will copy structural compound index files (tablefilename+".cdx").
     If we enable opening nonstructural compound index files with the table automatically in Visual FoxPro Advanced,
     it will also copy nonstructural structural compound index files (tablefilename+"_index*.cdx").
     If we enable opening standalone index files with the table automatically in Visual FoxPro Advanced,
     it will also copy standalone index files (tablefilename+"_index*.idx").


5. REFERENCE WEBSITES:

     1, baiyujia.com:
     http://www.baiyujia.com
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix298.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix299.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix300.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix302.asp


6. OTHER:

     For reference only, there is no guarantees.

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