Ignore:
Timestamp:
Jun 20, 2011, 5:16:00 PM (14 years ago)
Author:
dmik
Message:

shell32: Fixed SHGetFileInfoW(): PIDL input argument was misinterpreted as a string and the display name and type name fields SHFILEINFOW were not properly set on output resulting in garbage on the caller's side.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/shell32_main.c

    r21494 r21637  
    192192        if (SUCCEEDED(hr) && (flags & SHGFI_TYPENAME))
    193193        {
    194             if (!(flags & SHGFI_USEFILEATTRIBUTES))
    195                 _ILGetFileType(pidlLast, psfi->szTypeName, 80);
    196             else
     194        if (!(flags & SHGFI_USEFILEATTRIBUTES))
     195                    _ILGetFileType(pidlLast, psfi->szTypeName, 80);
     196        else
     197        {
     198            char sTemp[64];
     199            strcpy(sTemp,PathFindExtensionA(path));
     200            if (!( HCR_MapTypeToValue(sTemp, sTemp, 64, TRUE)
     201                   && HCR_MapTypeToValue(sTemp, psfi->szTypeName, 80, FALSE )))
    197202            {
    198                 char sTemp[64];
    199                 strcpy(sTemp,PathFindExtensionA(path));
    200                 if (!( HCR_MapTypeToValue(sTemp, sTemp, 64, TRUE)
    201                        && HCR_MapTypeToValue(sTemp, psfi->szTypeName, 80, FALSE )))
    202                 {
    203                     lstrcpynA (psfi->szTypeName, sTemp, 80 - 6);
    204                     strcat (psfi->szTypeName, "-file");
    205                 }
     203                lstrcpynA (psfi->szTypeName, sTemp, 80 - 6);
     204                strcat (psfi->szTypeName, "-file");
    206205            }
     206        }
    207207        }
    208208
     
    320320        SHFILEINFOA temppsfi;
    321321
    322         len = WideCharToMultiByte(CP_ACP, 0, path, -1, NULL, 0, NULL, NULL);
    323         temppath = HeapAlloc(GetProcessHeap(), 0, len);
    324         WideCharToMultiByte(CP_ACP, 0, path, -1, temppath, len, NULL, NULL);
    325 
    326         WideCharToMultiByte(CP_ACP, 0, psfi->szDisplayName, -1, temppsfi.szDisplayName,
    327                             sizeof(temppsfi.szDisplayName), NULL, NULL);
    328         WideCharToMultiByte(CP_ACP, 0, psfi->szTypeName, -1, temppsfi.szTypeName,
    329                             sizeof(temppsfi.szTypeName), NULL, NULL);
     322    memset(&temppsfi, 0, sizeof(temppsfi));
     323
     324    if (flags & SHGFI_PIDL)
     325    {
     326        temppath = (LPSTR)path;
     327    }
     328    else
     329    {
     330        len = WideCharToMultiByte(CP_ACP, 0, path, -1, NULL, 0, NULL, NULL);
     331        temppath = HeapAlloc(GetProcessHeap(), 0, len);
     332        WideCharToMultiByte(CP_ACP, 0, path, -1, temppath, len, NULL, NULL);
     333    }
     334
     335    WideCharToMultiByte(CP_ACP, 0, psfi->szDisplayName, -1, temppsfi.szDisplayName,
     336                        sizeof(temppsfi.szDisplayName), NULL, NULL);
     337    WideCharToMultiByte(CP_ACP, 0, psfi->szTypeName, -1, temppsfi.szTypeName,
     338                        sizeof(temppsfi.szTypeName), NULL, NULL);
    330339
    331340        ret = SHGetFileInfoA(temppath, dwFileAttributes, &temppsfi, sizeof(temppsfi), flags);
     341
     342    MultiByteToWideChar(CP_ACP, 0, temppsfi.szTypeName, -1,
     343                        psfi->szTypeName,
     344                        sizeof(psfi->szTypeName) / sizeof(WCHAR));
     345    MultiByteToWideChar(CP_ACP, 0, temppsfi.szDisplayName, -1,
     346                        psfi->szDisplayName,
     347                        sizeof(psfi->szDisplayName) / sizeof(WCHAR));
    332348
    333349        HeapFree(GetProcessHeap(), 0, temppath);
Note: See TracChangeset for help on using the changeset viewer.