-----------------------------------------------------------------------------------------
                      VFP 9.0 FIX - THE NUMBER OF TIMES TO TRY AGAIN AFTER OPEN FILE EXCLUSIVE FAILED
                                 January 2020
                 -----------------------------------------------------------------------------------------
                                     CCB



1. BUG:

     In vfp9 (and vfp6, vfp7, vfp8), somtimes the open file exclusive command runs failed on Windows Vista or later.


2. CAUSE:

     There are some compatible problems when the open file exclusive command calls the CreateFileA Windows API
     for the Windows Defender program or the antivirus programs.
     Now if the open file exclusive command calls the CreateFileA Windows API failed,
     it will call the CreateFileA Windows API many times again.

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun42cf7b :: ; proc near
             sub esp , 010Ch                                                 ;0x0042cf7b :        81ec0c010000
             mov eax ,  dword ptr [ Data937090 ]                             ;0x0042cf81 :        a190709300
             push ebp                                                        ;0x0042cf86 :        55
             push esi                                                        ;0x0042cf87 :        56
             push edi                                                        ;0x0042cf88 :        57
             mov  edi , SetErrorMode                           ;0x0042cf89 :        8b3d04719100
             pushd 08001h                                                    ;0x0042cf8f :        6801800000
             mov  dword ptr [ esp + 0118h ] , eax                            ;0x0042cf94 :        89842418010000
             call edi                                                        ;0x0042cf9b :        ffd7
             mov  esi , dword ptr [ esp + 011Ch ]                            ;0x0042cf9d :        8bb4241c010000
             mov ebp , eax                                                   ;0x0042cfa4 :        8be8
             lea eax ,  dword ptr [ esp + 12 ]                               ;0x0042cfa6 :        8d44240c
             mov ecx , eax                                                   ;0x0042cfaa :        8bc8
             cmp ecx , esi                                                   ;0x0042cfac :        3bce
             je Label598206                                                  ;0x0042cfae :        0f8452b21600
             lea ecx ,  dword ptr [ esp + 12 ]                               ;0x0042cfb4 :        8d4c240c
             mov edx , 0105h                                                 ;0x0042cfb8 :        ba05010000
             sub esi , ecx                                                   ;0x0042cfbd :        2bf1
             lea ebx ,  dword ptr [ebx]                                      ;0x0042cfbf :        8d1b

     Label42cfc1 ::
             mov  cl , byte ptr [ esi + eax ]                                ;0x0042cfc1 :        8a0c06
             dec edx                                                         ;0x0042cfc4 :        4a
             test cl , cl                                                    ;0x0042cfc5 :        84c9
             je Label42cef5                                                  ;0x0042cfc7 :        0f8428ffffff
             mov  byte ptr [eax] , cl                                        ;0x0042cfcd :        8808
             inc eax                                                         ;0x0042cfcf :        40
             test edx , edx                                                  ;0x0042cfd0 :        85d2
             jbe Label42cef5                                                 ;0x0042cfd2 :        0f861dffffff
             jmp Label42cfc1                                                 ;0x0042cfd8 :        ebe7

     Label42cef5 ::
             mov  byte ptr [eax] , 00h                                       ;0x0042cef5 :        c60000

     Label42cef8 ::
             mov  edx , dword ptr [ esp + 0120h ]                            ;0x0042cef8 :        8b942420010000
             mov  eax , dword ptr [edx]                                      ;0x0042ceff :        8b02
             test  byte ptr ah , 02h                                         ;0x0042cf01 :        f6c402
             jne Label43d8d9                                                 ;0x0042cf04 :        0f85cf090100
             mov cl , al                                                     ;0x0042cf0a :        8ac8
             and cl , 04h                                                    ;0x0042cf0c :        80e104
             neg cl                                                          ;0x0042cf0f :        f6d9
             sbb ecx , ecx                                                   ;0x0042cf11 :        1bc9
             and ecx , 0FFFFFFFDh                                            ;0x0042cf13 :        83e1fd
             add ecx , 03h                                                   ;0x0042cf16 :        83c103

     Label42cf19 ::
             test al , 01h                                                   ;0x0042cf19 :        a801
             je Label43480d                                                  ;0x0042cf1b :        0f84ec780000
             mov eax , 080000000h                                            ;0x0042cf21 :        b800000080

     Label42cf26 ::

     
     ;
     ;                 -----------------------------------------------------------------------------------------
     ;                      VFP 9.0 FIX - THE NUMBER OF TIMES TO TRY AGAIN AFTER OPEN FILE EXCLUSIVE FAILED
     ;                                 January 2020
     ;                 -----------------------------------------------------------------------------------------
     ;                                     CCB
     ;
     ; The number of times to try again after open file exclusive failed.
     ;
     ; 2020/1/29, by ccb
     ;

     ;         pushd 00h                                                       ;0x0042cf26 :        6a00
     ;         pushd 080h                                                      ;0x0042cf28 :        6880000000
     ;         pushd 03h                                                       ;0x0042cf2d :        6a03
     ;         pushd 00h                                                       ;0x0042cf2f :        6a00
     ;         push ecx                                                        ;0x0042cf31 :        51
     ;         push eax                                                        ;0x0042cf32 :        50
     ;         lea edx ,  dword ptr [ esp + 36 ]                               ;0x0042cf33 :        8d542424
     ;         push edx                                                        ;0x0042cf37 :        52
     ;         call  CreateFileA                                 ;0x0042cf38 :        ff15f8719100

             mov dword ptr vfpa_filetostr_createfile_cnt,00h
             mov dword ptr vfpa_filetostr_createfile_access,eax
             mov dword ptr vfpa_filetostr_createfile_sharemode,ecx
             mov dword ptr vfpa_filetostr_createfile_flags,80h

     Label42cf26_isopenfileexclusive_start ::
             cmp dword ptr vfpa_filetostr_createfile_sharemode,00h
             jne Label42cf26_isopenfileexclusive_end
             cmp dword ptr vfpa_sys9029_data,00h
             je Label42cf26_isopenfileexclusive_end
             jmp Label42cf27_isopenfileexclusive_createfile
     Label42cf26_isopenfileexclusive_end ::
             jmp Label42cf27

     Label42cf27_isopenfileexclusive_createfile ::
             pushd 00h
             push dword ptr vfpa_filetostr_createfile_flags
             pushd 03h
             pushd 00h
             push dword ptr vfpa_filetostr_createfile_sharemode
             push dword ptr vfpa_filetostr_createfile_access
             lea edx ,  dword ptr [ esp + 36 ]
             push edx
             call  CreateFileA
             cmp eax , 0FFFFFFFFh
             jne Label42cf28
             call GetLastError
             mov ecx , eax
             mov eax , 0FFFFFFFFh
             cmp ecx , 02h
             je Label42cf28
             cmp ecx , 03h
             je Label42cf28
             lea edx ,  dword ptr [ esp + 12 ]
             push edx
             call lstrlenA
             lea edx ,  dword ptr [ esp + 12 ]
             add edx , eax
             dec edx
             mov eax , 0FFFFFFFFh
             cmp byte ptr [edx],"\"
             je Label42cf28
             mov ecx,dword ptr vfpa_sys9029_data
             inc dword ptr vfpa_filetostr_createfile_cnt
             cmp dword ptr vfpa_filetostr_createfile_cnt,ecx
             ja Label42cf28
             pushd 032h
             call  Sleep
             jmp Label42cf27_isopenfileexclusive_createfile

     Label42cf27 ::
             pushd 00h
             push dword ptr vfpa_filetostr_createfile_flags
             pushd 03h
             pushd 00h
             push dword ptr vfpa_filetostr_createfile_sharemode
             push dword ptr vfpa_filetostr_createfile_access
             lea edx ,  dword ptr [ esp + 36 ]
             push edx
             call  CreateFileA
             cmp eax , 0FFFFFFFFh
             jne Label42cf28
             lea edx ,  dword ptr [ esp + 12 ]
             push edx
             call lstrlenA
             lea edx ,  dword ptr [ esp + 12 ]
             add edx , eax
             dec edx
             mov eax , 0FFFFFFFFh
             cmp byte ptr [edx],"\"
             je Label42cf28

     Label42cf27_createfile_cnt ::
             inc dword ptr vfpa_filetostr_createfile_cnt
             cmp dword ptr vfpa_filetostr_createfile_cnt,03h
             ja Label42cf28
             pushd 032h
             call  Sleep
             jmp Label42cf27

     Label42cf28 ::
     ;         mov dword ptr vfpa_filetostr_isfiletostr,00h
     ;         mov dword ptr vfpa_filetostr_isfiletostr2,00h
     ;         mov dword ptr vfpa_filetostr_isfiletostr3,00h
     ;         mov dword ptr vfpa_strtofile_isstrtofile,00h
     ;         mov dword ptr vfpa_strtofile_isstrtofile2,00h
     ;         mov dword ptr vfpa_strtofile_isstrtofile3,00h
     ;         mov dword ptr vfpa_buildexe_isbuildexe,00h
     ;         mov dword ptr vfpa_buildexe_isbuildexe2,00h
     ;         mov dword ptr vfpa_buildexe_isbuildexe3,00h

     
             push ebp                                                        ;0x0042cf3e :        55
             mov  dword ptr [ebx] , eax                                      ;0x0042cf3f :        8903
             call edi                                                        ;0x0042cf41 :        ffd7
             cmp  dword ptr [ebx] , 0FFFFFFFFh                               ;0x0042cf43 :        833bff
             je Label43d3c1                                                  ;0x0042cf46 :        0f8475040100
             mov  edi , dword ptr [ esp + 0120h ]                            ;0x0042cf4c :        8bbc2420010000
             mov  ecx , dword ptr [ esp + 011Ch ]                            ;0x0042cf53 :        8b8c241c010000
             xor esi , esi                                                   ;0x0042cf5a :        33f6
             call Fun43195e                                                  ;0x0042cf5c :        e8fd490000

     Label42cf61 ::
             mov  ecx , dword ptr [ esp + 0114h ]                            ;0x0042cf61 :        8b8c2414010000
             pop edi                                                         ;0x0042cf68 :        5f
             mov eax , esi                                                   ;0x0042cf69 :        8bc6
             pop esi                                                         ;0x0042cf6b :        5e
             pop ebp                                                         ;0x0042cf6c :        5d
             call Fun42bf1d                                                  ;0x0042cf6d :        e8abefffff
             add esp , 010Ch                                                 ;0x0042cf72 :        81c40c010000
             ret 08h                                                         ;0x0042cf78 :        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.


5. REFERENCE WEBSITES:

     1, baiyujia.com:
     http://www.baiyujia.com
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix107.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix65.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix66.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix67.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix68.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix69.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix70.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix71.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix72.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix73.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix74.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix84.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix85.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix109.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix110.asp

     2, microsoft.com:
     https://blogs.msdn.microsoft.com/oldnewthing/20120907-00/?p=6663


6. OTHER:

     For reference only, there is no guarantees.

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