29#include "wine/unicode.h"
36#define NO_SHLWAPI_STREAM
52#define GET_FUNC(func, module, name, fail) \
55 if (!SHLWAPI_h##module && !(SHLWAPI_h##module = LoadLibraryA(#module ".dll"))) return fail; \
56 func = (fn##func)GetProcAddress(SHLWAPI_h##module, name); \
57 if (!func) return fail; \
110 if (lpszPath && lpszAppend)
113 while (*lpszAppend ==
'\\')
130 if (lpszPath && lpszAppend)
133 while (*lpszAppend ==
'\\')
169 if (!lpszDir && !lpszFile)
204 if (!lpszDir && !lpszFile)
210 if ((!lpszFile || !*lpszFile) && lpszDir)
217 if (!lpszDir || !*lpszDir || *lpszFile !=
'\\' ||
PathIsUNCW(lpszFile))
266 LPSTR prev = lpszPath;
306 if (lpszPath[-1] !=
'\\')
335 lpszPath[0] =
'A' +
drive;
354 lpszPath[0] =
'A' +
drive;
375 LPCSTR lastSlash = lpszPath;
379 while (lpszPath && *lpszPath)
381 if ((*lpszPath ==
'\\' || *lpszPath ==
'/' || *lpszPath ==
':') &&
382 lpszPath[1] && lpszPath[1] !=
'\\' && lpszPath[1] !=
'/')
383 lastSlash = lpszPath + 1;
386 return (
LPSTR)lastSlash;
400 while (lpszPath && *lpszPath)
402 if ((*lpszPath ==
'\\' || *lpszPath ==
'/' || *lpszPath ==
':') &&
403 lpszPath[1] && lpszPath[1] !=
'\\' && lpszPath[1] !=
'/')
404 lastSlash = lpszPath + 1;
432 if (*lpszPath ==
'\\' || *lpszPath==
' ')
434 else if (*lpszPath ==
'.')
435 lastpoint = lpszPath;
439 return (
LPSTR)(lastpoint ? lastpoint : lpszPath);
457 if (*lpszPath ==
'\\' || *lpszPath==
' ')
459 else if (*lpszPath ==
'.')
460 lastpoint = lpszPath;
464 return (
LPWSTR)(lastpoint ? lastpoint : lpszPath);
491 if ((*lpszPath==
' ') && !bSeenQuote)
492 return (
LPSTR)lpszPath + 1;
493 if (*lpszPath ==
'"')
494 bSeenQuote = !bSeenQuote;
498 return (
LPSTR)lpszPath;
516 if ((*lpszPath==
' ') && !bSeenQuote)
517 return (
LPWSTR)lpszPath + 1;
518 if (*lpszPath ==
'"')
519 bSeenQuote = !bSeenQuote;
542 if (lpszPath && !
IsDBCSLeadByte(*lpszPath) && lpszPath[1] ==
':' &&
544 return tolower(*lpszPath) -
'a';
557 static const WCHAR nt_prefixW[] = {
'\\',
'\\',
'?',
'\\'};
588 LPSTR lpszFileSpec = lpszPath;
596 if (*lpszPath ==
'\\')
597 lpszFileSpec = ++lpszPath;
598 if (*lpszPath ==
'\\')
599 lpszFileSpec = ++lpszPath;
603 if(*lpszPath ==
'\\')
604 lpszFileSpec = lpszPath;
605 else if(*lpszPath ==
':')
607 lpszFileSpec = ++lpszPath;
608 if (*lpszPath ==
'\\')
617 *lpszFileSpec =
'\0';
631 LPWSTR lpszFileSpec = lpszPath;
639 if (*lpszPath ==
'\\')
640 lpszFileSpec = ++lpszPath;
641 if (*lpszPath ==
'\\')
642 lpszFileSpec = ++lpszPath;
646 if(*lpszPath ==
'\\')
647 lpszFileSpec = lpszPath;
648 else if(*lpszPath ==
':')
650 lpszFileSpec = ++lpszPath;
651 if (*lpszPath ==
'\\')
659 *lpszFileSpec =
'\0';
684 if(lpszFileName != lpszPath)
700 if(lpszFileName != lpszPath)
768 if(*lpszLastChar ==
' ')
769 *lpszLastChar =
'\0';
786 if (*lpszArgs || (lpszArgs > lpszPath && lpszArgs[-1] ==
' '))
813 if (lpszPath && *lpszPath !=
'\0')
830 if (lpszPath && *lpszPath !=
'\0')
875 szTemp = lpszPath +
strlenW(lpszPath);
876 if (szTemp > lpszPath) szTemp--;
898 if(lpszPath && *lpszPath)
902 while (*lpszPath ==
' ')
906 *
start++ = *lpszPath++;
908 if (
start != lpszPath)
909 while (
start[-1] ==
' ')
924 if(lpszPath && *lpszPath)
928 while (*lpszPath ==
' ')
932 *
start++ = *lpszPath++;
934 if (
start != lpszPath)
935 while (
start[-1] ==
' ')
959 if(lpszPath &&
StrChrA(lpszPath,
' '))
961 size_t iLen =
strlen(lpszPath) + 1;
965 memmove(lpszPath + 1, lpszPath, iLen);
967 lpszPath[iLen] =
'"';
968 lpszPath[iLen + 1] =
'\0';
982 if(lpszPath &&
StrChrW(lpszPath,
' '))
984 int iLen =
strlenW(lpszPath) + 1;
990 lpszPath[iLen] =
'"';
991 lpszPath[iLen + 1] =
'\0';
1016 if (lpszPath && *lpszPath ==
'"')
1020 if (lpszPath[dwLen] ==
'"')
1022 lpszPath[dwLen] =
'\0';
1023 for (; *lpszPath; lpszPath++)
1024 *lpszPath = lpszPath[1];
1038 if (lpszPath && *lpszPath ==
'"')
1042 if (lpszPath[dwLen] ==
'"')
1044 lpszPath[dwLen] =
'\0';
1045 for (; *lpszPath; lpszPath++)
1046 *lpszPath = lpszPath[1];
1076 if ((lpszComma =
strchr(lpszPath,
',')))
1078 *lpszComma++ =
'\0';
1101 if ((lpszComma =
StrChrW(lpszPath,
',')))
1103 *lpszComma++ =
'\0';
1119 static const WCHAR pszExts[][5] = { {
'.',
'p',
'i',
'f', 0},
1120 {
'.',
'c',
'o',
'm', 0},
1121 {
'.',
'e',
'x',
'e', 0},
1122 {
'.',
'b',
'a',
't', 0},
1123 {
'.',
'l',
'n',
'k', 0},
1124 {
'.',
'c',
'm',
'd', 0},
1136 if (!*szExt || dwWhich & 0x40)
1146 while ( (dwWhich & 0x1) && pszExts[iChoose][0] )
1148 while (pszExts[iChoose][0])
1156 lstrcpyW(lpszPath + iLen, pszExts[iChoose]);
1165 *(lpszPath + iLen) = (
WCHAR)
'\0';
1219 static const WCHAR szSystem[] = {
'S',
'y',
's',
't',
'e',
'm',
'\0'};
1220 static const WCHAR szPath[] = {
'P',
'A',
'T',
'H',
'\0'};
1260 lpszCurr = lpszPATH;
1266 while (*lpszEnd ==
' ')
1268 while (*lpszEnd && *lpszEnd !=
';')
1269 *pBuff++ = *lpszEnd++;
1273 lpszCurr = lpszEnd + 1;
1312 TRACE(
"(%s,%p,%08x)\n",
debugstr_a(lpszFile), lppszOtherDirs, dwWhich);
1320 if (lppszOtherDirs && *lppszOtherDirs)
1323 LPCSTR *lpszOtherPath = lppszOtherDirs;
1325 while (lpszOtherPath && *lpszOtherPath && (*lpszOtherPath)[0])
1355 TRACE(
"(%s,%p,%08x)\n",
debugstr_w(lpszFile), lppszOtherDirs, dwWhich);
1361 if (lppszOtherDirs && *lppszOtherDirs)
1363 LPCWSTR *lpszOtherPath = lppszOtherDirs;
1364 while (lpszOtherPath && *lpszOtherPath && (*lpszOtherPath)[0])
1463 static const WCHAR szEllipses[] = {
'.',
'.',
'.',
'\0' };
1465 DWORD dwLen, dwFileLen = 0;
1474 WARN(
"Invalid lpszDest would crash under Win32!\n");
1483 dwLen =
strlenW(lpszPath) + 1;
1494 dwFileLen = lpszPath + dwLen - lpszFile;
1496 if (dwFileLen == dwLen)
1516 if (dwFileLen + 3 >
cchMax)
1544 dwLen =
cchMax - dwFileLen - 3;
1569 if (*lpszPath ==
'\\' || (*lpszPath && lpszPath[1] ==
':'))
1583 if (!lpszPath || !*lpszPath)
1585 if (*lpszPath ==
'\\' || (*lpszPath && lpszPath[1] ==
':'))
1606 if (lpszPath && *lpszPath)
1608 if (*lpszPath ==
'\\')
1612 else if (lpszPath[1]==
'\\')
1620 if (*lpszPath ==
'\\')
1631 else if (lpszPath[1] ==
':' && lpszPath[2] ==
'\\' && lpszPath[3] ==
'\0')
1646 if (lpszPath && *lpszPath)
1648 if (*lpszPath ==
'\\')
1652 else if (lpszPath[1]==
'\\')
1660 if (*lpszPath ==
'\\')
1671 else if (lpszPath[1] ==
':' && lpszPath[2] ==
'\\' && lpszPath[3] ==
'\0')
1709 FIXME(
"UNC Server Share not yet supported - FAILING\n");
1734 FIXME(
"UNC Server Share not yet supported - FAILING\n");
1876 while (*
mask ==
'*')
1909 while (*
mask ==
'*')
1937 TRACE(
"(%s,%s)\n", lpszPath, lpszMask);
1944 while (*lpszMask ==
' ')
1950 while (*lpszMask && *lpszMask !=
';')
1953 if (*lpszMask ==
';')
1966 static const WCHAR szStarDotStar[] = {
'*',
'.',
'*',
'\0' };
1970 if (!
lstrcmpW(lpszMask, szStarDotStar))
1975 while (*lpszMask ==
' ')
1981 while (*lpszMask && *lpszMask !=
';')
1984 if (*lpszMask ==
';')
2010 if (!lpszPath1 || !lpszPath2 || !(lpszStart =
PathSkipRootA(lpszPath1)))
2014 if (lpszStart - lpszPath1 > dwLen)
2031 if (!lpszPath1 || !lpszPath2 || !(lpszStart =
PathSkipRootW(lpszPath1)))
2035 if (lpszStart - lpszPath1 > dwLen)
2083 static const WCHAR szContentType[] = {
'C',
'o',
'n',
't',
'e',
'n',
't',
' ',
'T',
'y',
'p',
'e',
'\0' };
2093 !
strcmpiW(lpszContentType, szBuff))
2121 if (*lpszPath ==
'\\' || *lpszPath ==
':')
2142 if (*lpszPath ==
'\\' || *lpszPath ==
':')
2166 if (lpszPrefix && lpszPath &&
2181 if (lpszPrefix && lpszPath &&
2204 if (lpszPath && *lpszPath)
2222 if (lpszPath && *lpszPath)
2252#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
2253 if (lpszPath && (lpszPath[0]==
'\\') && (lpszPath[1]==
'\\') && (lpszPath[2]!=
'?'))
2255 if (lpszPath && (lpszPath[0]==
'\\') && (lpszPath[1]==
'\\'))
2275#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
2276 if (lpszPath && (lpszPath[0]==
'\\') && (lpszPath[1]==
'\\') && (lpszPath[2]!=
'?'))
2278 if (lpszPath && (lpszPath[0]==
'\\') && (lpszPath[1]==
'\\'))
2305 if (lpszPath && *lpszPath++ ==
'\\' && *lpszPath++ ==
'\\')
2309 if (*lpszPath ==
'\\')
2327 if (lpszPath && lpszPath[0] ==
'\\' && lpszPath[1] ==
'\\')
2329 return !
strchrW( lpszPath + 2,
'\\' );
2355 if (lpszPath && *lpszPath++ ==
'\\' && *lpszPath++ ==
'\\')
2360 if (*lpszPath ==
'\\')
2382 if (lpszPath && *lpszPath++ ==
'\\' && *lpszPath++ ==
'\\')
2387 if (*lpszPath ==
'\\')
2422 if (!lpszBuf || !lpszPath)
2431 WARN(
"Failed to convert string to widechar (too long?), LE %d.\n",
GetLastError());
2448 LPWSTR lpszDst = lpszBuf;
2456 if (!lpszBuf || !lpszPath)
2470 if (*lpszSrc ==
'\\')
2472 *lpszDst++ = *lpszSrc++;
2474 else if (*lpszSrc && lpszSrc[1] ==
':')
2477 *lpszDst++ = *lpszSrc++;
2478 *lpszDst++ = *lpszSrc++;
2479 if (*lpszSrc ==
'\\')
2480 *lpszDst++ = *lpszSrc++;
2486 if (*lpszSrc ==
'.')
2488 if (lpszSrc[1] ==
'\\' && (lpszSrc == lpszPath || lpszSrc[-1] ==
'\\' || lpszSrc[-1] ==
':'))
2492 else if (lpszSrc[1] ==
'.' && (lpszDst == lpszBuf || lpszDst[-1] ==
'\\'))
2497 if (lpszDst != lpszBuf)
2500 if (lpszDst > lpszBuf+1 && lpszDst[-1] ==
'\\' &&
2501 (lpszDst[-2] !=
'\\' || lpszDst > lpszBuf+2))
2503 if (lpszDst[-2] ==
':' && (lpszDst > lpszBuf+3 || lpszDst[-3] ==
':'))
2506 while (lpszDst > lpszBuf && *lpszDst !=
'\\')
2508 if (*lpszDst ==
'\\')
2516 while (lpszDst > lpszBuf && *lpszDst !=
'\\')
2518 if (lpszDst == lpszBuf)
2527 *lpszDst++ = *lpszSrc++;
2530 *lpszDst++ = *lpszSrc++;
2533 if (lpszDst - lpszBuf == 2 && lpszDst[-1] ==
':')
2562 if(!lpszPath || !*lpszPath)
2565 if ((lpszSlash =
StrChrA(lpszPath,
'\\')))
2567 if (lpszSlash[1] ==
'\\')
2569 return lpszSlash + 1;
2585 if(!lpszPath || !*lpszPath)
2588 if ((lpszSlash =
StrChrW(lpszPath,
'\\')))
2590 if (lpszSlash[1] ==
'\\')
2592 return lpszSlash + 1;
2624 dwLen =
strlen(lpszPath);
2629 strcpy(lpszPath + dwLen, lpszExtension);
2652 strcpyW(lpszPath + dwLen, lpszExtension);
2670 LPSTR pszIter = lpszPath;
2685 pszIter = lpszPath + 1;
2702 LPWSTR pszIter = lpszPath;
2717 pszIter = lpszPath + 1;
2754 LPCSTR lpszIter1 = lpszFile1;
2755 LPCSTR lpszIter2 = lpszFile2;
2762 if (!lpszFile1 || !lpszFile2)
2779 if ((!*lpszIter1 || *lpszIter1 ==
'\\') &&
2780 (!*lpszIter2 || *lpszIter2 ==
'\\'))
2781 iLen = lpszIter1 - lpszFile1;
2793 if (iLen && achPath)
2795 memcpy(achPath,lpszFile1,iLen);
2796 achPath[iLen] =
'\0';
2809 LPCWSTR lpszIter1 = lpszFile1;
2810 LPCWSTR lpszIter2 = lpszFile2;
2817 if (!lpszFile1 || !lpszFile2)
2834 if ((!*lpszIter1 || *lpszIter1 ==
'\\') &&
2835 (!*lpszIter2 || *lpszIter2 ==
'\\'))
2836 iLen = lpszIter1 - lpszFile1;
2848 if (iLen && achPath)
2851 achPath[iLen] =
'\0';
2893 static const WCHAR szEllipses[] = {
'.',
'.',
'.',
'\0' };
2916 DWORD dwEllipsesLen = 0, dwPathLen = 0;
2919 if (sFile != lpszPath) sFile--;
2923 dwEllipsesLen =
size.cx;
2926 dwPathLen =
size.cx;
2928 if (sFile != lpszPath)
2941 DWORD dwTotalLen = bEllipses? dwPathLen + dwEllipsesLen : dwPathLen;
2944 dwTotalLen +=
size.cx;
2945 if (dwTotalLen <=
dx)
2953 }
while (sPath > lpszPath);
2955 if (sPath > lpszPath)
2965 strcpyW(lpszPath, szEllipses);
2983 }
while (dwLen &&
size.cx + dwEllipsesLen >
dx);
2987 DWORD dwWritten = 0;
2992 while (dwWritten + dwEllipsesLen <
dx && dwLen < 3)
2995 dwWritten += dwEllipsesLen;
3040 TRACE(
"(%d)\n", ch);
3042 if (!ch || ch <
' ' || ch ==
'<' || ch ==
'>' ||
3043 ch ==
'"' || ch ==
'|' || ch ==
'/')
3045 else if (ch ==
'*' || ch==
'?')
3047 else if ((ch ==
'\\') || (ch ==
':'))
3053 if (((ch & 0x1) && ch !=
';') || !ch ||
isalnum(ch) || ch ==
'$' || ch ==
'&' || ch ==
'(' ||
3054 ch ==
'.' || ch ==
'@' || ch ==
'^' ||
3055 ch ==
'\'' || ch == 130 || ch ==
'`')
3073 static BOOL bUseSystemForSystemFolders =
FALSE;
3081 "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer",
3082 "UseSystemForSystemFolders", 0, 0, 0))
3083 bUseSystemForSystemFolders =
TRUE;
3085 return bUseSystemForSystemFolders;
3106 if (lpszPath && *lpszPath)
3127 if (!lpszPath || !*lpszPath)
3166 LPSTR lpszExtension;
3172 if (!lpszExtension || (lpszExtension - lpszPath +
strlen(lpszExt) >=
MAX_PATH))
3175 strcpy(lpszExtension, lpszExt);
3192 if (!lpszExtension || (lpszExtension - lpszPath +
strlenW(lpszExt) >=
MAX_PATH))
3195 strcpyW(lpszExtension, lpszExt);
3251 if (!lpszPath || !*lpszPath)
3254 if (*lpszPath ==
'\\' && lpszPath[1] ==
'\\')
3258 if ((lpszPath =
StrChrA(lpszPath,
'\\')) &&
3259 (lpszPath =
StrChrA(lpszPath + 1,
'\\')))
3261 return (
LPSTR)lpszPath;
3268 if (lpszPath[0] && lpszPath[1] ==
':' && lpszPath[2] ==
'\\')
3269 return (
LPSTR)lpszPath + 3;
3282 if (!lpszPath || !*lpszPath)
3285 if (*lpszPath ==
'\\' && lpszPath[1] ==
'\\')
3289 if ((lpszPath =
StrChrW(lpszPath,
'\\')) &&
3290 (lpszPath =
StrChrW(lpszPath + 1,
'\\')))
3296 if (lpszPath[0] && lpszPath[1] ==
':' && lpszPath[2] ==
'\\')
3297 return (
LPWSTR)lpszPath + 3;
3310 WCHAR *pathW = bufW;
3313 DWORD lenW =
sizeof(bufW)/
sizeof(
WCHAR), lenA;
3358 static const WCHAR file_colon[] = {
'f',
'i',
'l',
'e',
':',0 };
3359 static const WCHAR localhost[] = {
'l',
'o',
'c',
'a',
'l',
'h',
'o',
's',
't',0 };
3381 while (*
src ==
'/' || *
src ==
'\\') {
3432 while (*
src && *
src !=
'/' && *
src !=
'\\')
3461 if (*
dst ==
'/') *
dst =
'\\';
3462 if (
isalphaW(*tpath) && tpath[1] ==
'|')
3484 if (tpath != pszPath)
3487 if (tpath != pszPath)
3554 if(lpszPath && lpszFrom && lpszTo)
3575 static const WCHAR szPrevDirSlash[] = {
'.',
'.',
'\\',
'\0' };
3576 static const WCHAR szPrevDir[] = {
'.',
'.',
'\0' };
3584 if(!lpszPath || !lpszFrom || !lpszTo)
3601 lpszFrom = szFrom + dwLen;
3607 if (*lpszFrom ==
'\\')
3613 strcatW(lpszPath, *lpszFrom ? szPrevDirSlash : szPrevDir);
3621 if (*lpszTo && lpszTo[-1])
3623 if (*lpszTo !=
'\\')
3631 strcpyW(lpszPath + dwLen, lpszTo);
3771 if (*lpszPath ==
'\\' && lpszPath[1] ==
'\\')
3774 if (dwDriveNum == -1)
3797 if (*lpszPath ==
'\\' && lpszPath[1] ==
'\\')
3800 if (dwDriveNum == -1)
3824 DWORD dwNameLen = 0, dwExtLen = 0;
3833 if (*lpszPath ==
' ')
3835 if (*lpszPath ==
'.')
3865 DWORD dwNameLen = 0, dwExtLen = 0;
3874 if (*lpszPath ==
' ')
3876 if (*lpszPath ==
'.')
3933 static const WCHAR szAllFiles[] = {
'*',
'.',
'*',
'\0' };
3951 strcpyW(szSearch + dwLen, szAllFiles);
3960 if (
find_data.cFileName[1] ==
'\0')
continue;
4000 if (lpszSuffix && lppszArray && dwCount > 0)
4002 dwLen =
strlen(lpszSuffix);
4004 while (dwRet < dwCount)
4006 size_t dwCompareLen =
strlen(*lppszArray);
4007 if (dwCompareLen < dwLen)
4009 if (!
strcmp(lpszSuffix + dwLen - dwCompareLen, *lppszArray))
4031 if (lpszSuffix && lppszArray && dwCount > 0)
4035 while (dwRet < dwCount)
4037 size_t dwCompareLen =
strlenW(*lppszArray);
4038 if (dwCompareLen < dwLen)
4040 if (!
strcmpW(lpszSuffix + dwLen - dwCompareLen, *lppszArray))
4071 if (lpszExt > lpszPath && lpszExt[-1] ==
']')
4073 LPSTR lpszSkip = lpszExt - 2;
4074 if (*lpszSkip ==
'[')
4077 while (lpszSkip > lpszPath &&
isdigit(lpszSkip[-1]))
4079 if (lpszSkip > lpszPath && lpszSkip[-1] ==
'[' && lpszSkip[-2] !=
'\\')
4084 *lpszSkip++ = *lpszExt++;
4103 if (lpszExt > lpszPath && lpszExt[-1] ==
']')
4105 LPWSTR lpszSkip = lpszExt - 2;
4106 if (*lpszSkip ==
'[')
4109 while (lpszSkip > lpszPath &&
isdigitW(lpszSkip[-1]))
4111 if (lpszSkip > lpszPath && lpszSkip[-1] ==
'[' && lpszSkip[-2] !=
'\\')
4116 *lpszSkip++ = *lpszExt++;
4147 if (!pathW)
return FALSE;
4154 if (buf_len <
len + 1)
return FALSE;
4160static const WCHAR allusersprofileW[] = {
'%',
'A',
'L',
'L',
'U',
'S',
'E',
'R',
'S',
'P',
'R',
'O',
'F',
'I',
'L',
'E',
'%',0};
4162static const WCHAR programfilesW[] = {
'%',
'P',
'r',
'o',
'g',
'r',
'a',
'm',
'F',
'i',
'l',
'e',
's',
'%',0};
4163static const WCHAR systemrootW[] = {
'%',
'S',
'y',
's',
't',
'e',
'm',
'R',
'o',
'o',
't',
'%',0};
4164static const WCHAR systemdriveW[] = {
'%',
'S',
'y',
's',
't',
'e',
'm',
'D',
'r',
'i',
'v',
'e',
'%',0};
4165static const WCHAR userprofileW[] = {
'%',
'U',
'S',
'E',
'R',
'P',
'R',
'O',
'F',
'I',
'L',
'E',
'%',0};
4181 if (
map->len)
map->len--;
4227 needed =
match->varlen + pathlen -
match->len;
4228 if (
match->len == 0 || needed > buf_len)
return FALSE;
4256 TRACE(
"(%s,%p,%d)\n", lpszFile, lpszPath, dwPathLen);
4272 static const WCHAR szWeb[] = {
'\\',
'W',
'e',
'b',
'\\',
'\0'};
4273 static const WCHAR szWebMui[] = {
'm',
'u',
'i',
'\\',
'%',
'0',
'4',
'x',
'\\',
'\0'};
4274#define szWebLen (sizeof(szWeb)/sizeof(WCHAR))
4275#define szWebMuiLen ((sizeof(szWebMui)+1)/sizeof(WCHAR))
4276 DWORD dwLen, dwFileLen;
4277 LANGID lidSystem, lidUser;
4283 if (dwLen > 0 && lpszPath[dwLen-1] ==
'\\')
4286 dwFileLen =
strlenW(lpszFile);
4288 if (dwLen + dwFileLen +
szWebLen >= dwPathLen)
4291 strcpyW(lpszPath+dwLen, szWeb);
4293 dwPathLen = dwPathLen - dwLen;
4298 if (lidSystem != lidUser)
4303 wsprintfW(lpszPath + dwLen, szWebMui, lidUser);
4311 strcpyW(lpszPath + dwLen, lpszFile);
4318#define PATH_CHAR_CLASS_LETTER 0x00000001
4319#define PATH_CHAR_CLASS_ASTERIX 0x00000002
4320#define PATH_CHAR_CLASS_DOT 0x00000004
4321#define PATH_CHAR_CLASS_BACKSLASH 0x00000008
4322#define PATH_CHAR_CLASS_COLON 0x00000010
4323#define PATH_CHAR_CLASS_SEMICOLON 0x00000020
4324#define PATH_CHAR_CLASS_COMMA 0x00000040
4325#define PATH_CHAR_CLASS_SPACE 0x00000080
4326#define PATH_CHAR_CLASS_OTHER_VALID 0x00000100
4327#define PATH_CHAR_CLASS_DOUBLEQUOTE 0x00000200
4329#define PATH_CHAR_CLASS_INVALID 0x00000000
4330#define PATH_CHAR_CLASS_ANY 0xffffffff
4408 if ((
unsigned)
c > 0x7e)
int strcmp(const char *String1, const char *String2)
ACPI_SIZE strlen(const char *String)
char * strcpy(char *DstString, const char *SrcString)
char * strchr(const char *String, int ch)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void shell(int argc, const char *argv[])
static int find_data(const struct Vector *v, const BYTE *pData, int size)
INT WINAPI StrToIntW(LPCWSTR lpString)
LPWSTR WINAPI StrChrW(LPCWSTR lpszStr, WCHAR ch)
INT WINAPI StrToIntA(LPCSTR lpszStr)
LPSTR WINAPI StrChrA(LPCSTR lpszStr, WORD ch)
#define ERROR_INVALID_PARAMETER
#define GetEnvironmentVariableW(x, y, z)
#define INVALID_HANDLE_VALUE
#define HeapFree(x, y, z)
#define WideCharToMultiByte
#define MultiByteToWideChar
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
UINT WINAPI SetErrorMode(IN UINT uMode)
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
BOOL WINAPI SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes)
BOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes)
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName)
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
BOOL WINAPI FindClose(HANDLE hFindFile)
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
DWORD WINAPI SearchPathA(IN LPCSTR lpPath OPTIONAL, IN LPCSTR lpFileName, IN LPCSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPSTR lpBuffer, OUT LPSTR *lpFilePart OPTIONAL)
DWORD WINAPI SearchPathW(IN LPCWSTR lpPath OPTIONAL, IN LPCWSTR lpFileName, IN LPCWSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart OPTIONAL)
DWORD WINAPI GetFullPathNameA(IN LPCSTR lpFileName, IN DWORD nBufferLength, OUT LPSTR lpBuffer, OUT LPSTR *lpFilePart)
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
UINT WINAPI GetSystemWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
BOOL WINAPI IsDBCSLeadByte(BYTE testchar)
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
INT WINAPI CompareStringW(LCID lcid, DWORD flags, LPCWSTR str1, INT len1, LPCWSTR str2, INT len2)
LANGID WINAPI GetUserDefaultUILanguage(void)
int WINAPI lstrcmpA(LPCSTR str1, LPCSTR str2)
LANGID WINAPI GetSystemDefaultUILanguage(void)
HRESULT WINAPI SHGetWebFolderFilePathA(LPCSTR lpszFile, LPSTR lpszPath, DWORD dwPathLen)
void WINAPI PathStripPathW(LPWSTR lpszPath)
void WINAPI PathRemoveArgsW(LPWSTR lpszPath)
static const WCHAR userprofileW[]
BOOL WINAPI PathFileExistsDefExtA(LPSTR lpszPath, DWORD dwWhich)
void WINAPI PathRemoveExtensionA(LPSTR lpszPath)
VOID WINAPI PathUnquoteSpacesA(LPSTR lpszPath)
BOOL WINAPI PathIsUNCA(LPCSTR lpszPath)
#define PATH_CHAR_CLASS_DOUBLEQUOTE
BOOL WINAPI PathIsDirectoryA(LPCSTR lpszPath)
BOOL WINAPI PathMakeSystemFolderA(LPCSTR lpszPath)
static const WCHAR systemdriveW[]
void WINAPI PathStripPathA(LPSTR lpszPath)
LPSTR WINAPI PathFindFileNameA(LPCSTR lpszPath)
#define PATH_CHAR_CLASS_OTHER_VALID
VOID WINAPI PathQuoteSpacesA(LPSTR lpszPath)
BOOL WINAPI PathIsNetworkPathW(LPCWSTR lpszPath)
BOOL WINAPI PathRelativePathToA(LPSTR lpszPath, LPCSTR lpszFrom, DWORD dwAttrFrom, LPCSTR lpszTo, DWORD dwAttrTo)
LPSTR WINAPI PathBuildRootA(LPSTR lpszPath, int drive)
int WINAPI PathGetDriveNumberW(const WCHAR *path)
#define PATH_CHAR_CLASS_SPACE
#define PATH_CHAR_CLASS_ASTERIX
LPWSTR WINAPI PathSkipRootW(LPCWSTR lpszPath)
BOOL WINAPI PathUnExpandEnvStringsA(LPCSTR path, LPSTR buffer, UINT buf_len)
BOOL WINAPI PathMakeSystemFolderW(LPCWSTR lpszPath)
BOOL(WINAPI * fnpIsNetDrive)(int)
BOOL WINAPI PathIsPrefixA(LPCSTR lpszPrefix, LPCSTR lpszPath)
static const WCHAR programfilesW[]
int WINAPI PathCommonPrefixW(LPCWSTR lpszFile1, LPCWSTR lpszFile2, LPWSTR achPath)
HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwReserved)
BOOL WINAPI PathIsNetworkPathA(LPCSTR lpszPath)
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
static BOOL PathMatchSingleMaskW(LPCWSTR name, LPCWSTR mask)
BOOL WINAPI PathFindOnPathExA(LPSTR lpszFile, LPCSTR *lppszOtherDirs, DWORD dwWhich)
void WINAPI PathRemoveArgsA(LPSTR lpszPath)
static const DWORD SHELL_charclass[]
#define GET_FUNC(func, module, name, fail)
LPSTR WINAPI PathFindNextComponentA(LPCSTR lpszPath)
BOOL WINAPI PathFindOnPathW(LPWSTR lpszFile, LPCWSTR *lppszOtherDirs)
UINT WINAPI PathGetCharTypeA(UCHAR ch)
int WINAPI PathParseIconLocationA(LPSTR lpszPath)
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
BOOL WINAPI PathIsDirectoryEmptyW(LPCWSTR lpszPath)
BOOL WINAPI PathCompactPathExA(LPSTR lpszDest, LPCSTR lpszPath, UINT cchMax, DWORD dwFlags)
VOID WINAPI PathRemoveBlanksA(LPSTR lpszPath)
BOOL WINAPI PathIsSystemFolderA(LPCSTR lpszPath, DWORD dwAttrib)
BOOL WINAPI PathCompactPathExW(LPWSTR lpszDest, LPCWSTR lpszPath, UINT cchMax, DWORD dwFlags)
#define PATH_CHAR_CLASS_ANY
BOOL WINAPI PathIsRelativeA(LPCSTR lpszPath)
static BOOL PathMatchSingleMaskA(LPCSTR name, LPCSTR mask)
static BOOL SHLWAPI_UseSystemForSystemFolders(void)
int WINAPI PathGetDriveNumberA(LPCSTR lpszPath)
BOOL WINAPI PathRemoveFileSpecA(LPSTR lpszPath)
BOOL WINAPI PathIsUNCServerW(LPCWSTR lpszPath)
BOOL WINAPI PathRelativePathToW(LPWSTR lpszPath, LPCWSTR lpszFrom, DWORD dwAttrFrom, LPCWSTR lpszTo, DWORD dwAttrTo)
BOOL WINAPI PathStripToRootW(LPWSTR lpszPath)
BOOL WINAPI PathMakePrettyW(LPWSTR lpszPath)
#define PATH_CHAR_CLASS_LETTER
BOOL WINAPI PathUnExpandEnvStringsW(LPCWSTR path, LPWSTR buffer, UINT buf_len)
VOID WINAPI PathUndecorateA(LPSTR lpszPath)
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
static BOOL SHLWAPI_PathFindInOtherDirs(LPWSTR lpszFile, DWORD dwWhich)
BOOL WINAPI PathCompactPathA(HDC hDC, LPSTR lpszPath, UINT dx)
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
BOOL WINAPI PathUnmakeSystemFolderW(LPCWSTR lpszPath)
BOOL WINAPI PathFindOnPathA(LPSTR lpszFile, LPCSTR *lppszOtherDirs)
static fnpIsNetDrive pIsNetDrive
BOOL WINAPI PathMatchSpecW(LPCWSTR lpszPath, LPCWSTR lpszMask)
LPWSTR WINAPI PathBuildRootW(LPWSTR lpszPath, int drive)
BOOL WINAPI PathFileExistsA(LPCSTR lpszPath)
BOOL WINAPI PathFileExistsAndAttributesA(LPCSTR lpszPath, DWORD *dwAttr)
BOOL WINAPI PathIsRootW(LPCWSTR lpszPath)
BOOL WINAPI PathIsRootA(LPCSTR lpszPath)
#define PATH_CHAR_CLASS_SEMICOLON
VOID WINAPI PathQuoteSpacesW(LPWSTR lpszPath)
static HMODULE SHLWAPI_hshell32
HRESULT WINAPI SHGetWebFolderFilePathW(LPCWSTR, LPWSTR, DWORD)
VOID WINAPI PathSetDlgItemPathA(HWND hDlg, int id, LPCSTR lpszPath)
static WCHAR * heap_strdupAtoW(LPCSTR str)
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
BOOL WINAPI PathIsContentTypeW(LPCWSTR lpszPath, LPCWSTR lpszContentType)
BOOL WINAPI PathIsUNCServerA(LPCSTR lpszPath)
BOOL WINAPI PathSearchAndQualifyA(LPCSTR lpszPath, LPSTR lpszBuf, UINT cchBuf)
VOID WINAPI PathUnquoteSpacesW(LPWSTR lpszPath)
BOOL WINAPI PathCompactPathW(HDC hDC, LPWSTR lpszPath, UINT dx)
#define PATH_CHAR_CLASS_COLON
BOOL WINAPI PathIsSystemFolderW(LPCWSTR lpszPath, DWORD dwAttrib)
BOOL WINAPI PathMatchSpecA(LPCSTR lpszPath, LPCSTR lpszMask)
BOOL WINAPI PathIsUNCW(LPCWSTR lpszPath)
BOOL WINAPI PathIsSameRootW(LPCWSTR lpszPath1, LPCWSTR lpszPath2)
BOOL WINAPI PathFindOnPathExW(LPWSTR lpszFile, LPCWSTR *lppszOtherDirs, DWORD dwWhich)
BOOL WINAPI PathMakePrettyA(LPSTR lpszPath)
static const WCHAR allusersprofileW[]
LPSTR WINAPI PathFindExtensionA(LPCSTR lpszPath)
LPSTR WINAPI PathGetArgsA(LPCSTR lpszPath)
BOOL WINAPI PathIsUNCServerShareW(LPCWSTR lpszPath)
LPCSTR WINAPI PathFindSuffixArrayA(LPCSTR lpszSuffix, LPCSTR *lppszArray, int dwCount)
LPWSTR WINAPI PathFindNextComponentW(LPCWSTR lpszPath)
static const WCHAR appdataW[]
HRESULT WINAPI PathCreateFromUrlA(LPCSTR pszUrl, LPSTR pszPath, LPDWORD pcchPath, DWORD dwReserved)
BOOL WINAPI PathIsFileSpecA(LPCSTR lpszPath)
static void init_envvars_map(struct envvars_map *map)
BOOL WINAPI PathIsUNCServerShareA(LPCSTR lpszPath)
BOOL WINAPI PathIsLFNFileSpecW(LPCWSTR lpszPath)
VOID WINAPI PathUndecorateW(LPWSTR lpszPath)
BOOL WINAPI PathStripToRootA(LPSTR lpszPath)
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
BOOL WINAPI PathSearchAndQualifyW(LPCWSTR lpszPath, LPWSTR lpszBuf, UINT cchBuf)
UINT WINAPI PathGetCharTypeW(WCHAR ch)
BOOL WINAPI PathIsValidCharA(char c, DWORD class)
HRESULT WINAPI PathCreateFromUrlAlloc(LPCWSTR pszUrl, LPWSTR *pszPath, DWORD dwReserved)
static const WCHAR systemrootW[]
BOOL WINAPI PathUnmakeSystemFolderA(LPCSTR lpszPath)
#define PATH_CHAR_CLASS_COMMA
VOID WINAPI PathSetDlgItemPathW(HWND hDlg, int id, LPCWSTR lpszPath)
BOOL WINAPI PathIsFileSpecW(LPCWSTR lpszPath)
int WINAPI PathCommonPrefixA(LPCSTR lpszFile1, LPCSTR lpszFile2, LPSTR achPath)
LPCWSTR WINAPI PathFindSuffixArrayW(LPCWSTR lpszSuffix, LPCWSTR *lppszArray, int dwCount)
BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR lpszPath, DWORD *dwAttr)
BOOL WINAPI PathIsLFNFileSpecA(LPCSTR lpszPath)
BOOL WINAPI PathFileExistsDefExtW(LPWSTR lpszPath, DWORD dwWhich)
LPSTR WINAPI PathSkipRootA(LPCSTR lpszPath)
#define PATH_CHAR_CLASS_INVALID
BOOL WINAPI PathIsPrefixW(LPCWSTR lpszPrefix, LPCWSTR lpszPath)
LPWSTR WINAPI PathRemoveBackslashW(LPWSTR lpszPath)
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
BOOL WINAPI PathIsContentTypeA(LPCSTR lpszPath, LPCSTR lpszContentType)
#define PATH_CHAR_CLASS_BACKSLASH
VOID WINAPI PathRemoveBlanksW(LPWSTR lpszPath)
#define PATH_CHAR_CLASS_DOT
BOOL WINAPI PathIsDirectoryEmptyA(LPCSTR lpszPath)
LPWSTR WINAPI PathGetArgsW(LPCWSTR lpszPath)
BOOL WINAPI PathIsSameRootA(LPCSTR lpszPath1, LPCSTR lpszPath2)
int WINAPI PathParseIconLocationW(LPWSTR lpszPath)
LPSTR WINAPI PathRemoveBackslashA(LPSTR lpszPath)
BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath)
DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
DWORD WINAPI SHGetValueA(HKEY hKey, LPCSTR lpszSubKey, LPCSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
LPWSTR WINAPI StrCpyNW(LPWSTR dst, LPCWSTR src, int count)
LPWSTR WINAPI StrCpyW(LPWSTR lpszStr, LPCWSTR lpszSrc)
LPWSTR WINAPI StrDupW(LPCWSTR lpszStr)
HRESULT WINAPI UrlUnescapeW(LPWSTR pszUrl, LPWSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
static unsigned char buff[32768]
_Check_return_ _CRTIMP int __cdecl isalnum(_In_ int _C)
BOOL unescape(WCHAR *str, size_t *len)
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
static const BYTE localhost[]
static LPWSTR PDWORD pcchPath
static unsigned(__cdecl *hash_bstr)(bstr_t s)
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
#define SEM_FAILCRITICALERRORS
_Use_decl_annotations_ NTSTATUS NTAPI RtlUnicodeToMultiByteN(_Out_ PCHAR MbString, _In_ ULONG MbSize, _Out_opt_ PULONG ResultSize, _In_ PCWCH UnicodeString, _In_ ULONG UnicodeSize)
_Use_decl_annotations_ NTSTATUS NTAPI RtlUnicodeToMultiByteSize(_Out_ PULONG MbSize, _In_ PCWCH UnicodeString, _In_ ULONG UnicodeSize)
#define FILE_ATTRIBUTE_READONLY
#define FILE_ATTRIBUTE_HIDDEN
#define FILE_ATTRIBUTE_SYSTEM
#define FILE_ATTRIBUTE_DIRECTORY
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define PathAddExtensionA
#define PathCanonicalizeA
#define PathAddExtensionW
#define PathCanonicalizeW
#define PathAddBackslashA
#define PathRenameExtensionA
#define PathRenameExtensionW
#define PathAddBackslashW
#define strncmpiW(s1, s2, n)
#define strncmpW(s1, s2, n)
EXTERN_C int WINAPI IsNetDrive(int drive)
#define URL_UNESCAPE_INPLACE
#define RtlMoveMemory(Destination, Source, Length)
#define INVALID_FILE_ATTRIBUTES
DWORD WINAPI GetLastError(void)
#define GetFileAttributes
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
BOOL WINAPI GetTextExtentPointW(_In_ HDC hdc, _In_reads_(c) LPCWSTR lpString, _In_ int c, _Out_ LPSIZE lpsz)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
#define HKEY_LOCAL_MACHINE
#define HKEY_CLASSES_ROOT
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
LPSTR WINAPI CharPrevA(_In_ LPCSTR, _In_ LPCSTR)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
LPSTR WINAPI CharNextA(_In_ LPCSTR)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
HDC WINAPI GetDC(_In_opt_ HWND)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)