4 * Many of this functions are in SHLWAPI.DLL also
9 #include "debugtools.h"
14 #include "shell32_main.h"
17 #include "wine/undocshell.h"
18 #include "wine/unicode.h"
21 DEFAULT_DEBUG_CHANNEL(shell);
23 #define isSlash(x) ((x)=='\\' || (x)=='/')
25 ########## Combining and Constructing paths ##########
28 /*************************************************************************
29 * PathAppendAW [SHELL32.36]
31 BOOL WINAPI PathAppendAW(
35 if (SHELL_OsIsUnicode())
36 return PathAppendW(lpszPath1, lpszPath2);
37 return PathAppendA(lpszPath1, lpszPath2);
40 /*************************************************************************
41 * PathCombineAW [SHELL32.37]
43 LPVOID WINAPI PathCombineAW(
48 if (SHELL_OsIsUnicode())
49 return PathCombineW( szDest, lpszDir, lpszFile );
50 return PathCombineA( szDest, lpszDir, lpszFile );
53 /*************************************************************************
54 * PathAddBackslashAW [SHELL32.32]
56 LPVOID WINAPI PathAddBackslashAW(LPVOID lpszPath)
58 if(SHELL_OsIsUnicode())
59 return PathAddBackslashW(lpszPath);
60 return PathAddBackslashA(lpszPath);
63 /*************************************************************************
64 * PathBuildRootAW [SHELL32.30]
66 LPVOID WINAPI PathBuildRootAW(LPVOID lpszPath, int drive)
68 if(SHELL_OsIsUnicode())
69 return PathBuildRootW(lpszPath, drive);
70 return PathBuildRootA(lpszPath, drive);
74 Extracting Component Parts
77 /*************************************************************************
78 * PathFindFileNameAW [SHELL32.34]
80 LPVOID WINAPI PathFindFileNameAW(LPCVOID lpszPath)
82 if(SHELL_OsIsUnicode())
83 return PathFindFileNameW(lpszPath);
84 return PathFindFileNameA(lpszPath);
87 /*************************************************************************
88 * PathFindExtensionAW [SHELL32.31]
90 LPVOID WINAPI PathFindExtensionAW(LPCVOID lpszPath)
92 if (SHELL_OsIsUnicode())
93 return PathFindExtensionW(lpszPath);
94 return PathFindExtensionA(lpszPath);
98 /*************************************************************************
99 * PathGetExtensionA [internal]
102 * exported by ordinal
103 * return value points to the first char after the dot
105 static LPSTR PathGetExtensionA(LPCSTR lpszPath)
107 TRACE("(%s)\n",lpszPath);
109 lpszPath = PathFindExtensionA(lpszPath);
110 return (LPSTR)(*lpszPath?(lpszPath+1):lpszPath);
113 /*************************************************************************
114 * PathGetExtensionW [internal]
116 static LPWSTR PathGetExtensionW(LPCWSTR lpszPath)
118 TRACE("(%s)\n",debugstr_w(lpszPath));
120 lpszPath = PathFindExtensionW(lpszPath);
121 return (LPWSTR)(*lpszPath?(lpszPath+1):lpszPath);
124 /*************************************************************************
125 * PathGetExtensionAW [SHELL32.158]
127 LPVOID WINAPI PathGetExtensionAW(LPCVOID lpszPath)
129 if (SHELL_OsIsUnicode())
130 return PathGetExtensionW(lpszPath);
131 return PathGetExtensionA(lpszPath);
134 /*************************************************************************
135 * PathGetArgsAW [SHELL32.52]
137 LPVOID WINAPI PathGetArgsAW(LPVOID lpszPath)
139 if (SHELL_OsIsUnicode())
140 return PathGetArgsW(lpszPath);
141 return PathGetArgsA(lpszPath);
144 /*************************************************************************
145 * PathGetDriveNumber [SHELL32.57]
147 int WINAPI PathGetDriveNumberAW(LPVOID lpszPath)
149 if (SHELL_OsIsUnicode())
150 return PathGetDriveNumberW(lpszPath);
151 return PathGetDriveNumberA(lpszPath);
154 /*************************************************************************
155 * PathRemoveFileSpec [SHELL32.35]
157 BOOL WINAPI PathRemoveFileSpecAW(LPVOID lpszPath)
159 if (SHELL_OsIsUnicode())
160 return PathRemoveFileSpecW(lpszPath);
161 return PathRemoveFileSpecA(lpszPath);
164 /*************************************************************************
165 * PathStripPathAW [SHELL32.38]
167 void WINAPI PathStripPathAW(LPVOID lpszPath)
169 if (SHELL_OsIsUnicode())
170 return PathStripPathW(lpszPath);
171 return PathStripPathA(lpszPath);
174 /*************************************************************************
175 * PathStripToRootAW [SHELL32.50]
177 BOOL WINAPI PathStripToRootAW(LPVOID lpszPath)
179 if (SHELL_OsIsUnicode())
180 return PathStripToRootW(lpszPath);
181 return PathStripToRootA(lpszPath);
184 /*************************************************************************
185 * PathRemoveArgsAW [SHELL32.251]
187 void WINAPI PathRemoveArgsAW(LPVOID lpszPath)
189 if (SHELL_OsIsUnicode())
190 PathRemoveArgsW(lpszPath);
191 PathRemoveArgsA(lpszPath);
194 /*************************************************************************
195 * PathRemoveExtensionAW [SHELL32.250]
197 void WINAPI PathRemoveExtensionAW(LPVOID lpszPath)
199 if (SHELL_OsIsUnicode())
200 return PathRemoveExtensionW(lpszPath);
201 return PathRemoveExtensionA(lpszPath);
209 /*************************************************************************
210 * PathGetShortPathA [internal]
212 LPSTR WINAPI PathGetShortPathA(LPSTR lpszPath)
214 FIXME("%s stub\n", lpszPath);
218 /*************************************************************************
219 * PathGetShortPathW [internal]
221 LPWSTR WINAPI PathGetShortPathW(LPWSTR lpszPath)
223 FIXME("%s stub\n", debugstr_w(lpszPath));
227 /*************************************************************************
228 * PathGetShortPathAW [SHELL32.92]
230 LPVOID WINAPI PathGetShortPathAW(LPVOID lpszPath)
232 if(SHELL_OsIsUnicode())
233 return PathGetShortPathW(lpszPath);
234 return PathGetShortPathA(lpszPath);
237 /*************************************************************************
238 * PathRemoveBlanksAW [SHELL32.33]
240 void WINAPI PathRemoveBlanksAW(LPVOID str)
242 if(SHELL_OsIsUnicode())
243 PathRemoveBlanksW(str);
244 PathRemoveBlanksA(str);
247 /*************************************************************************
248 * PathQuoteSpacesAW [SHELL32.55]
250 LPVOID WINAPI PathQuoteSpacesAW (LPVOID lpszPath)
252 if(SHELL_OsIsUnicode())
253 return PathQuoteSpacesW(lpszPath);
254 return PathQuoteSpacesA(lpszPath);
257 /*************************************************************************
258 * PathUnquoteSpacesAW [SHELL32.56]
260 VOID WINAPI PathUnquoteSpacesAW(LPVOID str)
262 if(SHELL_OsIsUnicode())
263 PathUnquoteSpacesW(str);
265 PathUnquoteSpacesA(str);
268 /*************************************************************************
269 * PathParseIconLocationAW [SHELL32.249]
271 int WINAPI PathParseIconLocationAW (LPVOID lpszPath)
273 if(SHELL_OsIsUnicode())
274 return PathParseIconLocationW(lpszPath);
275 return PathParseIconLocationA(lpszPath);
279 ########## Path Testing ##########
281 /*************************************************************************
282 * PathIsUNCAW [SHELL32.39]
284 BOOL WINAPI PathIsUNCAW (LPCVOID lpszPath)
286 if (SHELL_OsIsUnicode())
287 return PathIsUNCW( lpszPath );
288 return PathIsUNCA( lpszPath );
291 /*************************************************************************
292 * PathIsRelativeAW [SHELL32.40]
294 BOOL WINAPI PathIsRelativeAW (LPCVOID lpszPath)
296 if (SHELL_OsIsUnicode())
297 return PathIsRelativeW( lpszPath );
298 return PathIsRelativeA( lpszPath );
301 /*************************************************************************
302 * PathIsRootAW [SHELL32.29]
304 BOOL WINAPI PathIsRootAW(LPCVOID lpszPath)
306 if (SHELL_OsIsUnicode())
307 return PathIsRootW(lpszPath);
308 return PathIsRootA(lpszPath);
311 /*************************************************************************
312 * PathIsExeA [internal]
314 static BOOL PathIsExeA (LPCSTR lpszPath)
316 LPCSTR lpszExtension = PathGetExtensionA(lpszPath);
318 static char * lpszExtensions[6] = {"exe", "com", "pid", "cmd", "bat", NULL };
320 TRACE("path=%s\n",lpszPath);
322 for(i=0; lpszExtensions[i]; i++)
323 if (!strcasecmp(lpszExtension,lpszExtensions[i])) return TRUE;
328 /*************************************************************************
329 * PathIsExeW [internal]
331 static BOOL PathIsExeW (LPCWSTR lpszPath)
333 LPCWSTR lpszExtension = PathGetExtensionW(lpszPath);
335 static WCHAR lpszExtensions[6][4] =
336 {{'e','x','e','\0'}, {'c','o','m','\0'}, {'p','i','d','\0'},
337 {'c','m','d','\0'}, {'b','a','t','\0'}, {'\0'} };
339 TRACE("path=%s\n",debugstr_w(lpszPath));
341 for(i=0; lpszExtensions[i]; i++)
342 if (!strcmpiW(lpszExtension,lpszExtensions[i])) return TRUE;
347 /*************************************************************************
348 * PathIsExeAW [SHELL32.43]
350 BOOL WINAPI PathIsExeAW (LPCVOID path)
352 if (SHELL_OsIsUnicode())
353 return PathIsExeW (path);
354 return PathIsExeA(path);
357 /*************************************************************************
358 * PathIsDirectoryAW [SHELL32.159]
360 BOOL WINAPI PathIsDirectoryAW (LPCVOID lpszPath)
362 if (SHELL_OsIsUnicode())
363 return PathIsDirectoryW (lpszPath);
364 return PathIsDirectoryA (lpszPath);
367 /*************************************************************************
368 * PathFileExistsAW [SHELL32.45]
370 BOOL WINAPI PathFileExistsAW (LPCVOID lpszPath)
372 if (SHELL_OsIsUnicode())
373 return PathFileExistsW (lpszPath);
374 return PathFileExistsA (lpszPath);
377 /*************************************************************************
378 * PathMatchSpecAW [SHELL32.46]
380 BOOL WINAPI PathMatchSpecAW(LPVOID name, LPVOID mask)
382 if (SHELL_OsIsUnicode())
383 return PathMatchSpecW( name, mask );
384 return PathMatchSpecA( name, mask );
387 /*************************************************************************
388 * PathIsSameRootAW [SHELL32.650]
390 BOOL WINAPI PathIsSameRootAW(LPCVOID lpszPath1, LPCVOID lpszPath2)
392 if (SHELL_OsIsUnicode())
393 return PathIsSameRootW(lpszPath1, lpszPath2);
394 return PathIsSameRootA(lpszPath1, lpszPath2);
397 /*************************************************************************
398 * IsLFNDriveA [SHELL32.119]
401 * exported by ordinal Name
403 BOOL WINAPI IsLFNDriveA(LPCSTR lpszPath)
407 if (!GetVolumeInformationA(lpszPath,NULL,0,NULL,&fnlen,NULL,NULL,0))
413 ########## Creating Something Unique ##########
415 /*************************************************************************
416 * PathMakeUniqueNameA [internal]
418 BOOL WINAPI PathMakeUniqueNameA(
421 LPCSTR lpszShortName,
425 FIXME("%p %lu %s %s %s stub\n",
426 lpszBuffer, dwBuffSize, debugstr_a(lpszShortName),
427 debugstr_a(lpszLongName), debugstr_a(lpszPathName));
431 /*************************************************************************
432 * PathMakeUniqueNameW [internal]
434 BOOL WINAPI PathMakeUniqueNameW(
437 LPCWSTR lpszShortName,
438 LPCWSTR lpszLongName,
439 LPCWSTR lpszPathName)
441 FIXME("%p %lu %s %s %s stub\n",
442 lpszBuffer, dwBuffSize, debugstr_w(lpszShortName),
443 debugstr_w(lpszLongName), debugstr_w(lpszPathName));
447 /*************************************************************************
448 * PathMakeUniqueNameAW [SHELL32.47]
450 BOOL WINAPI PathMakeUniqueNameAW(
453 LPCVOID lpszShortName,
454 LPCVOID lpszLongName,
455 LPCVOID lpszPathName)
457 if (SHELL_OsIsUnicode())
458 return PathMakeUniqueNameW(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName);
459 return PathMakeUniqueNameA(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName);
462 /*************************************************************************
463 * PathYetAnotherMakeUniqueNameA [SHELL32.75]
466 * exported by ordinal
468 BOOL WINAPI PathYetAnotherMakeUniqueNameA(
471 LPCSTR lpszShortName,
474 FIXME("(%p,%p, %p ,%p):stub.\n",
475 lpszBuffer, lpszPathName, lpszShortName, lpszLongName);
481 ########## cleaning and resolving paths ##########
484 /*************************************************************************
485 * PathFindOnPathAW [SHELL32]
487 BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs)
489 if (SHELL_OsIsUnicode())
490 return PathFindOnPathW(sFile, sOtherDirs);
491 return PathFindOnPathA(sFile, sOtherDirs);
494 /*************************************************************************
495 * PathCleanupSpecAW [SHELL32]
497 DWORD WINAPI PathCleanupSpecAW (LPVOID x, LPVOID y)
499 FIXME("(%p, %p) stub\n",x,y);
503 /*************************************************************************
504 * PathQualifyA [SHELL32]
506 BOOL WINAPI PathQualifyA(LPCSTR pszPath)
508 FIXME("%s\n",pszPath);
512 /*************************************************************************
513 * PathQualifyW [SHELL32]
515 BOOL WINAPI PathQualifyW(LPCWSTR pszPath)
517 FIXME("%s\n",debugstr_w(pszPath));
521 /*************************************************************************
522 * PathQualifyAW [SHELL32]
524 BOOL WINAPI PathQualifyAW(LPCVOID pszPath)
526 if (SHELL_OsIsUnicode())
527 return PathQualifyW(pszPath);
528 return PathQualifyA(pszPath);
531 /*************************************************************************
532 * PathResolveA [SHELL32.51]
534 BOOL WINAPI PathResolveA(
539 FIXME("(%s,%p,0x%08lx),stub!\n",
540 lpszPath, *alpszPaths, dwFlags);
544 /*************************************************************************
545 * PathResolveW [SHELL32]
547 BOOL WINAPI PathResolveW(
552 FIXME("(%s,%p,0x%08lx),stub!\n",
553 debugstr_w(lpszPath), debugstr_w(*alpszPaths), dwFlags);
557 /*************************************************************************
558 * PathResolveAW [SHELL32]
560 BOOL WINAPI PathResolveAW(
565 if (SHELL_OsIsUnicode())
566 return PathResolveW(lpszPath, (LPCWSTR*)alpszPaths, dwFlags);
567 return PathResolveA(lpszPath, (LPCSTR*)alpszPaths, dwFlags);
570 /*************************************************************************
571 * PathProcessCommandA [SHELL32.653]
573 HRESULT WINAPI PathProcessCommandA (
579 FIXME("%s %p 0x%04lx 0x%04lx stub\n",
580 lpszPath, lpszBuff, dwBuffSize, dwFlags);
581 strcpy(lpszBuff, lpszPath);
585 /*************************************************************************
586 * PathProcessCommandW
588 HRESULT WINAPI PathProcessCommandW (
594 FIXME("(%s, %p, 0x%04lx, 0x%04lx) stub\n",
595 debugstr_w(lpszPath), lpszBuff, dwBuffSize, dwFlags);
596 strcpyW(lpszBuff, lpszPath);
600 /*************************************************************************
601 * PathProcessCommandAW
603 HRESULT WINAPI PathProcessCommandAW (
609 if (SHELL_OsIsUnicode())
610 return PathProcessCommandW(lpszPath, lpszBuff, dwBuffSize, dwFlags);
611 return PathProcessCommandA(lpszPath, lpszBuff, dwBuffSize, dwFlags);
615 ########## special ##########
618 /*************************************************************************
619 * PathSetDlgItemPathAW
621 BOOL WINAPI PathSetDlgItemPathAW(HWND hDlg, int id, LPCVOID pszPath)
622 { if (SHELL_OsIsUnicode())
623 return PathSetDlgItemPathW(hDlg, id, pszPath);
624 return PathSetDlgItemPathA(hDlg, id, pszPath);
628 /*************************************************************************
629 * SHGetSpecialFolderPathA [SHELL32.175]
631 * converts csidl to path
634 static char * szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
635 static char * szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
637 static char * szEnvUserProfile = "%USERPROFILE%";
638 static char * szEnvSystemRoot = "%SYSTEMROOT%";
641 BOOL WINAPI SHGetSpecialFolderPathA (
647 CHAR szValueName[MAX_PATH], szDefaultPath[MAX_PATH];
649 BOOL bRelative = TRUE;
650 DWORD dwType, dwDisp, dwPathLen = MAX_PATH;
652 TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
654 /* build default values */
658 hRootKey = HKEY_CURRENT_USER;
659 strcpy (szValueName, "AppData");
660 strcpy (szDefaultPath, "AppData");
664 hRootKey = HKEY_CURRENT_USER;
665 strcpy (szValueName, "Cookies");
666 strcpy(szDefaultPath, "Cookies");
669 case CSIDL_DESKTOPDIRECTORY:
670 hRootKey = HKEY_CURRENT_USER;
671 strcpy(szValueName, "Desktop");
672 strcpy(szDefaultPath, "Desktop");
675 case CSIDL_COMMON_DESKTOPDIRECTORY:
676 hRootKey = HKEY_LOCAL_MACHINE;
677 strcpy(szValueName, "Common Desktop");
678 strcpy(szDefaultPath, "Desktop");
681 case CSIDL_FAVORITES:
682 hRootKey = HKEY_CURRENT_USER;
683 strcpy(szValueName, "Favorites");
684 strcpy(szDefaultPath, "Favorites");
688 hRootKey = HKEY_CURRENT_USER;
689 strcpy(szValueName, "Fonts");
690 strcpy(szDefaultPath, "Fonts");
694 hRootKey = HKEY_CURRENT_USER;
695 strcpy(szValueName, "History");
696 strcpy(szDefaultPath, "History");
700 hRootKey = HKEY_CURRENT_USER;
701 strcpy(szValueName, "NetHood");
702 strcpy(szDefaultPath, "NetHood");
705 case CSIDL_INTERNET_CACHE:
706 hRootKey = HKEY_CURRENT_USER;
707 strcpy(szValueName, "Cache");
708 strcpy(szDefaultPath, "Temporary Internet Files");
712 hRootKey = HKEY_CURRENT_USER;
713 strcpy(szValueName, "Personal");
714 strcpy(szDefaultPath, "My Own Files");
718 case CSIDL_PRINTHOOD:
719 hRootKey = HKEY_CURRENT_USER;
720 strcpy(szValueName, "PrintHood");
721 strcpy(szDefaultPath, "PrintHood");
725 hRootKey = HKEY_CURRENT_USER;
726 strcpy(szValueName, "Programs");
727 strcpy(szDefaultPath, "StartMenu\\Programs");
730 case CSIDL_COMMON_PROGRAMS:
731 hRootKey = HKEY_LOCAL_MACHINE;
732 strcpy(szValueName, "Common Programs");
733 strcpy(szDefaultPath, "");
737 hRootKey = HKEY_CURRENT_USER;
738 strcpy(szValueName, "Recent");
739 strcpy(szDefaultPath, "Recent");
743 hRootKey = HKEY_CURRENT_USER;
744 strcpy(szValueName, "SendTo");
745 strcpy(szDefaultPath, "SendTo");
748 case CSIDL_STARTMENU:
749 hRootKey = HKEY_CURRENT_USER;
750 strcpy(szValueName, "StartMenu");
751 strcpy(szDefaultPath, "StartMenu");
754 case CSIDL_COMMON_STARTMENU:
755 hRootKey = HKEY_LOCAL_MACHINE;
756 strcpy(szValueName, "Common StartMenu");
757 strcpy(szDefaultPath, "StartMenu");
761 hRootKey = HKEY_CURRENT_USER;
762 strcpy(szValueName, "Startup");
763 strcpy(szDefaultPath, "StartMenu\\Programs\\Startup");
766 case CSIDL_COMMON_STARTUP:
767 hRootKey = HKEY_LOCAL_MACHINE;
768 strcpy(szValueName, "Common Startup");
769 strcpy(szDefaultPath, "StartMenu\\Programs\\Startup");
772 case CSIDL_TEMPLATES:
773 hRootKey = HKEY_CURRENT_USER;
774 strcpy(szValueName, "Templates");
775 strcpy(szDefaultPath, "ShellNew");
779 ERR("folder unknown or not allowed\n");
783 /* user shell folders */
784 if (RegCreateKeyExA(hRootKey,szSHUserFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
786 if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
791 if (RegCreateKeyExA(hRootKey,szSHFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
793 if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
796 /* value not existing */
799 GetWindowsDirectoryA(szPath, MAX_PATH);
800 PathAddBackslashA(szPath);
801 strcat(szPath, szDefaultPath);
805 strcpy(szPath, "C:\\"); /* fixme ??? */
806 strcat(szPath, szDefaultPath);
808 RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
813 /* expand paths like %USERPROFILE% */
814 if (dwType == REG_EXPAND_SZ)
816 ExpandEnvironmentStringsA(szPath, szDefaultPath, MAX_PATH);
817 strcpy(szPath, szDefaultPath);
820 /* if we don't care about existing directorys we are ready */
821 if(csidl & CSIDL_FLAG_DONT_VERIFY) return TRUE;
823 if (PathFileExistsA(szPath)) return TRUE;
825 /* not existing but we not allowed to create it */
826 if (!bCreate) return FALSE;
828 if (!CreateDirectoryA(szPath,NULL))
830 ERR("Failed to create directory '%s'.\n", szPath);
834 MESSAGE("Created not existing system directory '%s'\n", szPath);
838 /*************************************************************************
839 * SHGetSpecialFolderPathW
841 BOOL WINAPI SHGetSpecialFolderPathW (
847 char szTemp[MAX_PATH];
849 if (SHGetSpecialFolderPathA(hwndOwner, szTemp, csidl, bCreate))
851 lstrcpynAtoW(szPath, szTemp, MAX_PATH);
854 TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
859 /*************************************************************************
860 * SHGetSpecialFolderPathAW
862 BOOL WINAPI SHGetSpecialFolderPathAW (
869 if (SHELL_OsIsUnicode())
870 return SHGetSpecialFolderPathW (hwndOwner, szPath, csidl, bCreate);
871 return SHGetSpecialFolderPathA (hwndOwner, szPath, csidl, bCreate);
874 /*************************************************************************
875 * SHGetFolderPathA [SHFOLDER.@]
877 HRESULT WINAPI SHGetFolderPathA(
880 HANDLE hToken, /* FIXME: get paths for specific user */
881 DWORD dwFlags, /* FIXME: SHGFP_TYPE_CURRENT|SHGFP_TYPE_DEFAULT */
884 return (SHGetSpecialFolderPathA(
887 CSIDL_FOLDER_MASK & nFolder,
888 CSIDL_FLAG_CREATE & nFolder )) ? S_OK : E_FAIL;
891 /*************************************************************************
892 * SHGetFolderPathW [SHFOLDER.@]
894 HRESULT WINAPI SHGetFolderPathW(
901 return (SHGetSpecialFolderPathW(
904 CSIDL_FOLDER_MASK & nFolder,
905 CSIDL_FLAG_CREATE & nFolder )) ? S_OK : E_FAIL;