--------------------------------------------------------------- [BUG/PRB.] VFP 9.0 FIX - ADIR() FUNCTION January 2024 --------------------------------------------------------------- CCB 1. BUG: In vfp9 (and vfp6, vfp7, vfp8), the ADIR() function can only return file size information when the file size < 2 GB, now the ADIR() function can return file size information when the file size > 2 GB. There is a test program from Mr. Luiz Carlos: *PROC testadirfunction SET STEP OFF SET ECHO OFF SET DEBUG OFF SET ESCAPE OFF SET TALK OFF SET SAFETY OFF PRIVATE m.q_file m.q_file="TMP"+REPL("1234567890",5)+".TMP" PRIVATE m.q_hand m.q_hand=FCREATE(m.q_file) =FCHSIZE(m.q_hand,2147483647) && 2^31-1 =FCLOSE(m.q_hand) =ADIR(afiles,m.q_file) DISPLAY MEMO LIKE afiles WAIT ? afiles(1,2) && size with very strange zeros ? INT(afiles(1,2)) && returns wrong size ? 2147484160 = afiles(1,2) && the Fox prints .t. Why? WAIT IF FILE(m.q_file) DELETE FILE (m.q_file) ENDI RETURN * END OF PROC TESTADIRFUNCTION. We think 2147484160 != afiles(1,2), but sometimes vfp displays the result to true (.T.). 2. CAUSE: In vfp6, vfp7 and vfp8, for the ADIR() function, when the file size < 2 GB, there is no problem, when the file size between 2 GB and 4GB, it returns the file size to a negative number, when the file size >= 4 GB, it returns the file size to MOD(filesize,4GB). In vfp9, for the ADIR() function, when the file size < 2 GB - 1, there is no problem, when the file size >= 2 GB - 1, it returns the file size to a positive number, but the file size is a Numeric data with decimal places. For example, the length of the file name is 50, the file size is 2147483647.00000000000000000000000000000000000000000000000000. Please refer to the SET DECIMALS Command, the maximum number of decimal places is 18 (in fact, the maximum number of decimal places is 22 for vfp internal using). If the number of decimal places > 22, the value of a Numeric data is incorrect. In Visual FoxPro Advanced, for the ADIR() function, when the file size < 2 GB - 1, it returns the file size to a Integer data, when the file size >= 2 GB - 1, it returns the file size to a Numeric data without decimal places (N(15,0)), so there is no any problem. There are some BUGs in the following code. 3. RESOLUTION: We can write some code to fix the BUG. Fun4a7736 :: ; proc near push ebp ;0x004a7736 : 55 lea ebp , dword ptr [ esp - 116 ] ;0x004a7737 : 8d6c248c sub esp , 014Ch ;0x004a773b : 81ec4c010000 mov eax , dword ptr [ Data937090 ] ;0x004a7741 : a190709300 and dword ptr [ ebp + 0FFFFFF34h ] , 00h ;0x004a7746 : 83a534ffffff00 push ebx ;0x004a774d : 53 push edi ;0x004a774e : 57 pushd 04Bh ;0x004a774f : 6a4b mov dword ptr [ ebp + 112 ] , eax ;0x004a7751 : 894570 xor eax , eax ;0x004a7754 : 33c0 pop ecx ;0x004a7756 : 59 lea edi , dword ptr [ ebp + 0FFFFFF38h ] ;0x004a7757 : 8dbd38ffffff rep stosd ;0x004a775d : f3ab mov edi , dword ptr [ ebp + 124 ] ;0x004a775f : 8b7d7c test byte ptr [ edi + 011Ah ] , 010h ;0x004a7762 : f6871a01000010 jne Label563657 ;0x004a7769 : 0f85e8be0b00 Label4a776f :: and dword ptr [ ebp + 0FFFFFF3Ch ] , 00h ;0x004a776f : 83a53cffffff00 mov ebx , 0100h ;0x004a7776 : bb00010000 lea ecx , dword ptr [ edi + 0128h ] ;0x004a777b : 8d8f28010000 mov edx , ebx ;0x004a7781 : 8bd3 lea eax , dword ptr [ ebp + 0FFFFFF64h ] ;0x004a7783 : 8d8564ffffff mov byte ptr [ ebp + 0FFFFFF38h ] , 043h ;0x004a7789 : c68538ffffff43 call Fun42c33e ;0x004a7790 : e8a94bf8ff mov edx , ebx ;0x004a7795 : 8bd3 lea ecx , dword ptr [ ebp + 0FFFFFF64h ] ;0x004a7797 : 8d8d64ffffff call Fun41b81c ;0x004a779d : e87a40f7ff xor ebx , ebx ;0x004a77a2 : 33db push ebx ;0x004a77a4 : 53 mov edx , esi ;0x004a77a5 : 8bd6 lea ecx , dword ptr [ ebp + 0FFFFFF38h ] ;0x004a77a7 : 8d8d38ffffff mov dword ptr [ ebp + 0FFFFFF40h ] , eax ;0x004a77ad : 898540ffffff call Fun52bf26 ;0x004a77b3 : e86e470800 inc dword ptr [ esi + 12 ] ;0x004a77b8 : ff460c cmp dword ptr [ ebp + 0FFFFFF34h ] , ebx ;0x004a77bb : 399d34ffffff mov byte ptr [ ebp + 0FFFFFF38h ] , 049h ;0x004a77c1 : c68538ffffff49 mov dword ptr [ ebp + 0FFFFFF3Ch ] , 0Ah ;0x004a77c8 : c7853cffffff0a000000 jne Label563666 ;0x004a77d2 : 0f858ebe0b00 mov eax , dword ptr [ edi + 0124h ] ;0x004a77d8 : 8b8724010000 cmp eax , ebx ;0x004a77de : 3bc3 jne Label563671 ;0x004a77e0 : 0f858bbe0b00 mov ecx , dword ptr [ edi + 0120h ] ;0x004a77e6 : 8b8f20010000 cmp ecx , 07FFFFFFFh ;0x004a77ec : 81f9ffffff7f jnb Label563671 ;0x004a77f2 : 0f8379be0b00 mov dword ptr [ ebp + 0FFFFFF44h ] , ecx ;0x004a77f8 : 898d44ffffff Label4a77fe :: push ebx ;0x004a77fe : 53 mov edx , esi ;0x004a77ff : 8bd6 lea ecx , dword ptr [ ebp + 0FFFFFF38h ] ;0x004a7801 : 8d8d38ffffff call Fun52bf26 ;0x004a7807 : e81a470800 inc dword ptr [ esi + 12 ] ;0x004a780c : ff460c mov eax , dword ptr [ edi + 011Ch ] ;0x004a780f : 8b871c010000 mov dword ptr [ ebp + 124 ] , eax ;0x004a7815 : 89457c movzx eax ,word ptr [ ebp + 126 ] ;0x004a7818 : 0fb7457e mov ecx , eax ;0x004a781c : 8bc8 mov ebx , eax ;0x004a781e : 8bd8 shr ecx , 09h ;0x004a7820 : c1e909 shr eax , 05h ;0x004a7823 : c1e805 add ecx , 07BCh ;0x004a7826 : 81c1bc070000 and ebx , 01Fh ;0x004a782c : 83e31f and eax , 0Fh ;0x004a782f : 83e00f call Fun425db9 ;0x004a7832 : e882e5f7ff xor ebx , ebx ;0x004a7837 : 33db push ebx ;0x004a7839 : 53 fstp qword ptr [ ebp + 0FFFFFF48h ] ;0x004a783a : dd9d48ffffff mov edx , esi ;0x004a7840 : 8bd6 lea ecx , dword ptr [ ebp + 0FFFFFF38h ] ;0x004a7842 : 8d8d38ffffff mov byte ptr [ ebp + 0FFFFFF38h ] , 044h ;0x004a7848 : c68538ffffff44 call Fun52bf26 ;0x004a784f : e8d2460800 mov eax , dword ptr [ ebp + 124 ] ;0x004a7854 : 8b457c xor ecx , ecx ;0x004a7857 : 33c9 mov cl , al ;0x004a7859 : 8ac8 inc dword ptr [ esi + 12 ] ;0x004a785b : ff460c and ecx , 01Fh ;0x004a785e : 83e11f shl ecx , 1 ;0x004a7861 : d1e1 movsx ecx , cx ;0x004a7863 : 0fbfc9 push ecx ;0x004a7866 : 51 mov ecx , eax ;0x004a7867 : 8bc8 shr ax , 0Bh ;0x004a7869 : 66c1e80b shr ecx , 05h ;0x004a786d : c1e905 movsx eax , ax ;0x004a7870 : 0fbfc0 and ecx , 03Fh ;0x004a7873 : 83e13f push ecx ;0x004a7876 : 51 push eax ;0x004a7877 : 50 lea eax , dword ptr [ ebp + 0FFFFFF64h ] ;0x004a7878 : 8d8564ffffff pushd offset Data920a9c ;0x004a787e : 689c0a9200 push eax ;0x004a7883 : 50 call Fun43089c ;0x004a7884 : e81390f8ff add esp , 014h ;0x004a7889 : 83c414 push ebx ;0x004a788c : 53 mov edx , esi ;0x004a788d : 8bd6 lea ecx , dword ptr [ ebp + 0FFFFFF38h ] ;0x004a788f : 8d8d38ffffff mov byte ptr [ ebp + 0FFFFFF38h ] , 043h ;0x004a7895 : c68538ffffff43 mov dword ptr [ ebp + 0FFFFFF3Ch ] , ebx ;0x004a789c : 899d3cffffff mov dword ptr [ ebp + 0FFFFFF40h ] , 08h ;0x004a78a2 : c78540ffffff08000000 call Fun52bf26 ;0x004a78ac : e875460800 inc dword ptr [ esi + 12 ] ;0x004a78b1 : ff460c mov al , byte ptr [ edi + 011Ah ] ;0x004a78b4 : 8a871a010000 mov dl , al ;0x004a78ba : 8ad0 and dl , 01h ;0x004a78bc : 80e201 neg dl ;0x004a78bf : f6da sbb dl , dl ;0x004a78c1 : 1ad2 and dl , 024h ;0x004a78c3 : 80e224 mov cl , 02Eh ;0x004a78c6 : b12e add dl , cl ;0x004a78c8 : 02d1 mov byte ptr [ ebp + 0FFFFFF64h ] , dl ;0x004a78ca : 889564ffffff mov dl , al ;0x004a78d0 : 8ad0 and dl , 020h ;0x004a78d2 : 80e220 neg dl ;0x004a78d5 : f6da sbb dl , dl ;0x004a78d7 : 1ad2 and dl , 013h ;0x004a78d9 : 80e213 add dl , cl ;0x004a78dc : 02d1 mov byte ptr [ ebp + 0FFFFFF65h ] , dl ;0x004a78de : 889565ffffff mov dl , al ;0x004a78e4 : 8ad0 and dl , 04h ;0x004a78e6 : 80e204 neg dl ;0x004a78e9 : f6da sbb dl , dl ;0x004a78eb : 1ad2 and dl , 025h ;0x004a78ed : 80e225 and al , 02h ;0x004a78f0 : 2402 add dl , cl ;0x004a78f2 : 02d1 neg al ;0x004a78f4 : f6d8 sbb al , al ;0x004a78f6 : 1ac0 and al , 01Ah ;0x004a78f8 : 241a mov byte ptr [ ebp + 0FFFFFF38h ] , 043h ;0x004a78fa : c68538ffffff43 mov dword ptr [ ebp + 0FFFFFF3Ch ] , ebx ;0x004a7901 : 899d3cffffff mov byte ptr [ ebp + 0FFFFFF66h ] , dl ;0x004a7907 : 889566ffffff add al , cl ;0x004a790d : 02c1 cmp dword ptr [ ebp + 0FFFFFF34h ] , ebx ;0x004a790f : 399d34ffffff mov byte ptr [ ebp + 0FFFFFF67h ] , al ;0x004a7915 : 888567ffffff sete al ;0x004a791b : 0f94c0 dec al ;0x004a791e : fec8 and al , 016h ;0x004a7920 : 2416 add al , cl ;0x004a7922 : 02c1 push ebx ;0x004a7924 : 53 mov edx , esi ;0x004a7925 : 8bd6 lea ecx , dword ptr [ ebp + 0FFFFFF38h ] ;0x004a7927 : 8d8d38ffffff mov byte ptr [ ebp + 0FFFFFF68h ] , al ;0x004a792d : 888568ffffff mov byte ptr [ ebp + 0FFFFFF69h ] , bl ;0x004a7933 : 889d69ffffff mov dword ptr [ ebp + 0FFFFFF40h ] , 05h ;0x004a7939 : c78540ffffff05000000 call Fun52bf26 ;0x004a7943 : e8de450800 mov ecx , dword ptr [ ebp + 112 ] ;0x004a7948 : 8b4d70 inc dword ptr [ esi + 12 ] ;0x004a794b : ff460c call Fun42bf1d ;0x004a794e : e8ca45f8ff pop edi ;0x004a7953 : 5f pop ebx ;0x004a7954 : 5b add ebp , 074h ;0x004a7955 : 83c574 leave ;0x004a7958 : c9 ret 04h ;0x004a7959 : c20400 Label563657 :: mov dword ptr [ ebp + 0FFFFFF34h ] , 01h ;0x00563657 : c78534ffffff01000000 jmp Label4a776f ;0x00563661 : e90941f4ff Label563666 :: mov dword ptr [ ebp + 0FFFFFF44h ] , ebx ;0x00563666 : 899d44ffffff jmp Label4a77fe ;0x0056366c : e98d41f4ff Label563671 :: pushd 01h ;0x00563671 : 6a01 push ebx ;0x00563673 : 53 push ebx ;0x00563674 : 53 push eax ;0x00563675 : 50 mov byte ptr [ ebp + 0FFFFFF38h ] , 04Eh ;0x00563676 : c68538ffffff4e ; ; ---------------------------------------------------- ; VFP 9.0 FIX - ADIR() FUNCTION ; November 2021 ; ---------------------------------------------------- ; CCB ; ; In vfp9, the ADIR() function can only return file size information when the file size < 2 GB, ; now the ADIR() function can return file size information when the file size > 2 GB. ; ; 2021/11/23, by ccb ; mov dword ptr [ ebp + 0FFFFFF38h + 4 ] , 0Fh mov dword ptr [ ebp + 0FFFFFF38h + 8 ] , 00h call Fun4351c6 ;0x0056367d : e8441bedff mov ecx , dword ptr [ edi + 0120h ] ;0x00563682 : 8b8f20010000 xor ebx , ebx ;0x00563688 : 33db add eax , ecx ;0x0056368a : 03c1 adc edx , ebx ;0x0056368c : 13d3 mov dword ptr [ ebp + 0FFFFFF28h ] , eax ;0x0056368e : 898528ffffff mov dword ptr [ ebp + 0FFFFFF2Ch ] , edx ;0x00563694 : 89952cffffff fild qword ptr [ ebp + 0FFFFFF28h ] ;0x0056369a : dfad28ffffff fstp qword ptr [ ebp + 0FFFFFF48h ] ;0x005636a0 : dd9d48ffffff jmp Label4a77fe ;0x005636a6 : e95341f4ff 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_vfp9fix101.asp 6. OTHER: For reference only, there is no guarantees. Any questions or suggestions, please send me an email at ccb2000@163.com. |