[RSHELL]
[reactos.git] / dll / win32 / shell32 / pidl.cpp
index 6da6d68..7f877b9 100644 (file)
@@ -22,7 +22,7 @@
  *
  */
 
-#include <precomp.h>
+#include "precomp.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(pidl);
 WINE_DECLARE_DEBUG_CHANNEL(shell);
@@ -118,7 +118,7 @@ BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR pa
         }
         else
         {
-            ret = SHBindToParent(pidl, IID_IShellFolder, (LPVOID*)&psfParent, &pidllast);
+            ret = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfParent), &pidllast);
             if (SUCCEEDED(ret))
             {
                 ret = psfParent->GetDisplayNameOf(pidllast, flag, &strret);
@@ -686,8 +686,7 @@ HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEM
     CComPtr<IDataObject>        pDataObj;
     HRESULT hr;
 
-    hr = lpsf->GetUIObjectOf(0, 1, &pidlSimple,
-                             IID_IDataObject, 0, (LPVOID*)&pDataObj);
+    hr = lpsf->GetUIObjectOf(0, 1, &pidlSimple, IID_NULL_PPV_ARG(IDataObject, &pDataObj));
     if (SUCCEEDED(hr))
     {
         STGMEDIUM medium;
@@ -754,11 +753,13 @@ EXTERN_C LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl)
  */
 UINT WINAPI ILGetSize(LPCITEMIDLIST pidl)
 {
-    LPCSHITEMID si = &(pidl->mkid);
+    LPCSHITEMID si;
     UINT len = 0;
 
     if (pidl)
     {
+        si = &(pidl->mkid);
+
         while (si->cb)
         {
             len += si->cb;
@@ -1102,7 +1103,7 @@ HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl,
                 lstrcpynA(pfd->cAlternateFileName, shortname, sizeof(pfd->cAlternateFileName));
             else
                 pfd->cAlternateFileName[0] = '\0';
-            return NOERROR;
+            return S_OK;
 
         case SHGDFIL_NETRESOURCE:
         case SHGDFIL_DESCRIPTIONID:
@@ -1144,7 +1145,7 @@ HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl,
             if (len < (int)sizeof(WIN32_FIND_DATAW))
                 return E_INVALIDARG;
 
-            ZeroMemory(pfd, sizeof (WIN32_FIND_DATAA));
+            ZeroMemory(pfd, sizeof (WIN32_FIND_DATAW));
             _ILGetFileDateTime( pidl, &(pfd->ftLastWriteTime));
             pfd->dwFileAttributes = _ILGetFileAttributes(pidl, NULL, 0);
             pfd->nFileSizeLow = _ILGetFileSize ( pidl, NULL, 0);
@@ -1161,7 +1162,7 @@ HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl,
                 pfd->cAlternateFileName[0] = '\0';
             else if (!MultiByteToWideChar(CP_ACP, 0, shortname, -1, pfd->cAlternateFileName, 14))
                 pfd->cAlternateFileName[13] = 0;
-            return NOERROR;
+            return S_OK;
 
         case SHGDFIL_NETRESOURCE:
         case SHGDFIL_DESCRIPTIONID:
@@ -1221,7 +1222,7 @@ BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
     if (!pidl)
         return FALSE;
 
-    hr = SHBindToParent(pidl, IID_IShellFolder, (VOID**)&psfFolder, &pidlLast);
+    hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfFolder), &pidlLast);
     if (FAILED(hr))
     {
         ERR("SHBindToParent failed: %x\n", hr);
@@ -1463,8 +1464,8 @@ LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID)
 
 LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd )
 {
-    char    buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
-    DWORD   len, len1, wlen, alen;
+    char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
+    DWORD len, len1, wlen, alen, cbData;
     LPITEMIDLIST pidl;
     PIDLTYPE type;
 
@@ -1481,8 +1482,10 @@ LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd )
     type = (wfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : PT_VALUE;
 
     wlen = wcslen(wfd->cFileName) + 1;
-    pidl = _ILAlloc(type, sizeof(FileStruct) + (alen + (alen & 1)) +
-                    sizeof(FileStructW) + wlen * sizeof(WCHAR) + sizeof(WORD));
+    cbData = sizeof(FileStruct) - 1 + (alen + (alen & 1)); // Note: szNames field is initially 1 byte long
+    cbData += sizeof(FileStructW) - 1 + wlen * sizeof(WCHAR); // Note: wszName field is initially 1 byte long
+    cbData += sizeof(WORD); // offset to FileStructW
+    pidl = _ILAlloc(type, cbData);
     if (pidl)
     {
         LPPIDLDATA pData = _ILGetDataPointer(pidl);
@@ -1496,7 +1499,7 @@ LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd )
         memcpy(fs->szNames, buff, alen);
 
         fsw = (FileStructW*)(pData->u.file.szNames + alen + (alen & 0x1));
-        fsw->cbLen = sizeof(FileStructW) + wlen * sizeof(WCHAR) + sizeof(WORD);
+        fsw->cbLen = sizeof(FileStructW) - 1 + wlen * sizeof(WCHAR) + sizeof(WORD);
         FileTimeToDosDateTime( &wfd->ftCreationTime, &fsw->uCreationDate, &fsw->uCreationTime);
         FileTimeToDosDateTime( &wfd->ftLastAccessTime, &fsw->uLastAccessDate, &fsw->uLastAccessTime);
         memcpy(fsw->wszName, wfd->cFileName, wlen * sizeof(WCHAR));
@@ -2115,7 +2118,7 @@ FileStructW* _ILGetFileStructW(LPCITEMIDLIST pidl) {
             cbOffset > pidl->mkid.cb - sizeof(cbOffset) - sizeof(FileStructW) ||
             pidl->mkid.cb != cbOffset + pFileStructW->cbLen)
     {
-        WARN("Invalid pidl format (cbOffset = %d)!\n", cbOffset);
+        ERR("Invalid pidl format (cbOffset = %d)!\n", cbOffset);
         return NULL;
     }