Aric Stewart : shell32: Do not automatically fail in SHGetFileInfo if the flag SHGFI_USEFILEATTRIBUTES is combined with SHGFI_ATTRIBUTES , SHGFI_EXETYPE, or SHGFI_PIDL.
Alexandre Julliard
julliard at winehq.org
Tue Nov 4 07:29:27 CST 2008
Module: wine
Branch: master
Commit: cf164785afac461a84e23d1e370205c28de73e0a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf164785afac461a84e23d1e370205c28de73e0a
Author: Aric Stewart <aric at codeweavers.com>
Date: Mon Nov 3 10:14:53 2008 -0600
shell32: Do not automatically fail in SHGetFileInfo if the flag SHGFI_USEFILEATTRIBUTES is combined with SHGFI_ATTRIBUTES, SHGFI_EXETYPE, or SHGFI_PIDL.
---
dlls/shell32/shell32_main.c | 7 +--
dlls/shell32/tests/shlfileop.c | 116 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 117 insertions(+), 6 deletions(-)
diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c
index a0d3fe7..78a2d57 100644
--- a/dlls/shell32/shell32_main.c
+++ b/dlls/shell32/shell32_main.c
@@ -350,10 +350,6 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes,
(flags & SHGFI_PIDL)? "pidl" : debugstr_w(path), dwFileAttributes,
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 */
if (psfi != NULL)
{
@@ -430,7 +426,8 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes,
{
psfi->dwAttributes = 0xffffffff;
}
- IShellFolder_GetAttributesOf( psfParent, 1, (LPCITEMIDLIST*)&pidlLast,
+ if (psfParent)
+ IShellFolder_GetAttributesOf( psfParent, 1, (LPCITEMIDLIST*)&pidlLast,
&(psfi->dwAttributes) );
}
diff --git a/dlls/shell32/tests/shlfileop.c b/dlls/shell32/tests/shlfileop.c
index 6293b93..2607c63 100644
--- a/dlls/shell32/tests/shlfileop.c
+++ b/dlls/shell32/tests/shlfileop.c
@@ -193,7 +193,7 @@ static void test_get_file_info(void)
rc=SHGetFileInfoA("c:\\nonexistent", FILE_ATTRIBUTE_DIRECTORY,
&shfi, sizeof(shfi),
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)
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");
@@ -295,6 +295,7 @@ static void test_get_file_info_iconlist(void)
{
win_skip("SHGetFileInfoW is not available\n");
ILFree(pidList);
+ return;
}
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");
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);
}
More information about the wine-cvs
mailing list