Index: dll/win32/shell32/wine/pidl.c =================================================================== --- dll/win32/shell32/wine/pidl.c (revision 75430) +++ dll/win32/shell32/wine/pidl.c (working copy) @@ -482,9 +482,6 @@ */ BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { - char szData1[MAX_PATH]; - char szData2[MAX_PATH]; - LPCITEMIDLIST pidltemp1 = pidl1; LPCITEMIDLIST pidltemp2 = pidl2; @@ -505,11 +502,52 @@ while (pidltemp1->mkid.cb && pidltemp2->mkid.cb) { - _ILSimpleGetText(pidltemp1, szData1, MAX_PATH); - _ILSimpleGetText(pidltemp2, szData2, MAX_PATH); + LPPIDLDATA pdata1 = _ILGetDataPointer(pidltemp1); + LPPIDLDATA pdata2 = _ILGetDataPointer(pidltemp2); - if (strcasecmp( szData1, szData2 )) + IID *iid1 = _ILGetGUIDPointer(pidltemp1); + IID *iid2 = _ILGetGUIDPointer(pidltemp2); + + FileStructW* pDataW1 = _ILGetFileStructW(pidltemp1); + FileStructW* pDataW2 = _ILGetFileStructW(pidltemp2); + + if (_ILIsDesktop(pidltemp1) && _ILIsDesktop(pidltemp2)) + { + return TRUE; + } + else if (_ILIsDesktop(pidltemp1) || _ILIsDesktop(pidltemp2)) + { return FALSE; + } + else if (iid1 || iid2) + { + if (!iid1 || !iid2 || memcmp(iid1, iid2, sizeof(GUID))) + return FALSE; + } + else if (pDataW1 || pDataW2) + { + if (!pDataW1 || !pDataW2 || wcsicmp(pDataW1->wszName, pDataW2->wszName)) + return FALSE; + } + else if (_ILIsFolder(pidltemp1) || _ILIsFolder(pidltemp2)) + { + if (!_ILIsFolder(pidltemp1) || !_ILIsFolder(pidltemp2) || strcmp(pdata1->u.file.szNames, pdata2->u.file.szNames)) + return FALSE; + } + else if (_ILIsValue(pidltemp1) || _ILIsValue(pidltemp2)) + if (!_ILIsValue(pidltemp1) || !_ILIsValue(pidltemp2) || strcmp(pdata1->u.file.szNames, pdata2->u.file.szNames)) + { + return FALSE; + } + else if (_ILIsDrive(pidltemp1) || _ILIsDrive(pidltemp2)) + { + if (!_ILIsDrive(pidltemp1) || !_ILIsDrive(pidltemp2) || pdata1->u.drive.szDriveName[0] != pdata2->u.drive.szDriveName[0]) + return FALSE; + } + else + { + return FALSE; + } pidltemp1 = ILGetNext(pidltemp1); pidltemp2 = ILGetNext(pidltemp2);