shell32: Do not automatically fail in SHGetFileInfo if the flag SHGFI_USEFILEATTRIBUTES is combined with SHGFI_ATTRIBUTES, SHGFI_EXETYPE, or SHGFI_PIDL.
This commit is contained in:
parent
a971489dd0
commit
cf164785af
|
@ -350,10 +350,6 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes,
|
||||||
(flags & SHGFI_PIDL)? "pidl" : debugstr_w(path), dwFileAttributes,
|
(flags & SHGFI_PIDL)? "pidl" : debugstr_w(path), dwFileAttributes,
|
||||||
psfi, psfi->dwAttributes, sizeofpsfi, flags);
|
psfi, psfi->dwAttributes, sizeofpsfi, flags);
|
||||||
|
|
||||||
if ( (flags & SHGFI_USEFILEATTRIBUTES) &&
|
|
||||||
(flags & (SHGFI_ATTRIBUTES|SHGFI_EXETYPE|SHGFI_PIDL)))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* windows initializes these values regardless of the flags */
|
/* windows initializes these values regardless of the flags */
|
||||||
if (psfi != NULL)
|
if (psfi != NULL)
|
||||||
{
|
{
|
||||||
|
@ -430,7 +426,8 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes,
|
||||||
{
|
{
|
||||||
psfi->dwAttributes = 0xffffffff;
|
psfi->dwAttributes = 0xffffffff;
|
||||||
}
|
}
|
||||||
IShellFolder_GetAttributesOf( psfParent, 1, (LPCITEMIDLIST*)&pidlLast,
|
if (psfParent)
|
||||||
|
IShellFolder_GetAttributesOf( psfParent, 1, (LPCITEMIDLIST*)&pidlLast,
|
||||||
&(psfi->dwAttributes) );
|
&(psfi->dwAttributes) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,7 @@ static void test_get_file_info(void)
|
||||||
rc=SHGetFileInfoA("c:\\nonexistent", FILE_ATTRIBUTE_DIRECTORY,
|
rc=SHGetFileInfoA("c:\\nonexistent", FILE_ATTRIBUTE_DIRECTORY,
|
||||||
&shfi, sizeof(shfi),
|
&shfi, sizeof(shfi),
|
||||||
SHGFI_ATTRIBUTES | SHGFI_USEFILEATTRIBUTES);
|
SHGFI_ATTRIBUTES | SHGFI_USEFILEATTRIBUTES);
|
||||||
todo_wine ok(rc, "SHGetFileInfoA(c:\\nonexistent | SHGFI_ATTRIBUTES) failed\n");
|
ok(rc, "SHGetFileInfoA(c:\\nonexistent | SHGFI_ATTRIBUTES) failed\n");
|
||||||
if (rc)
|
if (rc)
|
||||||
ok(shfi.dwAttributes != 0xcfcfcfcf, "dwFileAttributes is not set\n");
|
ok(shfi.dwAttributes != 0xcfcfcfcf, "dwFileAttributes is not set\n");
|
||||||
todo_wine ok(shfi.hIcon == 0, "SHGetFileInfoA(c:\\nonexistent | SHGFI_ATTRIBUTES) did not clear hIcon\n");
|
todo_wine ok(shfi.hIcon == 0, "SHGetFileInfoA(c:\\nonexistent | SHGFI_ATTRIBUTES) did not clear hIcon\n");
|
||||||
|
@ -295,6 +295,7 @@ static void test_get_file_info_iconlist(void)
|
||||||
{
|
{
|
||||||
win_skip("SHGetFileInfoW is not available\n");
|
win_skip("SHGetFileInfoW is not available\n");
|
||||||
ILFree(pidList);
|
ILFree(pidList);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&shInfow, 0xcf, sizeof(shInfow));
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
@ -308,6 +309,119 @@ static void test_get_file_info_iconlist(void)
|
||||||
ok(shInfow.dwAttributes == 0xcfcfcfcf, "SHGetFileInfoW(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL) should not change dwAttributes\n");
|
ok(shInfow.dwAttributes == 0xcfcfcfcf, "SHGetFileInfoW(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL) should not change dwAttributes\n");
|
||||||
CloseHandle(hSysImageList);
|
CloseHandle(hSysImageList);
|
||||||
|
|
||||||
|
/* Various suposidly invalid flag testing */
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON);
|
||||||
|
ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON Failed\n");
|
||||||
|
ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing \n");
|
||||||
|
ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON);
|
||||||
|
ok(hr != 0, " SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON Failed\n");
|
||||||
|
ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing \n");
|
||||||
|
ok(shInfow.hIcon!=(HICON)0xcfcfcfcf && shInfow.hIcon!=0,"hIcon invalid\n");
|
||||||
|
if (shInfow.hIcon!=(HICON)0xcfcfcfcf) DestroyIcon(shInfow.hIcon);
|
||||||
|
todo_wine ok(shInfow.dwAttributes==0,"dwAttributes not set\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_LARGEICON);
|
||||||
|
ok(hr != 0, "SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_LARGEICON Failed\n");
|
||||||
|
ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing \n");
|
||||||
|
ok(shInfow.hIcon!=(HICON)0xcfcfcfcf && shInfow.hIcon!=0,"hIcon invalid\n");
|
||||||
|
if (shInfow.hIcon != (HICON)0xcfcfcfcf) DestroyIcon(shInfow.hIcon);
|
||||||
|
todo_wine ok(shInfow.dwAttributes==0,"dwAttributes not set\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_LARGEICON);
|
||||||
|
ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_LARGEICON Failed\n");
|
||||||
|
ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing \n");
|
||||||
|
ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_OPENICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON);
|
||||||
|
ok(hr != 0, "SHGFI_OPENICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON Failed\n");
|
||||||
|
todo_wine ok(shInfow.iIcon==0xcfcfcfcf, "Icon Index Modified\n");
|
||||||
|
ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_SHELLICONSIZE|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON);
|
||||||
|
ok(hr != 0, "SHGFI_SHELLICONSIZE|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON Failed\n");
|
||||||
|
todo_wine ok(shInfow.iIcon==0xcfcfcfcf, "Icon Index Modified\n");
|
||||||
|
ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_SHELLICONSIZE|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON);
|
||||||
|
ok(hr != 0, "SHGFI_SHELLICONSIZE|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON Failed\n");
|
||||||
|
todo_wine ok(shInfow.iIcon==0xcfcfcfcf, "Icon Index Modified\n");
|
||||||
|
ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|
|
||||||
|
SHGFI_ATTRIBUTES);
|
||||||
|
ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|SHGFI_ATTRIBUTES Failed\n");
|
||||||
|
ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing \n");
|
||||||
|
ok(shInfow.dwAttributes!=0xcfcfcfcf,"dwAttributes not set\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|
|
||||||
|
SHGFI_EXETYPE);
|
||||||
|
todo_wine ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|SHGFI_EXETYPE Failed\n");
|
||||||
|
ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing \n");
|
||||||
|
ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|SHGFI_EXETYPE);
|
||||||
|
todo_wine ok(hr != 0, "SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|SHGFI_EXETYPE Failed\n");
|
||||||
|
todo_wine ok(shInfow.iIcon==0xcfcfcfcf, "Icon Index Modified\n");
|
||||||
|
ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|SHGFI_ATTRIBUTES);
|
||||||
|
ok(hr != 0, "SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|SHGFI_ATTRIBUTES Failed\n");
|
||||||
|
todo_wine ok(shInfow.iIcon==0xcfcfcfcf, "Icon Index Modified\n");
|
||||||
|
ok(shInfow.dwAttributes!=0xcfcfcfcf,"dwAttributes not set\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|
|
||||||
|
SHGFI_ATTRIBUTES);
|
||||||
|
ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_ATTRIBUTES Failed\n");
|
||||||
|
ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing \n");
|
||||||
|
ok(shInfow.dwAttributes!=0xcfcfcfcf,"dwAttributes not set\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_EXETYPE);
|
||||||
|
todo_wine ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_EXETYPE Failed\n");
|
||||||
|
ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing \n");
|
||||||
|
ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_EXETYPE);
|
||||||
|
todo_wine ok(hr != 0, "SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_EXETYPE Failed\n");
|
||||||
|
todo_wine ok(shInfow.iIcon==0xcfcfcfcf, "Icon Index Modified\n");
|
||||||
|
ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
|
||||||
|
|
||||||
|
memset(&shInfow, 0xcf, sizeof(shInfow));
|
||||||
|
hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow),
|
||||||
|
SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_ATTRIBUTES);
|
||||||
|
ok(hr != 0, "SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_ATTRIBUTES Failed\n");
|
||||||
|
todo_wine ok(shInfow.iIcon==0xcfcfcfcf, "Icon Index Modified\n");
|
||||||
|
ok(shInfow.dwAttributes!=0xcfcfcfcf,"dwAttributes not set\n");
|
||||||
|
|
||||||
ILFree(pidList);
|
ILFree(pidList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue