---------------------------------------------------------------------------------
                      [NEW.....] VFP 9.0 FIX - SYS(9027) RETURNS THE PATH OF A SPECIAL FOLDER
                                 January 2024
                 ---------------------------------------------------------------------------------
                                     CCB



1. THE SYS(9027) FUNCTION:

     SYS(9027) - Returns the path of a special folder

     Returns the path of a special folder.

     SYS(9027 [, nValue])

     Parameters
     nValue
     The nValue parameter is a CSIDL constant.
     The range for nValue is 0 to 255. The default value is 0.
     Omitting nValue returns an empty string.

     Return Value
     Character

     Remarks
     The CSIDL constants are defined in shlobj.h:
     #define CSIDL_DESKTOP                   0x0000        // <desktop>
     #define CSIDL_INTERNET                  0x0001        // Internet Explorer (icon on desktop)
     #define CSIDL_PROGRAMS                  0x0002        // Start Menu\Programs
     #define CSIDL_CONTROLS                  0x0003        // My Computer\Control Panel
     #define CSIDL_PRINTERS                  0x0004        // My Computer\Printers
     #define CSIDL_PERSONAL                  0x0005        // My Documents
     #define CSIDL_FAVORITES                 0x0006        // <user name>\Favorites
     #define CSIDL_STARTUP                   0x0007        // Start Menu\Programs\Startup
     #define CSIDL_RECENT                    0x0008        // <user name>\Recent
     #define CSIDL_SENDTO                    0x0009        // <user name>\SendTo
     #define CSIDL_BITBUCKET                 0x000a        // <desktop>\Recycle Bin
     #define CSIDL_STARTMENU                 0x000b        // <user name>\Start Menu
     #define CSIDL_MYDOCUMENTS               CSIDL_PERSONAL //  Personal was just a silly name for My Documents
     #define CSIDL_MYMUSIC                   0x000d        // "My Music" folder
     #define CSIDL_MYVIDEO                   0x000e        // "My Videos" folder
     #define CSIDL_DESKTOPDIRECTORY          0x0010        // <user name>\Desktop
     #define CSIDL_DRIVES                    0x0011        // My Computer
     #define CSIDL_NETWORK                   0x0012        // Network Neighborhood (My Network Places)
     #define CSIDL_NETHOOD                   0x0013        // <user name>\nethood
     #define CSIDL_FONTS                     0x0014        // windows\fonts
     #define CSIDL_TEMPLATES                 0x0015
     #define CSIDL_COMMON_STARTMENU          0x0016        // All Users\Start Menu
     #define CSIDL_COMMON_PROGRAMS           0X0017        // All Users\Start Menu\Programs
     #define CSIDL_COMMON_STARTUP            0x0018        // All Users\Startup
     #define CSIDL_COMMON_DESKTOPDIRECTORY   0x0019        // All Users\Desktop
     #define CSIDL_APPDATA                   0x001a        // <user name>\Application Data
     #define CSIDL_PRINTHOOD                 0x001b        // <user name>\PrintHood
     #define CSIDL_LOCAL_APPDATA             0x001c        // <user name>\Local Settings\Applicaiton Data (non roaming)
     #define CSIDL_ALTSTARTUP                0x001d        // non localized startup
     #define CSIDL_COMMON_ALTSTARTUP         0x001e        // non localized common startup
     #define CSIDL_COMMON_FAVORITES          0x001f
     #define CSIDL_INTERNET_CACHE            0x0020
     #define CSIDL_COOKIES                   0x0021
     #define CSIDL_HISTORY                   0x0022
     #define CSIDL_COMMON_APPDATA            0x0023        // All Users\Application Data
     #define CSIDL_WINDOWS                   0x0024        // GetWindowsDirectory()
     #define CSIDL_SYSTEM                    0x0025        // GetSystemDirectory()
     #define CSIDL_PROGRAM_FILES             0x0026        // C:\Program Files
     #define CSIDL_MYPICTURES                0x0027        // C:\Program Files\My Pictures
     #define CSIDL_PROFILE                   0x0028        // USERPROFILE
     #define CSIDL_SYSTEMX86                 0x0029        // x86 system directory on RISC
     #define CSIDL_PROGRAM_FILESX86          0x002a        // x86 C:\Program Files on RISC
     #define CSIDL_PROGRAM_FILES_COMMON      0x002b        // C:\Program Files\Common
     #define CSIDL_PROGRAM_FILES_COMMONX86   0x002c        // x86 Program Files\Common on RISC
     #define CSIDL_COMMON_TEMPLATES          0x002d        // All Users\Templates
     #define CSIDL_COMMON_DOCUMENTS          0x002e        // All Users\Documents
     #define CSIDL_COMMON_ADMINTOOLS         0x002f        // All Users\Start Menu\Programs\Administrative Tools
     #define CSIDL_ADMINTOOLS                0x0030        // <user name>\Start Menu\Programs\Administrative Tools
     #define CSIDL_CONNECTIONS               0x0031        // Network and Dial-up Connections
     #define CSIDL_COMMON_MUSIC              0x0035        // All Users\My Music
     #define CSIDL_COMMON_PICTURES           0x0036        // All Users\My Pictures
     #define CSIDL_COMMON_VIDEO              0x0037        // All Users\My Video
     #define CSIDL_RESOURCES                 0x0038        // Resource Direcotry
     #define CSIDL_RESOURCES_LOCALIZED       0x0039        // Localized Resource Direcotry
     #define CSIDL_COMMON_OEM_LINKS          0x003a        // Links to All Users OEM specific apps
     #define CSIDL_CDBURN_AREA               0x003b        // USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
     #define CSIDL_COMPUTERSNEARME           0x003d        // Computers Near Me (computered from Workgroup membership)


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun529fca :: ; proc near
             push ebp                                                        ;0x00529fca :        55
             mov ebp , esp                                                   ;0x00529fcb :        8bec
             pushd 0FFFFFFFFh                                                ;0x00529fcd :        6aff
             pushd offset Data922268                                                  ;0x00529fcf :        6868229200
             pushd offset Label9160f9                                                  ;0x00529fd4 :        68f9609100
             mov eax ,  dword ptr fs:[00h]                                   ;0x00529fd9 :        64a100000000
             push eax                                                        ;0x00529fdf :        50
             mov  dword ptr fs:[00h] , esp                                   ;0x00529fe0 :        64892500000000
             push ecx                                                        ;0x00529fe7 :        51
             push ecx                                                        ;0x00529fe8 :        51
             mov eax , 02FBCh                                                ;0x00529fe9 :        b8bc2f0000
             call Fun42c118                                                  ;0x00529fee :        e82521f0ff
             mov eax ,  dword ptr [ Data937090 ]                             ;0x00529ff3 :        a190709300
             mov  dword ptr [ ebp - 28 ] , eax                               ;0x00529ff8 :        8945e4
             push ebx                                                        ;0x00529ffb :        53
             push esi                                                        ;0x00529ffc :        56
             push edi                                                        ;0x00529ffd :        57
             mov  dword ptr [ ebp - 24 ] , esp                               ;0x00529ffe :        8965e8
             xor edi , edi                                                   ;0x0052a001 :        33ff
             mov  dword ptr [ ebp + 0FFFFD114h ] , edi                       ;0x0052a003 :        89bd14d1ffff
             push edi                                                        ;0x0052a009 :        57
             pushd 02710h                                                    ;0x0052a00a :        6810270000
             push edi                                                        ;0x0052a00f :        57
             mov  ebx , dword ptr [ ebp + 8 ]                                ;0x0052a010 :        8b5d08
             mov eax , ebx                                                   ;0x0052a013 :        8bc3
             call Fun529bc5                                                  ;0x0052a015 :        e8abfbffff
             mov  dword ptr [ ebp + 0FFFFD0E4h ] , eax                       ;0x0052a01a :        8985e4d0ffff
             mov  dword ptr [ ebp + 0FFFFD10Ch ] , edi                       ;0x0052a020 :        89bd0cd1ffff
             lea ecx ,  dword ptr [ ebp + 0FFFFFDE0h ]                       ;0x0052a026 :        8d8de0fdffff
             mov  dword ptr [ ebp + 0FFFFD100h ] , ecx                       ;0x0052a02c :        898d00d1ffff
             mov  byte ptr [ ebp + 0FFFFFDE0h ] , 00h                        ;0x0052a032 :        c685e0fdffff00
             movsx eax , ax                                                  ;0x0052a039 :        0fbfc0


     ;
     ;                 ----------------------------------------------------------------------
     ;                      VFP 9.0 FIX - SYS(9027) RETURNS THE PATH OF A SPECIAL FOLDER
     ;                                December 2019
     ;                 ----------------------------------------------------------------------
     ;                                     CCB
     ;
     ; SYS(9027) - Returns the path of a special folder.
     ;
     ; 2019/12/27, by ccb
     ;

             cmp eax,9027
             je vfpa_sys9027_start


             pushd 064h                                                      ;0x0052a03c :        6a64
             pop esi                                                         ;0x0052a03e :        5e
             cmp eax , esi                                                   ;0x0052a03f :        3bc6
             jle Label52a0d0                                                 ;0x0052a041 :        0f8e89001000
             mov ecx , 07EAh                                                 ;0x0052a047 :        b9ea070000
             cmp eax , ecx                                                   ;0x0052a04c :        3bc1
             jg Label52a164                                                  ;0x0052a04e :        0f8f10010000
             je Label609b33                                                  ;0x0052a054 :        0f84d9fa0d00
             mov ecx , 04F6h                                                 ;0x0052a05a :        b9f6040000
             cmp eax , ecx                                                   ;0x0052a05f :        3bc1
             jle Label52b6e0                                                 ;0x0052a061 :        0f8e79160000
             mov ecx , 07DBh                                                 ;0x0052a067 :        b9db070000
             cmp eax , ecx                                                   ;0x0052a06c :        3bc1
             jg Label51f355                                                  ;0x0052a06e :        0f8fe152ffff
             je Label609700                                                  ;0x0052a074 :        0f8486f60d00
             add ecx , 0FFFFFFF9h                                            ;0x0052a07a :        83c1f9
             cmp eax , ecx                                                   ;0x0052a07d :        3bc1
             jg Label4a4938                                                  ;0x0052a07f :        0f8fb3a8f7ff
             je Label4f6b07                                                  ;0x0052a085 :        0f847ccafcff
             sub eax , 04F7h                                                 ;0x0052a08b :        2df7040000
             je Label60951e                                                  ;0x0052a090 :        0f8488f40d00
             dec eax                                                         ;0x0052a096 :        48
             je Label60950f                                                  ;0x0052a097 :        0f8472f40d00
             sub eax , 0E4h                                                  ;0x0052a09d :        2de4000000
             je Label609492                                                  ;0x0052a0a2 :        0f84eaf30d00
             sub eax , 01F4h                                                 ;0x0052a0a8 :        2df4010000
             jne Label462026                                                 ;0x0052a0ad :        0f85737ff3ff
             lea eax ,  dword ptr [ ebp + 0FFFFFDE0h ]                       ;0x0052a0b3 :        8d85e0fdffff
             push eax                                                        ;0x0052a0b9 :        50
             push  dword ptr [ ebp + 12 ]                                    ;0x0052a0ba :        ff750c
             mov edx , ebx                                                   ;0x0052a0bd :        8bd3
             call Fun4dc923                                                  ;0x0052a0bf :        e85f28fbff


4. APPLIES TO:

     VFP 10 (VFP Advanced)


5. REFERENCE WEBSITES:

     1, baiyujia.com:
     http://www.baiyujia.com


6. OTHER:

     For reference only, there is no guarantees.

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