From feb215f7d11bfc20e18bbcc19e09c2d7aa3c01ac Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 25 Apr 2015 10:59:08 +0000 Subject: [PATCH] [SHLWAPI] Sync with Wine Staging 1.7.37. CORE-9246 svn path=/trunk/; revision=67398 --- reactos/dll/win32/setupapi/devinst.c | 6 +-- reactos/dll/win32/shlwapi/ordinal.c | 11 ++---- reactos/dll/win32/shlwapi/path.c | 35 +++++++++++------ reactos/dll/win32/shlwapi/string.c | 59 +++++++++++++++++----------- reactos/dll/win32/shlwapi/url.c | 5 ++- reactos/media/doc/README.WINE | 2 +- 6 files changed, 70 insertions(+), 48 deletions(-) diff --git a/reactos/dll/win32/setupapi/devinst.c b/reactos/dll/win32/setupapi/devinst.c index 26886baba73..93934e726d7 100644 --- a/reactos/dll/win32/setupapi/devinst.c +++ b/reactos/dll/win32/setupapi/devinst.c @@ -661,7 +661,7 @@ BOOL WINAPI SetupDiBuildClassInfoList( * SetupDiBuildClassInfoListExA (SETUPAPI.@) * * Returns a list of setup class GUIDs that identify the classes - * that are installed on a local or remote macine. + * that are installed on a local or remote machine. * * PARAMS * Flags [I] control exclusion of classes from the list. @@ -708,7 +708,7 @@ BOOL WINAPI SetupDiBuildClassInfoListExA( * SetupDiBuildClassInfoListExW (SETUPAPI.@) * * Returns a list of setup class GUIDs that identify the classes - * that are installed on a local or remote macine. + * that are installed on a local or remote machine. * * PARAMS * Flags [I] control exclusion of classes from the list. @@ -1258,7 +1258,7 @@ SetupDiCreateDeviceInfoListExA(const GUID *ClassGuid, * Create an empty DeviceInfoSet list. * * PARAMS - * ClassGuid [I] if not NULL only devices with GUID ClcassGuid are associated + * ClassGuid [I] if not NULL only devices with GUID ClassGuid are associated * with this list. * hwndParent [I] hwnd needed for interface related actions. * MachineName [I] name of machine to create emtpy DeviceInfoSet list, if NULL diff --git a/reactos/dll/win32/shlwapi/ordinal.c b/reactos/dll/win32/shlwapi/ordinal.c index ad5ffa38a60..ea22c8421ea 100644 --- a/reactos/dll/win32/shlwapi/ordinal.c +++ b/reactos/dll/win32/shlwapi/ordinal.c @@ -431,7 +431,7 @@ exit: * Success: S_OK. langbuf is set to the language string found. * Failure: E_FAIL, If any arguments are invalid, error occurred, or Explorer * does not contain the setting. - * HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), If the buffer is not big enough + * E_NOT_SUFFICIENT_BUFFER, If the buffer is not big enough */ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen) { @@ -484,7 +484,7 @@ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen) } *buflen = 0; - return __HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + return E_NOT_SUFFICIENT_BUFFER; } /************************************************************************* @@ -5032,11 +5032,8 @@ INT WINAPI SHFormatDateTimeW(const FILETIME UNALIGNED *fileTime, DWORD *flags, { if ((fmt_flags & FDTF_LONGDATE) && (ret < size + 2)) { - if (ret < size + 2) - { - lstrcatW(&buf[ret-1], sep1); - ret += 2; - } + lstrcatW(&buf[ret-1], sep1); + ret += 2; } else { diff --git a/reactos/dll/win32/shlwapi/path.c b/reactos/dll/win32/shlwapi/path.c index 4fa9e1e84c4..f10bd8909ce 100644 --- a/reactos/dll/win32/shlwapi/path.c +++ b/reactos/dll/win32/shlwapi/path.c @@ -3280,6 +3280,9 @@ HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, if (!pszUrl || !pszPath || !pcchPath || !*pcchPath) return E_INVALIDARG; + if (lstrlenW(pszUrl) < 5) + return E_INVALIDARG; + if (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5, file_colon, 5) != CSTR_EQUAL) return E_INVALIDARG; @@ -3321,9 +3324,8 @@ HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, src -= 1; break; case 2: - if (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, src, 9, - localhost, 9) == CSTR_EQUAL && - (src[9] == '/' || src[9] == '\\')) + if (lstrlenW(src) >= 10 && CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, + src, 9, localhost, 9) == CSTR_EQUAL && (src[9] == '/' || src[9] == '\\')) { /* 'file://localhost/' + escaped DOS path */ src += 10; @@ -3835,13 +3837,13 @@ BOOL WINAPI PathIsDirectoryEmptyW(LPCWSTR lpszPath) WCHAR szSearch[MAX_PATH]; DWORD dwLen; HANDLE hfind; - BOOL retVal = FALSE; + BOOL retVal = TRUE; WIN32_FIND_DATAW find_data; TRACE("(%s)\n",debugstr_w(lpszPath)); if (!lpszPath || !PathIsDirectoryW(lpszPath)) - return FALSE; + return FALSE; lstrcpynW(szSearch, lpszPath, MAX_PATH); PathAddBackslashW(szSearch); @@ -3851,14 +3853,23 @@ BOOL WINAPI PathIsDirectoryEmptyW(LPCWSTR lpszPath) strcpyW(szSearch + dwLen, szAllFiles); hfind = FindFirstFileW(szSearch, &find_data); - if (hfind != INVALID_HANDLE_VALUE) - { - if (find_data.cFileName[0] == '.' && find_data.cFileName[1] == '.') - /* The only directory entry should be the parent */ - retVal = !FindNextFileW(hfind, &find_data); - FindClose(hfind); - } + if (hfind == INVALID_HANDLE_VALUE) + return FALSE; + do + { + if (find_data.cFileName[0] == '.') + { + if (find_data.cFileName[1] == '\0') continue; + if (find_data.cFileName[1] == '.' && find_data.cFileName[2] == '\0') continue; + } + + retVal = FALSE; + break; + } + while (FindNextFileW(hfind, &find_data)); + + FindClose(hfind); return retVal; } diff --git a/reactos/dll/win32/shlwapi/string.c b/reactos/dll/win32/shlwapi/string.c index eae52dcbea2..1cd886ea594 100644 --- a/reactos/dll/win32/shlwapi/string.c +++ b/reactos/dll/win32/shlwapi/string.c @@ -343,7 +343,7 @@ int WINAPI StrCmpIW(LPCWSTR lpszStr, LPCWSTR lpszComp) * PARAMS * lpszStr [I] First string to compare * lpszComp [I] Second string to compare - * iLen [I] Maximum number of chars to compare. + * iLen [I] Number of chars to compare * * RETURNS * An integer less than, equal to or greater than 0, indicating that @@ -374,7 +374,7 @@ INT WINAPI StrCmpNW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen) * PARAMS * lpszStr [I] First string to compare * lpszComp [I] Second string to compare - * iLen [I] Maximum number of chars to compare. + * iLen [I] Number of chars to compare * * RETURNS * An integer less than, equal to or greater than 0, indicating that @@ -541,13 +541,15 @@ static LPSTR SHLWAPI_StrStrHelperA(LPCSTR lpszStr, LPCSTR lpszSearch, INT (WINAPI *pStrCmpFn)(LPCSTR,LPCSTR,INT)) { size_t iLen; + LPCSTR end; if (!lpszStr || !lpszSearch || !*lpszSearch) return NULL; iLen = strlen(lpszSearch); + end = lpszStr + strlen(lpszStr); - while (*lpszStr) + while (lpszStr + iLen <= end) { if (!pStrCmpFn(lpszStr, lpszSearch, iLen)) return (LPSTR)lpszStr; @@ -603,6 +605,7 @@ LPWSTR WINAPI StrStrW(LPCWSTR lpszStr, LPCWSTR lpszSearch) */ LPSTR WINAPI StrRStrIA(LPCSTR lpszStr, LPCSTR lpszEnd, LPCSTR lpszSearch) { + LPSTR lpszRet = NULL; WORD ch1, ch2; INT iLen; @@ -611,28 +614,28 @@ LPSTR WINAPI StrRStrIA(LPCSTR lpszStr, LPCSTR lpszEnd, LPCSTR lpszSearch) if (!lpszStr || !lpszSearch || !*lpszSearch) return NULL; - if (!lpszEnd) - lpszEnd = lpszStr + lstrlenA(lpszStr); - if (lpszEnd == lpszStr) - return NULL; - if (IsDBCSLeadByte(*lpszSearch)) ch1 = *lpszSearch << 8 | (UCHAR)lpszSearch[1]; else ch1 = *lpszSearch; iLen = lstrlenA(lpszSearch); - do + if (!lpszEnd) + lpszEnd = lpszStr + lstrlenA(lpszStr); + else /* reproduce the broken behaviour on Windows */ + lpszEnd += min(iLen - 1, lstrlenA(lpszEnd)); + + while (lpszStr + iLen <= lpszEnd && *lpszStr) { - lpszEnd = CharPrevA(lpszStr, lpszEnd); - ch2 = IsDBCSLeadByte(*lpszEnd)? *lpszEnd << 8 | (UCHAR)lpszEnd[1] : *lpszEnd; + ch2 = IsDBCSLeadByte(*lpszStr)? *lpszStr << 8 | (UCHAR)lpszStr[1] : *lpszStr; if (!ChrCmpIA(ch1, ch2)) { - if (!StrCmpNIA(lpszEnd, lpszSearch, iLen)) - return (LPSTR)lpszEnd; + if (!StrCmpNIA(lpszStr, lpszSearch, iLen)) + lpszRet = (LPSTR)lpszStr; } - } while (lpszEnd > lpszStr); - return NULL; + lpszStr = CharNextA(lpszStr); + } + return lpszRet; } /************************************************************************* @@ -642,6 +645,7 @@ LPSTR WINAPI StrRStrIA(LPCSTR lpszStr, LPCSTR lpszEnd, LPCSTR lpszSearch) */ LPWSTR WINAPI StrRStrIW(LPCWSTR lpszStr, LPCWSTR lpszEnd, LPCWSTR lpszSearch) { + LPWSTR lpszRet = NULL; INT iLen; TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); @@ -649,18 +653,23 @@ LPWSTR WINAPI StrRStrIW(LPCWSTR lpszStr, LPCWSTR lpszEnd, LPCWSTR lpszSearch) if (!lpszStr || !lpszSearch || !*lpszSearch) return NULL; - if (!lpszEnd) - lpszEnd = lpszStr + strlenW(lpszStr); - iLen = strlenW(lpszSearch); - while (lpszEnd > lpszStr) + if (!lpszEnd) + lpszEnd = lpszStr + strlenW(lpszStr); + else /* reproduce the broken behaviour on Windows */ + lpszEnd += min(iLen - 1, lstrlenW(lpszEnd)); + + while (lpszStr + iLen <= lpszEnd && *lpszStr) { - lpszEnd--; - if (!StrCmpNIW(lpszEnd, lpszSearch, iLen)) - return (LPWSTR)lpszEnd; + if (!ChrCmpIW(*lpszSearch, *lpszStr)) + { + if (!StrCmpNIW(lpszStr, lpszSearch, iLen)) + lpszRet = (LPWSTR)lpszStr; + } + lpszStr++; } - return NULL; + return lpszRet; } /************************************************************************* @@ -690,6 +699,7 @@ LPSTR WINAPI StrStrIA(LPCSTR lpszStr, LPCSTR lpszSearch) LPWSTR WINAPI StrStrIW(LPCWSTR lpszStr, LPCWSTR lpszSearch) { int iLen; + LPCWSTR end; TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); @@ -697,8 +707,9 @@ LPWSTR WINAPI StrStrIW(LPCWSTR lpszStr, LPCWSTR lpszSearch) return NULL; iLen = strlenW(lpszSearch); + end = lpszStr + strlenW(lpszStr); - while (*lpszStr) + while (lpszStr + iLen <= end) { if (!StrCmpNIW(lpszStr, lpszSearch, iLen)) return (LPWSTR)lpszStr; diff --git a/reactos/dll/win32/shlwapi/url.c b/reactos/dll/win32/shlwapi/url.c index 371f0f7fbc6..30c4b252719 100644 --- a/reactos/dll/win32/shlwapi/url.c +++ b/reactos/dll/win32/shlwapi/url.c @@ -899,7 +899,10 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, work = preliminary + base.cchProtocol+1+base.cchSuffix - 1; if (*work++ != '/') *(work++) = '/'; - strcpyW(work, relative.pszSuffix); + if (relative.pszSuffix[0] == '.' && relative.pszSuffix[1] == 0) + *work = 0; + else + strcpyW(work, relative.pszSuffix); break; default: diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 9ba5c829182..538bad916dc 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -180,7 +180,7 @@ reactos/dll/win32/shdoclc # Synced to Wine-1.7.27 reactos/dll/win32/shdocvw # Synced to WineStaging-1.7.37 reactos/dll/win32/shell32 # Forked at Wine-20071011 reactos/dll/win32/shfolder # Synced to Wine-1.7.27 -reactos/dll/win32/shlwapi # Synced to Wine-1.7.27 +reactos/dll/win32/shlwapi # Synced to WineStaging-1.7.37 reactos/dll/win32/slbcsp # Synced to Wine-1.7.27 reactos/dll/win32/snmpapi # Synced to Wine-1.7.27 reactos/dll/win32/softpub # Synced to Wine-1.7.27