-------------------------------------------------------------------------------------------------
                      [ENHANCED] VFP 9.0 FIX - THE OS() FUNCTION RETURNS THE NEW OPERATING SYSTEM INFORMATION
                                 January 2024
                 -------------------------------------------------------------------------------------------------
                                     CCB



1. BUG:

     In vfp9 (and vfp6, vfp7, vfp8), the OS() function always returns "Windows 6.02" on Windows 8.1 or later.

     In VFP Advanced, usually the OS() function returns "Windows 10.00" on Windows 10.
     For backward compatibility, we can disable the OS() function returns the new operating system information,
     then the OS() function will return "Windows 6.02" on Windows 8.1 or later.

     There is a program for test:

     *PROC testosfunction

     SET STEP OFF
     SET ECHO OFF
     SET DEBUG OFF
     SET ESCAPE OFF
     SET TALK OFF
     SET SAFETY OFF

     _SCREEN.VISIBLE=.T.
     _SCREEN.WINDOWSTATE=2

     SET EXCLUSIVE OFF
     SET MULTILOCK ON
     SET COLLATE TO "MACHINE"

     CLOSE DATABASES ALL
     CLOSE TABLES ALL

     ?"OS() = "+OS()
     ?"OS(1) = "+OS(1)
     ?"OS(2) = "+OS(2)
     ?"OS(3) = "+OS(3)
     ?"OS(4) = "+OS(4)
     ?"OS(5) = "+OS(5)
     ?"OS(6) = "+OS(6)
     ?"OS(7) = "+OS(7)
     ?"OS(8) = "+OS(8)
     ?"OS(9) = "+OS(9)
     ?"OS(10) = "+OS(10)
     ?"OS(11) = "+OS(11)
     WAIT

     CLOSE DATABASES ALL
     CLOSE TABLES ALL

     RETURN

     * END OF PROC TESTOSFUNCTION.


2. CAUSE:

     For some reasons, the GetVersion and GetVersionEx Windows API can't work correctly on Windows 8.1 or later,
     please refer to:
     https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx

     In vfp9 (and vfp6, vfp7, vfp8), the OS() function uses the GetVersionEx Windows API to get the operating system version information,
     so it always returns "Windows 6.02" on Windows 8.1 or later.


3. RESOLUTION:

     We can write some code to fix the BUG.

     vfpa_getversionexa :: ; proc near

     push ebp
     mov ebp,esp
     sub esp,04h
     push ebx
     push esi
     push edi

     mov eax,dword ptr [ebp+08h]
     push eax
     call GetVersionExA

     mov dword ptr [ebp-04h],eax

     cmp dword ptr vfpa_sys9019_data,00h
     je vfpa_getversionexa_end

     mov edi,dword ptr [ebp+08h]

     ; dwMajorVersion
     mov eax,dword ptr fs:[30h]
     mov eax,dword ptr [eax+0A4h]
     mov dword ptr [edi+04h],eax

     ; dwMinorVersion
     mov eax,dword ptr fs:[30h]
     mov eax,dword ptr [eax+0A8h]
     mov dword ptr [edi+08h],eax

     ; dwBuildNumber
     mov eax,dword ptr fs:[30h]
     movzx eax,word ptr [eax+0ACh]
     mov dword ptr [edi+0Ch],eax

     ; dwPlatformId
     mov eax,dword ptr fs:[30h]
     mov eax,dword ptr [eax+0B0h]
     mov dword ptr [edi+10h],eax

     vfpa_getversionexa_end:
     pop edi
     pop esi
     pop ebx
     mov eax,dword ptr [ebp-04h]
     mov esp,ebp
     pop ebp
     ret 04h

     ; vfpa_getversionexa endp

     We can use the vfpa_getversionexa() function instead of the GetVersionEx Windows API,
     then the OS() function can return the operating system version information correctly on Windows 8.1 or later.

     Please refer to the picture os-windows10.jpg:


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:
     Please use the OS() function carefully.
     For example, the following code can not run fine in VFP Advanced:
     IF OS(3) >= "6" && OS(3) = "10" on Windows 10 in VFP Advanced, it's wrong!
     Recommend to use the following code:
     IF VAL(OS(3)) >= 6 && VAL(OS(3)) = 10 on Windows 10 in VFP Advanced, it's ok.


5. REFERENCE WEBSITES:

     1, baiyujia.com:
     http://www.baiyujia.com
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix78.asp

     2, microsoft.com:
     https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx
     https://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx
     https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx

     3, foxite.com:
     https://www.foxite.com/archives/detect-difference-between-8-and-81-0000420484.htm
     https://www.foxite.com/archives/exporttoxlsx-vfp-10-tochuanbing-chen-0000434139.htm

     4, mattslay.com:
     http://www.mattslay.com/does-microsoft-visual-foxpro-run-on-windows-10/


6. OTHER:

     For reference only, there is no guarantees.

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