4 * Many of this functions are in SHLWAPI.DLL also
9 #include "debugtools.h"
15 #include "shell32_main.h"
16 #include "wine/undocshell.h"
17 #include "wine/unicode.h"
20 DEFAULT_DEBUG_CHANNEL(shell);
22 #define isSlash(x) ((x)=='\\' || (x)=='/')
24 ########## Combining and Constructing paths ##########
27 /*************************************************************************
28 * PathAppendAW [SHELL32.36]
30 BOOL WINAPI PathAppendAW(
34 if (SHELL_OsIsUnicode())
35 return PathAppendW(lpszPath1, lpszPath2);
36 return PathAppendA(lpszPath1, lpszPath2);
39 /*************************************************************************
40 * PathCombineAW [SHELL32.37]
42 LPVOID WINAPI PathCombineAW(
47 if (SHELL_OsIsUnicode())
48 return PathCombineW( szDest, lpszDir, lpszFile );
49 return PathCombineA( szDest, lpszDir, lpszFile );
52 /*************************************************************************
53 * PathAddBackslashAW [SHELL32.32]
55 LPVOID WINAPI PathAddBackslashAW(LPVOID lpszPath)
57 if(SHELL_OsIsUnicode())
58 return PathAddBackslashW(lpszPath);
59 return PathAddBackslashA(lpszPath);
62 /*************************************************************************
63 * PathBuildRootAW [SHELL32.30]
65 LPVOID WINAPI PathBuildRootAW(LPVOID lpszPath, int drive)
67 if(SHELL_OsIsUnicode())
68 return PathBuildRootW(lpszPath, drive);
69 return PathBuildRootA(lpszPath, drive);
73 Extracting Component Parts
76 /*************************************************************************
77 * PathFindFileNameAW [SHELL32.34]
79 LPVOID WINAPI PathFindFileNameAW(LPCVOID lpszPath)
81 if(SHELL_OsIsUnicode())
82 return PathFindFileNameW(lpszPath);
83 return PathFindFileNameA(lpszPath);
86 /*************************************************************************
87 * PathFindExtensionAW [SHELL32.31]
89 LPVOID WINAPI PathFindExtensionAW(LPCVOID lpszPath)
91 if (SHELL_OsIsUnicode())
92 return PathFindExtensionW(lpszPath);
93 return PathFindExtensionA(lpszPath);
97 /*************************************************************************
98 * PathGetExtensionA [internal]
101 * exported by ordinal
102 * return value points to the first char after the dot
104 static LPSTR PathGetExtensionA(LPCSTR lpszPath)
106 TRACE("(%s)\n",lpszPath);
108 lpszPath = PathFindExtensionA(lpszPath);
109 return (LPSTR)(*lpszPath?(lpszPath+1):lpszPath);
112 /*************************************************************************
113 * PathGetExtensionW [internal]
115 static LPWSTR PathGetExtensionW(LPCWSTR lpszPath)
117 TRACE("(%s)\n",debugstr_w(lpszPath));
119 lpszPath = PathFindExtensionW(lpszPath);
120 return (LPWSTR)(*lpszPath?(lpszPath+1):lpszPath);
123 /*************************************************************************
124 * PathGetExtensionAW [SHELL32.158]
126 LPVOID WINAPI PathGetExtensionAW(LPCVOID lpszPath)
128 if (SHELL_OsIsUnicode())
129 return PathGetExtensionW(lpszPath);
130 return PathGetExtensionA(lpszPath);
133 /*************************************************************************
134 * PathGetArgsAW [SHELL32.52]
136 LPVOID WINAPI PathGetArgsAW(LPVOID lpszPath)
138 if (SHELL_OsIsUnicode())
139 return PathGetArgsW(lpszPath);
140 return PathGetArgsA(lpszPath);
143 /*************************************************************************
144 * PathGetDriveNumber [SHELL32.57]
146 int WINAPI PathGetDriveNumberAW(LPVOID lpszPath)
148 if (SHELL_OsIsUnicode())
149 return PathGetDriveNumberW(lpszPath);
150 return PathGetDriveNumberA(lpszPath);
153 /*************************************************************************
154 * PathRemoveFileSpec [SHELL32.35]
156 BOOL WINAPI PathRemoveFileSpecAW(LPVOID lpszPath)
158 if (SHELL_OsIsUnicode())
159 return PathRemoveFileSpecW(lpszPath);
160 return PathRemoveFileSpecA(lpszPath);
163 /*************************************************************************
164 * PathStripPathAW [SHELL32.38]
166 void WINAPI PathStripPathAW(LPVOID lpszPath)
168 if (SHELL_OsIsUnicode())
169 return PathStripPathW(lpszPath);
170 return PathStripPathA(lpszPath);
173 /*************************************************************************
174 * PathStripToRootAW [SHELL32.50]
176 BOOL WINAPI PathStripToRootAW(LPVOID lpszPath)
178 if (SHELL_OsIsUnicode())
179 return PathStripToRootW(lpszPath);
180 return PathStripToRootA(lpszPath);
183 /*************************************************************************
184 * PathRemoveArgsAW [SHELL32.251]
186 void WINAPI PathRemoveArgsAW(LPVOID lpszPath)
188 if (SHELL_OsIsUnicode())
189 PathRemoveArgsW(lpszPath);
190 PathRemoveArgsA(lpszPath);
193 /*************************************************************************
194 * PathRemoveExtensionAW [SHELL32.250]
196 void WINAPI PathRemoveExtensionAW(LPVOID lpszPath)
198 if (SHELL_OsIsUnicode())
199 return PathRemoveExtensionW(lpszPath);
200 return PathRemoveExtensionA(lpszPath);
208 /*************************************************************************
209 * PathGetShortPathA [internal]
211 LPSTR WINAPI PathGetShortPathA(LPSTR lpszPath)
213 FIXME("%s stub\n", lpszPath);
217 /*************************************************************************
218 * PathGetShortPathW [internal]
220 LPWSTR WINAPI PathGetShortPathW(LPWSTR lpszPath)
222 FIXME("%s stub\n", debugstr_w(lpszPath));
226 /*************************************************************************
227 * PathGetShortPathAW [SHELL32.92]
229 LPVOID WINAPI PathGetShortPathAW(LPVOID lpszPath)
231 if(SHELL_OsIsUnicode())
232 return PathGetShortPathW(lpszPath);
233 return PathGetShortPathA(lpszPath);
236 /*************************************************************************
237 * PathRemoveBlanksAW [SHELL32.33]
239 void WINAPI PathRemoveBlanksAW(LPVOID str)
241 if(SHELL_OsIsUnicode())
242 PathRemoveBlanksW(str);
243 PathRemoveBlanksA(str);
246 /*************************************************************************
247 * PathQuoteSpacesAW [SHELL32.55]
249 LPVOID WINAPI PathQuoteSpacesAW (LPVOID lpszPath)
251 if(SHELL_OsIsUnicode())
252 return PathQuoteSpacesW(lpszPath);
253 return PathQuoteSpacesA(lpszPath);
256 /*************************************************************************
257 * PathUnquoteSpacesAW [SHELL32.56]
259 VOID WINAPI PathUnquoteSpacesAW(LPVOID str)
261 if(SHELL_OsIsUnicode())
262 PathUnquoteSpacesW(str);
264 PathUnquoteSpacesA(str);
267 /*************************************************************************
268 * PathParseIconLocationAW [SHELL32.249]
270 int WINAPI PathParseIconLocationAW (LPVOID lpszPath)
272 if(SHELL_OsIsUnicode())
273 return PathParseIconLocationW(lpszPath);
274 return PathParseIconLocationA(lpszPath);
278 ########## Path Testing ##########
280 /*************************************************************************
281 * PathIsUNCAW [SHELL32.39]
283 BOOL WINAPI PathIsUNCAW (LPCVOID lpszPath)
285 if (SHELL_OsIsUnicode())
286 return PathIsUNCW( lpszPath );
287 return PathIsUNCA( lpszPath );
290 /*************************************************************************
291 * PathIsRelativeAW [SHELL32.40]
293 BOOL WINAPI PathIsRelativeAW (LPCVOID lpszPath)
295 if (SHELL_OsIsUnicode())
296 return PathIsRelativeW( lpszPath );
297 return PathIsRelativeA( lpszPath );
300 /*************************************************************************
301 * PathIsRootAW [SHELL32.29]
303 BOOL WINAPI PathIsRootAW(LPCVOID lpszPath)
305 if (SHELL_OsIsUnicode())
306 return PathIsRootW(lpszPath);
307 return PathIsRootA(lpszPath);
310 /*************************************************************************
311 * PathIsExeA [internal]
313 static BOOL PathIsExeA (LPCSTR lpszPath)
315 LPCSTR lpszExtension = PathGetExtensionA(lpszPath);
317 static char * lpszExtensions[6] = {"exe", "com", "pid", "cmd", "bat", NULL };
319 TRACE("path=%s\n",lpszPath);
321 for(i=0; lpszExtensions[i]; i++)
322 if (!strcasecmp(lpszExtension,lpszExtensions[i])) return TRUE;
327 /*************************************************************************
328 * PathIsExeW [internal]
330 static BOOL PathIsExeW (LPCWSTR lpszPath)
332 LPCWSTR lpszExtension = PathGetExtensionW(lpszPath);
334 static WCHAR lpszExtensions[6][4] =
335 {{'e','x','e','\0'}, {'c','o','m','\0'}, {'p','i','d','\0'},
336 {'c','m','d','\0'}, {'b','a','t','\0'}, {'\0'} };
338 TRACE("path=%s\n",debugstr_w(lpszPath));
340 for(i=0; lpszExtensions[i]; i++)
341 if (!strcmpiW(lpszExtension,lpszExtensions[i])) return TRUE;
346 /*************************************************************************
347 * PathIsExeAW [SHELL32.43]
349 BOOL WINAPI PathIsExeAW (LPCVOID path)
351 if (SHELL_OsIsUnicode())
352 return PathIsExeW (path);
353 return PathIsExeA(path);
356 /*************************************************************************
357 * PathIsDirectoryAW [SHELL32.159]
359 BOOL WINAPI PathIsDirectoryAW (LPCVOID lpszPath)
361 if (SHELL_OsIsUnicode())
362 return PathIsDirectoryW (lpszPath);
363 return PathIsDirectoryA (lpszPath);
366 /*************************************************************************
367 * PathFileExistsAW [SHELL32.45]
369 BOOL WINAPI PathFileExistsAW (LPCVOID lpszPath)
371 if (SHELL_OsIsUnicode())
372 return PathFileExistsW (lpszPath);
373 return PathFileExistsA (lpszPath);
376 /*************************************************************************
377 * PathMatchSpecAW [SHELL32.46]
379 BOOL WINAPI PathMatchSpecAW(LPVOID name, LPVOID mask)
381 if (SHELL_OsIsUnicode())
382 return PathMatchSpecW( name, mask );
383 return PathMatchSpecA( name, mask );
386 /*************************************************************************
387 * PathIsSameRootAW [SHELL32.650]
389 BOOL WINAPI PathIsSameRootAW(LPCVOID lpszPath1, LPCVOID lpszPath2)
391 if (SHELL_OsIsUnicode())
392 return PathIsSameRootW(lpszPath1, lpszPath2);
393 return PathIsSameRootA(lpszPath1, lpszPath2);
396 /*************************************************************************
397 * IsLFNDriveA [SHELL32.119]
400 * exported by ordinal Name
402 BOOL WINAPI IsLFNDriveA(LPCSTR lpszPath)
406 if (!GetVolumeInformationA(lpszPath,NULL,0,NULL,&fnlen,NULL,NULL,0))
412 ########## Creating Something Unique ##########
414 /*************************************************************************
415 * PathMakeUniqueNameA [internal]
417 BOOL WINAPI PathMakeUniqueNameA(
420 LPCSTR lpszShortName,
424 FIXME("%p %lu %s %s %s stub\n",
425 lpszBuffer, dwBuffSize, debugstr_a(lpszShortName),
426 debugstr_a(lpszLongName), debugstr_a(lpszPathName));
430 /*************************************************************************
431 * PathMakeUniqueNameW [internal]
433 BOOL WINAPI PathMakeUniqueNameW(
436 LPCWSTR lpszShortName,
437 LPCWSTR lpszLongName,
438 LPCWSTR lpszPathName)
440 FIXME("%p %lu %s %s %s stub\n",
441 lpszBuffer, dwBuffSize, debugstr_w(lpszShortName),
442 debugstr_w(lpszLongName), debugstr_w(lpszPathName));
446 /*************************************************************************
447 * PathMakeUniqueNameAW [SHELL32.47]
449 BOOL WINAPI PathMakeUniqueNameAW(
452 LPCVOID lpszShortName,
453 LPCVOID lpszLongName,
454 LPCVOID lpszPathName)
456 if (SHELL_OsIsUnicode())
457 return PathMakeUniqueNameW(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName);
458 return PathMakeUniqueNameA(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName);
461 /*************************************************************************
462 * PathYetAnotherMakeUniqueNameA [SHELL32.75]
465 * exported by ordinal
467 BOOL WINAPI PathYetAnotherMakeUniqueNameA(
470 LPCSTR lpszShortName,
473 FIXME("(%p,%p, %p ,%p):stub.\n",
474 lpszBuffer, lpszPathName, lpszShortName, lpszLongName);
480 ########## cleaning and resolving paths ##########
483 /*************************************************************************
484 * PathFindOnPathAW [SHELL32]
486 BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs)
488 if (SHELL_OsIsUnicode())
489 return PathFindOnPathW(sFile, sOtherDirs);
490 return PathFindOnPathA(sFile, sOtherDirs);
493 /*************************************************************************
494 * PathCleanupSpecAW [SHELL32]
496 DWORD WINAPI PathCleanupSpecAW (LPVOID x, LPVOID y)
498 FIXME("(%p, %p) stub\n",x,y);
502 /*************************************************************************
503 * PathQualifyA [SHELL32]
505 BOOL WINAPI PathQualifyA(LPCSTR pszPath)
507 FIXME("%s\n",pszPath);
511 /*************************************************************************
512 * PathQualifyW [SHELL32]
514 BOOL WINAPI PathQualifyW(LPCWSTR pszPath)
516 FIXME("%s\n",debugstr_w(pszPath));
520 /*************************************************************************
521 * PathQualifyAW [SHELL32]
523 BOOL WINAPI PathQualifyAW(LPCVOID pszPath)
525 if (SHELL_OsIsUnicode())
526 return PathQualifyW(pszPath);
527 return PathQualifyA(pszPath);
530 /*************************************************************************
531 * PathResolveA [SHELL32.51]
533 BOOL WINAPI PathResolveA(
538 FIXME("(%s,%p,0x%08lx),stub!\n",
539 lpszPath, *alpszPaths, dwFlags);
543 /*************************************************************************
544 * PathResolveW [SHELL32]
546 BOOL WINAPI PathResolveW(
551 FIXME("(%s,%p,0x%08lx),stub!\n",
552 debugstr_w(lpszPath), debugstr_w(*alpszPaths), dwFlags);
556 /*************************************************************************
557 * PathResolveAW [SHELL32]
559 BOOL WINAPI PathResolveAW(
564 if (SHELL_OsIsUnicode())
565 return PathResolveW(lpszPath, (LPCWSTR*)alpszPaths, dwFlags);
566 return PathResolveA(lpszPath, (LPCSTR*)alpszPaths, dwFlags);
569 /*************************************************************************
570 * PathProcessCommandA [SHELL32.653]
572 HRESULT WINAPI PathProcessCommandA (
578 FIXME("%s %p 0x%04lx 0x%04lx stub\n",
579 lpszPath, lpszBuff, dwBuffSize, dwFlags);
580 strcpy(lpszBuff, lpszPath);
584 /*************************************************************************
585 * PathProcessCommandW
587 HRESULT WINAPI PathProcessCommandW (
593 FIXME("(%s, %p, 0x%04lx, 0x%04lx) stub\n",
594 debugstr_w(lpszPath), lpszBuff, dwBuffSize, dwFlags);
595 strcpyW(lpszBuff, lpszPath);
599 /*************************************************************************
600 * PathProcessCommandAW
602 HRESULT WINAPI PathProcessCommandAW (
608 if (SHELL_OsIsUnicode())
609 return PathProcessCommandW(lpszPath, lpszBuff, dwBuffSize, dwFlags);
610 return PathProcessCommandA(lpszPath, lpszBuff, dwBuffSize, dwFlags);
614 ########## special ##########
617 /*************************************************************************
618 * PathSetDlgItemPathAW
620 BOOL WINAPI PathSetDlgItemPathAW(HWND hDlg, int id, LPCVOID pszPath)
621 { if (SHELL_OsIsUnicode())
622 return PathSetDlgItemPathW(hDlg, id, pszPath);
623 return PathSetDlgItemPathA(hDlg, id, pszPath);
627 /*************************************************************************
628 * SHGetSpecialFolderPathA [SHELL32.175]
630 * converts csidl to path
633 static const char * const szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
634 static const char * const szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
635 static const char * const szSetup = "Software\\Microsoft\\Windows\\CurrentVersion\\Setup";
636 static const char * const szCurrentVersion = "Software\\Microsoft\\Windows\\CurrentVersion";
638 static const char * const szEnvUserProfile = "%USERPROFILE%";
639 static const char * const szEnvSystemRoot = "%SYSTEMROOT%";
647 LPCSTR szDefaultPath; /* fallback string; sub dir of windows directory */
650 #define CSIDL_MYFLAG_SHFOLDER 1
651 #define CSIDL_MYFLAG_SETUP 2
652 #define CSIDL_MYFLAG_CURRVER 4
653 #define CSIDL_MYFLAG_RELATIVE 8
655 #define HKLM HKEY_LOCAL_MACHINE
656 #define HKCU HKEY_CURRENT_USER
657 static const CSIDL_DATA CSIDL_Data[] =
659 { /* CSIDL_DESKTOP */
664 { /* CSIDL_INTERNET (??) */
669 { /* CSIDL_PROGRAMS */
672 "Start Menu\\Programs"
674 { /* CSIDL_CONTROLS (.CPL files) */
679 { /* CSIDL_PRINTERS */
684 { /* CSIDL_PERSONAL */
689 { /* CSIDL_FAVORITES */
694 { /* CSIDL_STARTUP */
697 "Start Menu\\Programs\\StartUp"
709 { /* CSIDL_BITBUCKET (??) */
714 { /* CSIDL_STARTMENU */
739 { /* CSIDL_DESKTOPDIRECTORY */
749 { /* CSIDL_NETWORK */
752 "Network Neighborhood"
754 { /* CSIDL_NETHOOD */
764 { /* CSIDL_TEMPLATES */
769 { /* CSIDL_COMMON_STARTMENU */
774 { /* CSIDL_COMMON_PROGRAMS */
779 { /* CSIDL_COMMON_STARTUP */
782 "All Users\\Start Menu\\Programs\\StartUp"
784 { /* CSIDL_COMMON_DESKTOPDIRECTORY */
789 { /* CSIDL_APPDATA */
794 { /* CSIDL_PRINTHOOD */
804 { /* CSIDL_ALTSTARTUP */
809 { /* CSIDL_COMMON_ALTSTARTUP */
814 { /* CSIDL_COMMON_FAVORITES */
819 { /* CSIDL_INTERNET_CACHE */
822 "Temporary Internet Files"
824 { /* CSIDL_COOKIES */
829 { /* CSIDL_HISTORY */
834 { /* CSIDL_COMMON_APPDATA */
837 "All Users\\Application Data"
839 { /* CSIDL_WINDOWS */
849 { /* CSIDL_PROGRAM_FILES */
854 { /* CSIDL_MYPICTURES */
857 "My Documents\\My Pictures"
859 { /* CSIDL_PROFILE */
861 "WinDir", /* correct ? */
864 { /* CSIDL_SYSTEMX86 */
869 { /* CSIDL_PROGRAM_FILESX86 */
874 { /* CSIDL_PROGRAM_FILES_COMMON */
877 "Program Files\\Common Files" /* ? */
879 { /* CSIDL_PROGRAM_FILES_COMMONX86 */
882 "Program Files\\Common Files" /* ? */
884 { /* CSIDL_COMMON_TEMPLATES */
889 { /* CSIDL_COMMON_DOCUMENTS */
894 { /* CSIDL_COMMON_ADMINTOOLS */
899 { /* CSIDL_ADMINTOOLS */
901 "Administrative Tools",
902 "Start Menu\\Programs\\Administrative Tools"
904 { /* CSIDL_CONNECTIONS */
913 /**********************************************************************/
915 BOOL WINAPI SHGetSpecialFolderPathA (
921 CHAR szValueName[MAX_PATH], szDefaultPath[MAX_PATH];
924 DWORD dwType, dwDisp, dwPathLen = MAX_PATH;
925 DWORD folder = csidl & CSIDL_FOLDER_MASK;
927 TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
929 if ((folder > CSIDL_CONNECTIONS) || (CSIDL_Data[folder].hRootKey == 0))
931 ERR("folder unknown or not allowed\n");
934 if (CSIDL_Data[folder].hRootKey == 1)
936 FIXME("folder unknown, please add.\n");
940 dwFlags = CSIDL_Data[folder].dwFlags;
941 hRootKey = CSIDL_Data[folder].hRootKey;
942 strcpy(szValueName, CSIDL_Data[folder].szValueName);
943 strcpy(szDefaultPath, CSIDL_Data[folder].szDefaultPath);
945 if (dwFlags & CSIDL_MYFLAG_SHFOLDER)
947 /* user shell folders */
948 if (RegCreateKeyExA(hRootKey,szSHUserFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
950 if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
955 if (RegCreateKeyExA(hRootKey,szSHFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
957 if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
960 /* value not existing */
961 if (dwFlags & CSIDL_MYFLAG_RELATIVE)
963 GetWindowsDirectoryA(szPath, MAX_PATH);
964 PathAddBackslashA(szPath);
965 strcat(szPath, szDefaultPath);
969 strcpy(szPath, "C:\\"); /* FIXME ??? */
970 strcat(szPath, szDefaultPath);
972 RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
981 if (dwFlags & CSIDL_MYFLAG_SETUP)
984 if (dwFlags & CSIDL_MYFLAG_CURRVER)
985 pRegPath = szCurrentVersion;
988 ERR("folder settings broken, please correct !\n");
992 if (RegCreateKeyExA(hRootKey,pRegPath,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
994 if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
996 /* value not existing */
997 if (dwFlags & CSIDL_MYFLAG_RELATIVE)
999 GetWindowsDirectoryA(szPath, MAX_PATH);
1000 PathAddBackslashA(szPath);
1001 strcat(szPath, szDefaultPath);
1005 strcpy(szPath, "C:\\"); /* FIXME ??? */
1006 strcat(szPath, szDefaultPath);
1008 RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
1013 /* expand paths like %USERPROFILE% */
1014 if (dwType == REG_EXPAND_SZ)
1016 ExpandEnvironmentStringsA(szPath, szDefaultPath, MAX_PATH);
1017 strcpy(szPath, szDefaultPath);
1020 /* if we don't care about existing directories we are ready */
1021 if(csidl & CSIDL_FLAG_DONT_VERIFY) return TRUE;
1023 if (PathFileExistsA(szPath)) return TRUE;
1025 /* not existing but we are not allowed to create it */
1026 if (!bCreate) return FALSE;
1028 if (!CreateDirectoryA(szPath,NULL))
1030 ERR("Failed to create directory '%s'.\n", szPath);
1034 MESSAGE("Created not existing system directory '%s'\n", szPath);
1038 /*************************************************************************
1039 * SHGetSpecialFolderPathW
1041 BOOL WINAPI SHGetSpecialFolderPathW (
1047 char szTemp[MAX_PATH];
1049 if (SHGetSpecialFolderPathA(hwndOwner, szTemp, csidl, bCreate))
1051 if (!MultiByteToWideChar( CP_ACP, 0, szTemp, -1, szPath, MAX_PATH ))
1052 szPath[MAX_PATH-1] = 0;
1055 TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
1060 /*************************************************************************
1061 * SHGetSpecialFolderPathAW
1063 BOOL WINAPI SHGetSpecialFolderPathAW (
1070 if (SHELL_OsIsUnicode())
1071 return SHGetSpecialFolderPathW (hwndOwner, szPath, csidl, bCreate);
1072 return SHGetSpecialFolderPathA (hwndOwner, szPath, csidl, bCreate);
1075 /*************************************************************************
1076 * SHGetFolderPathA [SHFOLDER.@]
1078 HRESULT WINAPI SHGetFolderPathA(
1081 HANDLE hToken, /* [in] FIXME: get paths for specific user */
1082 DWORD dwFlags, /* [in] FIXME: SHGFP_TYPE_CURRENT|SHGFP_TYPE_DEFAULT */
1085 return (SHGetSpecialFolderPathA(
1088 CSIDL_FOLDER_MASK & nFolder,
1089 CSIDL_FLAG_CREATE & nFolder )) ? S_OK : E_FAIL;
1092 /*************************************************************************
1093 * SHGetFolderPathW [SHFOLDER.@]
1095 HRESULT WINAPI SHGetFolderPathW(
1102 return (SHGetSpecialFolderPathW(
1105 CSIDL_FOLDER_MASK & nFolder,
1106 CSIDL_FLAG_CREATE & nFolder )) ? S_OK : E_FAIL;