-------------------------------------------------------------------------------------
                      [BUG/PRB.] VFP 9.0 FIX - CHECK AVAILABLE WORK AREA FOR OPENING A TABLE FILE
                                November 2024
                 -------------------------------------------------------------------------------------
                                     CCB



1. BUG:

     If we enable checking available work area for opening a table file in Visual FoxPro Advanced,
     if the work area number > the maximum number of work areas (32767), it will cause the error "Table number is invalid (Error 17)".
     It is the startup default for Visual FoxPro Advanced.

     If we disable checking available work area for opening a table file in Visual FoxPro Advanced,
     if the work area number > the maximum number of work areas (32767), we can open the table file,
     but if we use the SELECT nWorkArea command to select the work area, it will cause the error "Table number is invalid (Error 17)",
     so we can't use the SELECT nWorkArea command to select the work area, we can only use the SELECT cTableAlias command to select the work area.
     It is the same as Visual FoxPro 9.0 and earlier versions.


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun41e378 :: ; proc near
             push ebp                                                        ;0x0041e378 :        55
             mov ebp , esp                                                   ;0x0041e379 :        8bec
             push ecx                                                        ;0x0041e37b :        51
             mov  ecx , dword ptr [ ebp + 8 ]                                ;0x0041e37c :        8b4d08
             push ebx                                                        ;0x0041e37f :        53
             push esi                                                        ;0x0041e380 :        56
             mov  esi , dword ptr [ecx]                                      ;0x0041e381 :        8b31
             mov  ebx , dword ptr [ esi + 8 ]                                ;0x0041e383 :        8b5e08
             xor eax , eax                                                   ;0x0041e386 :        33c0
             test ebx , ebx                                                  ;0x0041e388 :        85db
             push edi                                                        ;0x0041e38a :        57
             mov ecx , ebx                                                   ;0x0041e38b :        8bcb
             jne Label42a502                                                 ;0x0041e38d :        0f856fc10000

     Label41e393 ::
             mov  ecx , dword ptr [ esi + 08Ch ]                             ;0x0041e393 :        8b8e8c000000
             test ecx , ecx                                                  ;0x0041e399 :        85c9
             jne Label61a679                                                 ;0x0041e39b :        0f85d8c21f00

     Label41e3a1 ::
             lea edi ,  dword ptr [ eax + 1 ]                                ;0x0041e3a1 :        8d7801
             mov eax , edi                                                   ;0x0041e3a4 :        8bc7
             add eax , 03h                                                   ;0x0041e3a6 :        83c003
             and eax , 0FFFFFFFCh                                            ;0x0041e3a9 :        83e0fc
             mov  dword ptr [ ebp - 4 ] , edi                                ;0x0041e3ac :        897dfc
             call Fun42c118                                                  ;0x0041e3af :        e864dd0000
             mov esi , esp                                                   ;0x0041e3b4 :        8bf4
             test esi , esi                                                  ;0x0041e3b6 :        85f6
             je Label61a68e                                                  ;0x0041e3b8 :        0f84d0c21f00
             mov ecx , edi                                                   ;0x0041e3be :        8bcf
             mov edx , ecx                                                   ;0x0041e3c0 :        8bd1
             shr ecx , 02h                                                   ;0x0041e3c2 :        c1e902
             xor eax , eax                                                   ;0x0041e3c5 :        33c0
             mov edi , esi                                                   ;0x0041e3c7 :        8bfe
             rep stosd                                                       ;0x0041e3c9 :        f3ab
             mov ecx , edx                                                   ;0x0041e3cb :        8bca
             and ecx , 03h                                                   ;0x0041e3cd :        83e103
             test ebx , ebx                                                  ;0x0041e3d0 :        85db
             rep stosb                                                       ;0x0041e3d2 :        f3aa
             mov eax , ebx                                                   ;0x0041e3d4 :        8bc3
             je Label41e3e8                                                  ;0x0041e3d6 :        7410
             mov edi , edi                                                   ;0x0041e3d8 :        8bff

     Label41e3da ::
             mov  ecx , dword ptr [ eax + 68 ]                               ;0x0041e3da :        8b4844
             mov  byte ptr [ esi + ecx ] , 01h                               ;0x0041e3dd :        c6040e01
             mov  eax , dword ptr [ eax + 12 ]                               ;0x0041e3e1 :        8b400c
             test eax , eax                                                  ;0x0041e3e4 :        85c0
             jne Label41e3da                                                 ;0x0041e3e6 :        75f2

     Label41e3e8 ::
             mov  edx , dword ptr [ ebp + 8 ]                                ;0x0041e3e8 :        8b5508
             mov  eax , dword ptr [edx]                                      ;0x0041e3eb :        8b02
             mov  eax , dword ptr [ eax + 08Ch ]                             ;0x0041e3ed :        8b808c000000
             test eax , eax                                                  ;0x0041e3f3 :        85c0
             jne Label61a698                                                 ;0x0041e3f5 :        0f859dc21f00

     Label41e3fb ::
             mov  ecx , dword ptr [ ebp - 4 ]                                ;0x0041e3fb :        8b4dfc
             mov eax , 01h                                                   ;0x0041e3fe :        b801000000
             cmp ecx , eax                                                   ;0x0041e403 :        3bc8
             jle Label41e414                                                 ;0x0041e405 :        7e0d
             lea ebx ,  dword ptr [ebx]                                      ;0x0041e407 :        8d1b

     Label41e409 ::
             cmp  byte ptr [ esi + eax ] , 00h                               ;0x0041e409 :        803c0600
             je Label41e414                                                  ;0x0041e40d :        7405
             inc eax                                                         ;0x0041e40f :        40
             cmp eax , ecx                                                   ;0x0041e410 :        3bc1
             jl Label41e409                                                  ;0x0041e412 :        7cf5

     Label41e414 ::


     ;
     ;                 --------------------------------------------------------------------------
     ;                      VFP 9.0 FIX - CHECK AVAILABLE WORK AREA FOR OPENING A TABLE FILE
     ;                                November 2024
     ;                 --------------------------------------------------------------------------
     ;                                     CCB
     ;
     ; Check available work area for opening a table file.
     ;
     ; 2024/11/22, by ccb
     ;

             cmp dword ptr vfpa_sys9176_data,00h
             je Label41e416
             cmp eax , 01h
             jl Label41e415
             cmp eax , 07FFFh
             jg Label41e415
             jmp Label41e416
     Label41e415 ::
             mov ecx , 0E4h
             call Fun544742


     Label41e416 ::
             lea esp ,  dword ptr [ ebp - 16 ]                               ;0x0041e414 :        8d65f0
             pop edi                                                         ;0x0041e417 :        5f
             pop esi                                                         ;0x0041e418 :        5e
             pop ebx                                                         ;0x0041e419 :        5b
             mov esp , ebp                                                   ;0x0041e41a :        8be5
             pop ebp                                                         ;0x0041e41c :        5d
             ret 04h                                                         ;0x0041e41d :        c20400


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_vfp9fix362.asp


6. OTHER:

     For reference only, there is no guarantees.

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