SHELL: fixed SHGetFileInfoW

Alberto Massari alby at exln.com
Sat Oct 26 09:29:07 CDT 2002


This patch fixes:

- typo in SHGetFileInfoA (szLoaction instead of szLocation)
- wrong code in SHGetFileInfoW: this function relies on SHGetFileInfoA, so 
it should convert the requested name from Unicode into a multi byte string, 
then copy/convert the data returned in the SHFILEINFOA structure into the 
caller-supplied SHFILEINFOW structure.
The old code was not returning anything to the caller and, depending on 
what was in the provided SHFILEINFOW structure (usually garbage 
characters), it could crash trying to convert two strings from Unicode to 
multi byte.

Alberto

Index: shell32_main.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32_main.c,v
retrieving revision 1.102
diff -u -r1.102 shell32_main.c
--- shell32_main.c      23 Oct 2002 20:20:59 -0000      1.102
+++ shell32_main.c      26 Oct 2002 14:24:25 -0000
@@ -209,7 +209,7 @@
                                SHFILEINFOA *psfi, UINT sizeofpsfi,
                                UINT flags )
  {
-       char szLoaction[MAX_PATH];
+       char szLocation[MAX_PATH];
         int iIndex;
         DWORD ret = TRUE, dwAttributes = 0;
         IShellFolder * psfParent = NULL;
@@ -367,11 +367,11 @@

           if (SUCCEEDED(hr))
           {
-           hr = IExtractIconA_GetIconLocation(pei, (flags & 
SHGFI_OPENICON)? GIL_OPENICON : 0,szLoaction, MAX_PATH, &iIndex, &uFlags);
+           hr = IExtractIconA_GetIconLocation(pei, (flags & 
SHGFI_OPENICON)? GIL_OPENICON : 0,szLocation, MAX_PATH, &iIndex, &uFlags);
             /* FIXME what to do with the index? */

             if(uFlags != GIL_NOTFILENAME)
-             strcpy (psfi->szDisplayName, szLoaction);
+             strcpy (psfi->szDisplayName, szLocation);
             else
               ret = FALSE;

@@ -466,12 +466,21 @@
         temppath = HeapAlloc(GetProcessHeap(), 0, len);
         WideCharToMultiByte(CP_ACP, 0, path, -1, temppath, len, NULL, NULL);

-        WideCharToMultiByte(CP_ACP, 0, psfi->szDisplayName, -1, 
temppsfi.szDisplayName,
-                            sizeof(temppsfi.szDisplayName), NULL, NULL);
-        WideCharToMultiByte(CP_ACP, 0, psfi->szTypeName, -1, 
temppsfi.szTypeName,
-                            sizeof(temppsfi.szTypeName), NULL, NULL);
+       if(flags & SHGFI_ATTR_SPECIFIED)
+               temppsfi.dwAttributes=psfi->dwAttributes;

         ret = SHGetFileInfoA(temppath, dwFileAttributes, &temppsfi, 
sizeof(temppsfi), flags);
+
+       if(flags & SHGFI_ICON)
+               psfi->hIcon=temppsfi.hIcon;
+       if(flags & (SHGFI_SYSICONINDEX|SHGFI_ICON|SHGFI_ICONLOCATION))
+               psfi->iIcon=temppsfi.iIcon;
+       if(flags & SHGFI_ATTRIBUTES)
+               psfi->dwAttributes=temppsfi.dwAttributes;
+       if(flags & (SHGFI_DISPLAYNAME|SHGFI_ICONLOCATION))
+               MultiByteToWideChar(CP_ACP, 0, temppsfi.szDisplayName, -1, 
psfi->szDisplayName, sizeof(psfi->szDisplayName));
+       if(flags & SHGFI_TYPENAME)
+               MultiByteToWideChar(CP_ACP, 0, temppsfi.szTypeName, -1, 
psfi->szTypeName, sizeof(psfi->szTypeName));

         HeapFree(GetProcessHeap(), 0, temppath);





More information about the wine-patches mailing list