Author: akhaldi
Date: Mon Nov  3 19:50:36 2014
New Revision: 65233

URL: http://svn.reactos.org/svn/reactos?rev=65233&view=rev
Log:
[SHELL32]
* Move pidl.cpp and pidl.h to the wine folder.
* Convert pidl.cpp into pidl.c.
CORE-8540

Added:
    branches/shell-experiments/dll/win32/shell32/wine/pidl.c
      - copied, changed from r65228, 
branches/shell-experiments/dll/win32/shell32/pidl.cpp
    branches/shell-experiments/dll/win32/shell32/wine/pidl.h
      - copied unchanged from r65228, 
branches/shell-experiments/dll/win32/shell32/pidl.h
Removed:
    branches/shell-experiments/dll/win32/shell32/pidl.cpp
    branches/shell-experiments/dll/win32/shell32/pidl.h
Modified:
    branches/shell-experiments/dll/win32/shell32/CMakeLists.txt
    branches/shell-experiments/dll/win32/shell32/precomp.h

Modified: branches/shell-experiments/dll/win32/shell32/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/CMakeLists.txt?rev=65233&r1=65232&r2=65233&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/CMakeLists.txt [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/CMakeLists.txt [iso-8859-1] 
Mon Nov  3 19:50:36 2014
@@ -39,7 +39,6 @@
     extracticon.cpp
     folders.cpp
     iconcache.cpp
-    pidl.cpp
     shell32.cpp
     shellitem.cpp
     shelllink.cpp
@@ -71,6 +70,7 @@
 add_library(shell32 SHARED
     ${SOURCE}
     wine/control.c
+    wine/pidl.c
     wine/shell32_main.c
     wine/shellole.c
     wine/shellord.c

Removed: branches/shell-experiments/dll/win32/shell32/pidl.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/pidl.cpp?rev=65232
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/pidl.cpp       [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/pidl.cpp       (removed)
@@ -1,2421 +0,0 @@
-/*
- *    pidl Handling
- *
- *    Copyright 1998    Juergen Schmied
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- *
- * NOTES
- *  a pidl == NULL means desktop and is legal
- *
- */
-
-#include "precomp.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(pidl);
-WINE_DECLARE_DEBUG_CHANNEL(shell);
-
-/* from comctl32.dll */
-EXTERN_C LPVOID WINAPI Alloc(INT);
-EXTERN_C BOOL WINAPI Free(LPVOID);
-
-static LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl);
-static LPWSTR _ILGetTextPointerW(LPCITEMIDLIST pidl);
-
-/*************************************************************************
- * ILGetDisplayNameExA        [SHELL32.186]
- *
- * Retrieves the display name of an ItemIDList
- *
- * PARAMS
- *  psf        [I]   Shell Folder to start with, if NULL the desktop is used
- *  pidl       [I]   ItemIDList relative to the psf to get the display name for
- *  path       [O]   Filled in with the display name, assumed to be at least 
MAX_PATH long
- *  type       [I]   Type of display name to retrieve
- *                    0 = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR uses always 
the desktop as root
- *                    1 = SHGDN_NORMAL relative to the root folder
- *                    2 = SHGDN_INFOLDER relative to the root folder, only the 
last name
- *
- * RETURNS
- *  True if the display name could be retrieved successfully, False otherwise
- */
-static BOOL ILGetDisplayNameExA(IShellFolder * psf, LPCITEMIDLIST pidl, LPSTR 
path, DWORD type)
-{
-    BOOL ret = FALSE;
-    WCHAR wPath[MAX_PATH];
-
-    TRACE("%p %p %p %d\n", psf, pidl, path, type);
-
-    if (!pidl || !path)
-        return FALSE;
-
-    ret = ILGetDisplayNameExW(psf, pidl, wPath, type);
-    WideCharToMultiByte(CP_ACP, 0, wPath, -1, path, MAX_PATH, NULL, NULL);
-    TRACE("%p %p %s\n", psf, pidl, debugstr_a(path));
-
-    return ret;
-}
-
-BOOL WINAPI ILGetDisplayNameExW(IShellFolder * psf, LPCITEMIDLIST pidl, LPWSTR 
path, DWORD type)
-{
-    CComPtr<IShellFolder>        psfParent;
-    CComPtr<IShellFolder> lsf = psf;
-    HRESULT ret = NO_ERROR;
-    LPCITEMIDLIST pidllast;
-    STRRET strret;
-    DWORD flag;
-
-    TRACE("%p %p %p %d\n", psf, pidl, path, type);
-
-    if (!pidl || !path)
-        return FALSE;
-
-    if (!lsf)
-    {
-        ret = SHGetDesktopFolder(&lsf);
-        if (FAILED(ret))
-            return FALSE;
-    }
-
-    if (type <= 2)
-    {
-        switch (type)
-        {
-            case ILGDN_FORPARSING:
-                flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR;
-                break;
-            case ILGDN_NORMAL:
-                flag = SHGDN_NORMAL;
-                break;
-            case ILGDN_INFOLDER:
-                flag = SHGDN_INFOLDER;
-                break;
-            default:
-                FIXME("Unknown type parameter = %x\n", type);
-                flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR;
-                break;
-        }
-        if (!*(const WORD*)pidl || type == ILGDN_FORPARSING)
-        {
-            ret = lsf->GetDisplayNameOf(pidl, flag, &strret);
-            if (SUCCEEDED(ret))
-            {
-                if(!StrRetToStrNW(path, MAX_PATH, &strret, pidl))
-                    ret = E_FAIL;
-            }
-        }
-        else
-        {
-            ret = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfParent), 
&pidllast);
-            if (SUCCEEDED(ret))
-            {
-                ret = psfParent->GetDisplayNameOf(pidllast, flag, &strret);
-                if (SUCCEEDED(ret))
-                {
-                    if(!StrRetToStrNW(path, MAX_PATH, &strret, pidllast))
-                        ret = E_FAIL;
-                }
-            }
-        }
-    }
-
-    TRACE("%p %p %s\n", psf, pidl, debugstr_w(path));
-
-    return SUCCEEDED(ret);
-}
-
-/*************************************************************************
- * ILGetDisplayNameEx        [SHELL32.186]
- */
-BOOL WINAPI ILGetDisplayNameEx(IShellFolder * psf, LPCITEMIDLIST pidl, LPVOID 
path, DWORD type)
-{
-    TRACE_(shell)("%p %p %p %d\n", psf, pidl, path, type);
-
-    if (SHELL_OsIsUnicode())
-        return ILGetDisplayNameExW(psf, pidl, (LPWSTR)path, type);
-    return ILGetDisplayNameExA(psf, pidl, (LPSTR)path, type);
-}
-
-/*************************************************************************
- * ILGetDisplayName            [SHELL32.15]
- */
-BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl, LPVOID path)
-{
-    TRACE_(shell)("%p %p\n", pidl, path);
-
-    if (SHELL_OsIsUnicode())
-        return ILGetDisplayNameExW(NULL, pidl, (LPWSTR)path, ILGDN_FORPARSING);
-    return ILGetDisplayNameExA(NULL, pidl, (LPSTR)path, ILGDN_FORPARSING);
-}
-
-/*************************************************************************
- * ILFindLastID [SHELL32.16]
- *
- * NOTES
- *   observed: pidl=Desktop return=pidl
- */
-LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
-{
-    LPCITEMIDLIST   pidlLast = pidl;
-
-    TRACE("(pidl=%p)\n", pidl);
-
-    if (!pidl)
-        return NULL;
-
-    while (pidl->mkid.cb)
-    {
-        pidlLast = pidl;
-        pidl = ILGetNext(pidl);
-    }
-    return (LPITEMIDLIST)pidlLast;
-}
-
-/*************************************************************************
- * ILRemoveLastID [SHELL32.17]
- *
- * NOTES
- *   when pidl=Desktop return=FALSE
- */
-BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
-{
-    TRACE_(shell)("pidl=%p\n", pidl);
-
-    if (!pidl || !pidl->mkid.cb)
-        return 0;
-    ILFindLastID(pidl)->mkid.cb = 0;
-    return 1;
-}
-
-/*************************************************************************
- * ILClone [SHELL32.18]
- *
- * NOTES
- *    duplicate an idlist
- */
-LPITEMIDLIST WINAPI ILClone (LPCITEMIDLIST pidl)
-{
-    DWORD    len;
-    LPITEMIDLIST  newpidl;
-
-    if (!pidl)
-        return NULL;
-
-    len = ILGetSize(pidl);
-    newpidl = (LPITEMIDLIST)SHAlloc(len);
-    if (newpidl)
-        memcpy(newpidl, pidl, len);
-
-    TRACE("pidl=%p newpidl=%p\n", pidl, newpidl);
-    pdump(pidl);
-
-    return newpidl;
-}
-
-/*************************************************************************
- * ILCloneFirst [SHELL32.19]
- *
- * NOTES
- *  duplicates the first idlist of a complex pidl
- */
-LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl)
-{
-    DWORD len;
-    LPITEMIDLIST pidlNew = NULL;
-
-    TRACE("pidl=%p\n", pidl);
-    pdump(pidl);
-
-    if (pidl)
-    {
-        len = pidl->mkid.cb;
-        pidlNew = (LPITEMIDLIST)SHAlloc(len + 2);
-        if (pidlNew)
-        {
-            memcpy(pidlNew, pidl, len + 2);    /* 2 -> mind a desktop pidl */
-
-            if (len)
-                ILGetNext(pidlNew)->mkid.cb = 0x00;
-        }
-    }
-    TRACE("-- newpidl=%p\n", pidlNew);
-
-    return pidlNew;
-}
-
-/*************************************************************************
- * ILLoadFromStream (SHELL32.26)
- *
- * NOTES
- *   the first two bytes are the len, the pidl is following then
- */
-HRESULT WINAPI ILLoadFromStream (IStream * pStream, LPITEMIDLIST * ppPidl)
-{
-    WORD        wLen = 0;
-    DWORD       dwBytesRead;
-    HRESULT     ret = E_FAIL;
-
-
-    TRACE_(shell)("%p %p\n", pStream ,  ppPidl);
-
-    SHFree(*ppPidl);
-    *ppPidl = NULL;
-
-    pStream->AddRef ();
-
-    if (SUCCEEDED(pStream->Read(&wLen, 2, &dwBytesRead)))
-    {
-        TRACE("PIDL length is %d\n", wLen);
-        if (wLen != 0)
-        {
-            *ppPidl = (LPITEMIDLIST)SHAlloc(wLen);
-            if (SUCCEEDED(pStream->Read(*ppPidl , wLen, &dwBytesRead)))
-            {
-                TRACE("Stream read OK\n");
-                ret = S_OK;
-            }
-            else
-            {
-                WARN("reading pidl failed\n");
-                SHFree(*ppPidl);
-                *ppPidl = NULL;
-            }
-        }
-        else
-        {
-            *ppPidl = NULL;
-            ret = S_OK;
-        }
-    }
-
-    /* we are not yet fully compatible */
-    if (*ppPidl && !pcheck(*ppPidl))
-    {
-        WARN("Check failed\n");
-        SHFree(*ppPidl);
-        *ppPidl = NULL;
-    }
-
-    pStream->Release ();
-    TRACE("done\n");
-    return ret;
-}
-
-/*************************************************************************
- * ILSaveToStream (SHELL32.27)
- *
- * NOTES
- *   the first two bytes are the len, the pidl is following then
- */
-HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl)
-{
-    WORD        wLen = 0;
-    HRESULT        ret = E_FAIL;
-
-    TRACE_(shell)("%p %p\n", pStream, pPidl);
-
-    pStream->AddRef ();
-
-    wLen = ILGetSize(pPidl);
-
-    if (SUCCEEDED(pStream->Write(&wLen, 2, NULL)))
-    {
-        if (SUCCEEDED(pStream->Write(pPidl, wLen, NULL)))
-            ret = S_OK;
-    }
-    pStream->Release ();
-
-    return ret;
-}
-
-/*************************************************************************
- * SHILCreateFromPath        [SHELL32.28]
- *
- * Create an ItemIDList from a path
- *
- * PARAMS
- *  path       [I]
- *  ppidl      [O]
- *  attributes [I/O] requested attributes on call and actual attributes when
- *                   the function returns
- *
- * RETURNS
- *  NO_ERROR if successful, or an OLE errer code otherwise
- *
- * NOTES
- *  Wrapper for IShellFolder_ParseDisplayName().
- */
-HRESULT WINAPI SHILCreateFromPathA(LPCSTR path, LPITEMIDLIST * ppidl, DWORD * 
attributes)
-{
-    WCHAR lpszDisplayName[MAX_PATH];
-
-    TRACE_(shell)("%s %p 0x%08x\n", path, ppidl, attributes ? *attributes : 0);
-
-    if (!MultiByteToWideChar(CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH))
-        lpszDisplayName[MAX_PATH-1] = 0;
-
-    return SHILCreateFromPathW(lpszDisplayName, ppidl, attributes);
-}
-
-HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * 
attributes)
-{
-    CComPtr<IShellFolder>        sf;
-    DWORD pchEaten;
-    HRESULT ret = E_FAIL;
-
-    TRACE_(shell)("%s %p 0x%08x\n", debugstr_w(path), ppidl, attributes ? 
*attributes : 0);
-
-    if (SUCCEEDED (SHGetDesktopFolder(&sf)))
-        ret = sf->ParseDisplayName(0, NULL, (LPWSTR)path, &pchEaten, ppidl, 
attributes);
-    return ret;
-}
-
-EXTERN_C HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * 
ppidl, DWORD * attributes)
-{
-    if ( SHELL_OsIsUnicode())
-        return SHILCreateFromPathW ((LPCWSTR)path, ppidl, attributes);
-    return SHILCreateFromPathA ((LPCSTR)path, ppidl, attributes);
-}
-
-/*************************************************************************
- * SHCloneSpecialIDList      [SHELL32.89]
- *
- * Create an ItemIDList to one of the special folders.
-
- * PARAMS
- *  hwndOwner    [in]
- *  nFolder      [in]    CSIDL_xxxxx
- *  fCreate      [in]    Create folder if it does not exist
- *
- * RETURNS
- *  Success: The newly created pidl
- *  Failure: NULL, if inputs are invalid.
- *
- * NOTES
- *  exported by ordinal.
- *  Caller is responsible for deallocating the returned ItemIDList with the
- *  shells IMalloc interface, aka ILFree.
- */
-LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, int nFolder, BOOL 
fCreate)
-{
-    LPITEMIDLIST ppidl;
-    TRACE_(shell)("(hwnd=%p,csidl=0x%x,%s).\n", hwndOwner, nFolder, fCreate ? 
"T" : "F");
-
-    if (fCreate)
-        nFolder |= CSIDL_FLAG_CREATE;
-
-    SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl);
-    return ppidl;
-}
-
-/*************************************************************************
- * ILGlobalClone             [SHELL32.20]
- *
- * Clones an ItemIDList using Alloc.
- *
- * PARAMS
- *  pidl       [I]   ItemIDList to clone
- *
- * RETURNS
- *  Newly allocated ItemIDList.
- *
- * NOTES
- *  exported by ordinal.
- */
-LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl)
-{
-    DWORD    len;
-    LPITEMIDLIST  newpidl;
-
-    if (!pidl)
-        return NULL;
-
-    len = ILGetSize(pidl);
-    newpidl = (LPITEMIDLIST)Alloc(len);
-    if (newpidl)
-        memcpy(newpidl, pidl, len);
-
-    TRACE("pidl=%p newpidl=%p\n", pidl, newpidl);
-    pdump(pidl);
-
-    return newpidl;
-}
-
-/*************************************************************************
- * ILIsEqual [SHELL32.21]
- *
- */
-BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
-{
-    char    szData1[MAX_PATH];
-    char    szData2[MAX_PATH];
-
-    LPCITEMIDLIST pidltemp1 = pidl1;
-    LPCITEMIDLIST pidltemp2 = pidl2;
-
-    TRACE("pidl1=%p pidl2=%p\n", pidl1, pidl2);
-
-    /*
-     * Explorer reads from registry directly (StreamMRU),
-     * so we can only check here
-     */
-    if (!pcheck(pidl1) || !pcheck (pidl2))
-        return FALSE;
-
-    pdump (pidl1);
-    pdump (pidl2);
-
-    if (!pidl1 || !pidl2)
-        return FALSE;
-
-    while (pidltemp1->mkid.cb && pidltemp2->mkid.cb)
-    {
-        _ILSimpleGetText(pidltemp1, szData1, MAX_PATH);
-        _ILSimpleGetText(pidltemp2, szData2, MAX_PATH);
-
-        if (strcmp( szData1, szData2 ))
-            return FALSE;
-
-        pidltemp1 = ILGetNext(pidltemp1);
-        pidltemp2 = ILGetNext(pidltemp2);
-    }
-
-    if (!pidltemp1->mkid.cb && !pidltemp2->mkid.cb)
-        return TRUE;
-
-    return FALSE;
-}
-
-/*************************************************************************
- * ILIsParent                [SHELL32.23]
- *
- * Verifies that pidlParent is indeed the (immediate) parent of pidlChild.
- *
- * PARAMS
- *  pidlParent [I]
- *  pidlChild  [I]
- *  bImmediate [I]   only return true if the parent is the direct parent
- *                   of the child
- *
- * RETURNS
- *  True if the parent ItemIDlist is a complete part of the child ItemIdList,
- *  False otherwise.
- *
- * NOTES
- *  parent = a/b, child = a/b/c -> true, c is in folder a/b
- *  child = a/b/c/d -> false if bImmediate is true, d is not in folder a/b
- *  child = a/b/c/d -> true if bImmediate is false, d is in a subfolder of a/b
- */
-BOOL WINAPI ILIsParent(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL 
bImmediate)
-{
-    char    szData1[MAX_PATH];
-    char    szData2[MAX_PATH];
-    LPCITEMIDLIST pParent = pidlParent;
-    LPCITEMIDLIST pChild = pidlChild;
-
-    TRACE("%p %p %x\n", pidlParent, pidlChild, bImmediate);
-
-    if (!pParent || !pChild)
-        return FALSE;
-
-    while (pParent->mkid.cb && pChild->mkid.cb)
-    {
-        _ILSimpleGetText(pParent, szData1, MAX_PATH);
-        _ILSimpleGetText(pChild, szData2, MAX_PATH);
-
-        if (strcmp( szData1, szData2 ))
-            return FALSE;
-
-        pParent = ILGetNext(pParent);
-        pChild = ILGetNext(pChild);
-    }
-
-    /* child shorter or has equal length to parent */
-    if (pParent->mkid.cb || !pChild->mkid.cb)
-        return FALSE;
-
-    /* not immediate descent */
-    if ( ILGetNext(pChild)->mkid.cb && bImmediate)
-        return FALSE;
-
-    return TRUE;
-}
-
-/*************************************************************************
- * ILFindChild               [SHELL32.24]
- *
- *  Compares elements from pidl1 and pidl2.
- *
- * PARAMS
- *  pidl1      [I]
- *  pidl2      [I]
- *
- * RETURNS
- *  pidl1 is desktop      pidl2
- *  pidl1 shorter pidl2   pointer to first different element of pidl2
- *                        if there was at least one equal element
- *  pidl2 shorter pidl1   0
- *  pidl2 equal pidl1     pointer to last 0x00-element of pidl2
- *
- * NOTES
- *  exported by ordinal.
- */
-LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
-{
-    char    szData1[MAX_PATH];
-    char    szData2[MAX_PATH];
-
-    LPCITEMIDLIST pidltemp1 = pidl1;
-    LPCITEMIDLIST pidltemp2 = pidl2;
-    LPCITEMIDLIST ret = NULL;
-
-    TRACE("pidl1=%p pidl2=%p\n", pidl1, pidl2);
-
-    /* explorer reads from registry directly (StreamMRU),
-       so we can only check here */
-    if ((!pcheck (pidl1)) || (!pcheck (pidl2)))
-        return FALSE;
-
-    pdump (pidl1);
-    pdump (pidl2);
-
-    if (_ILIsDesktop(pidl1))
-    {
-        ret = pidl2;
-    }
-    else
-    {
-        while (pidltemp1->mkid.cb && pidltemp2->mkid.cb)
-        {
-            _ILSimpleGetText(pidltemp1, szData1, MAX_PATH);
-            _ILSimpleGetText(pidltemp2, szData2, MAX_PATH);
-
-            if (strcmp(szData1, szData2))
-                break;
-
-            pidltemp1 = ILGetNext(pidltemp1);
-            pidltemp2 = ILGetNext(pidltemp2);
-            ret = pidltemp2;
-        }
-
-        if (pidltemp1->mkid.cb)
-            ret = NULL; /* elements of pidl1 left*/
-    }
-    TRACE_(shell)("--- %p\n", ret);
-    return (LPITEMIDLIST)ret; /* pidl 1 is shorter */
-}
-
-/*************************************************************************
- * ILCombine                 [SHELL32.25]
- *
- * Concatenates two complex ItemIDLists.
- *
- * PARAMS
- *  pidl1      [I]   first complex ItemIDLists
- *  pidl2      [I]   complex ItemIDLists to append
- *
- * RETURNS
- *  if both pidl's == NULL      NULL
- *  if pidl1 == NULL            cloned pidl2
- *  if pidl2 == NULL            cloned pidl1
- *  otherwise new pidl with pidl2 appended to pidl1
- *
- * NOTES
- *  exported by ordinal.
- *  Does not destroy the passed in ItemIDLists!
- */
-LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
-{
-    DWORD    len1, len2;
-    LPITEMIDLIST  pidlNew;
-
-    TRACE("pidl=%p pidl=%p\n", pidl1, pidl2);
-
-    if (!pidl1 && !pidl2) return NULL;
-
-    pdump (pidl1);
-    pdump (pidl2);
-
-    if (!pidl1)
-    {
-        pidlNew = ILClone(pidl2);
-        return pidlNew;
-    }
-
-    if (!pidl2)
-    {
-        pidlNew = ILClone(pidl1);
-        return pidlNew;
-    }
-
-    len1  = ILGetSize(pidl1) - 2;
-    len2  = ILGetSize(pidl2);
-    pidlNew  = (LPITEMIDLIST)SHAlloc(len1 + len2);
-
-    if (pidlNew)
-    {
-        memcpy(pidlNew, pidl1, len1);
-        memcpy(((BYTE *)pidlNew) + len1, pidl2, len2);
-    }
-
-    /*  TRACE(pidl,"--new pidl=%p\n",pidlNew);*/
-    return pidlNew;
-}
-
-/*************************************************************************
- *  SHGetRealIDL [SHELL32.98]
- *
- * NOTES
- */
-HRESULT WINAPI SHGetRealIDL(IShellFolder * lpsf, LPCITEMIDLIST pidlSimple, 
LPITEMIDLIST *pidlReal)
-{
-    CComPtr<IDataObject>        pDataObj;
-    HRESULT hr;
-
-    hr = lpsf->GetUIObjectOf(0, 1, &pidlSimple, IID_NULL_PPV_ARG(IDataObject, 
&pDataObj));
-    if (SUCCEEDED(hr))
-    {
-        STGMEDIUM medium;
-        FORMATETC fmt;
-
-        fmt.cfFormat = RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
-        fmt.ptd = NULL;
-        fmt.dwAspect = DVASPECT_CONTENT;
-        fmt.lindex = -1;
-        fmt.tymed = TYMED_HGLOBAL;
-
-        hr = pDataObj->GetData(&fmt, &medium);
-
-        if (SUCCEEDED(hr))
-        {
-            /*assert(pida->cidl==1);*/
-            LPIDA pida = (LPIDA)GlobalLock(medium.hGlobal);
-
-            LPCITEMIDLIST pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida + 
pida->aoffset[0]);
-            LPCITEMIDLIST pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida + 
pida->aoffset[1]);
-
-            *pidlReal = ILCombine(pidl_folder, pidl_child);
-
-            if (!*pidlReal)
-                hr = E_OUTOFMEMORY;
-
-            GlobalUnlock(medium.hGlobal);
-            GlobalFree(medium.hGlobal);
-        }
-    }
-
-    return hr;
-}
-
-/*************************************************************************
- *  SHLogILFromFSIL [SHELL32.95]
- *
- * NOTES
- *  pild = CSIDL_DESKTOP    ret = 0
- *  pild = CSIDL_DRIVES     ret = 0
- */
-EXTERN_C LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl)
-{
-    FIXME("(pidl=%p)\n", pidl);
-
-    pdump(pidl);
-
-    return 0;
-}
-
-/*************************************************************************
- * ILGetSize                 [SHELL32.152]
- *
- * Gets the byte size of an ItemIDList including zero terminator
- *
- * PARAMS
- *  pidl       [I]   ItemIDList
- *
- * RETURNS
- *  size of pidl in bytes
- *
- * NOTES
- *  exported by ordinal
- */
-UINT WINAPI ILGetSize(LPCITEMIDLIST pidl)
-{
-    LPCSHITEMID si;
-    UINT len = 0;
-
-    if (pidl)
-    {
-        si = &(pidl->mkid);
-
-        while (si->cb)
-        {
-            len += si->cb;
-            si  = (LPCSHITEMID)(((const BYTE*)si) + si->cb);
-        }
-        len += 2;
-    }
-    TRACE("pidl=%p size=%u\n", pidl, len);
-    return len;
-}
-
-/*************************************************************************
- * ILGetNext                 [SHELL32.153]
- *
- * Gets the next ItemID of an ItemIDList
- *
- * PARAMS
- *  pidl       [I]   ItemIDList
- *
- * RETURNS
- *  null -> null
- *  desktop -> null
- *  simple pidl -> pointer to 0x0000 element
- *
- * NOTES
- *  exported by ordinal.
- */
-LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
-{
-    WORD len;
-
-    TRACE("%p\n", pidl);
-
-    if (pidl)
-    {
-        len =  pidl->mkid.cb;
-        if (len)
-        {
-            pidl = (LPCITEMIDLIST) (((const BYTE*)pidl) + len);
-            TRACE("-- %p\n", pidl);
-            return (LPITEMIDLIST)pidl;
-        }
-    }
-    return NULL;
-}
-
-/*************************************************************************
- * ILAppend                  [SHELL32.154]
- *
- * Adds the single ItemID item to the ItemIDList indicated by pidl.
- * If bEnd is FALSE, inserts the item in the front of the list,
- * otherwise it adds the item to the end. (???)
- *
- * PARAMS
- *  pidl       [I]   ItemIDList to extend
- *  item       [I]   ItemID to prepend/append
- *  bEnd       [I]   Indicates if the item should be appended
- *
- * NOTES
- *  Destroys the passed in idlist! (???)
- */
-EXTERN_C LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl, LPCITEMIDLIST item, 
BOOL bEnd)
-{
-    LPITEMIDLIST idlRet;
-
-    WARN("(pidl=%p,pidl=%p,%08u)semi-stub\n", pidl, item, bEnd);
-
-    pdump (pidl);
-    pdump (item);
-
-    if (_ILIsDesktop(pidl))
-    {
-        idlRet = ILClone(item);
-        SHFree (pidl);
-        return idlRet;
-    }
-
-    if (bEnd)
-        idlRet = ILCombine(pidl, item);
-    else
-        idlRet = ILCombine(item, pidl);
-
-    SHFree(pidl);
-    return idlRet;
-}
-
-/*************************************************************************
- * ILFree                    [SHELL32.155]
- *
- * Frees memory (if not NULL) allocated by SHMalloc allocator
- *
- * PARAMS
- *  pidl         [I]
- *
- * RETURNS
- *  Nothing
- *
- * NOTES
- *  exported by ordinal
- */
-void WINAPI ILFree(LPITEMIDLIST pidl)
-{
-    TRACE("(pidl=%p)\n", pidl);
-    SHFree(pidl);
-}
-
-/*************************************************************************
- * ILGlobalFree              [SHELL32.156]
- *
- * Frees memory (if not NULL) allocated by Alloc allocator
- *
- * PARAMS
- *  pidl         [I]
- *
- * RETURNS
- *  Nothing
- *
- * NOTES
- *  exported by ordinal.
- */
-void WINAPI ILGlobalFree( LPITEMIDLIST pidl)
-{
-    TRACE("%p\n", pidl);
-
-    Free(pidl);
-}
-
-/*************************************************************************
- * ILCreateFromPathA         [SHELL32.189]
- *
- * Creates a complex ItemIDList from a path and returns it.
- *
- * PARAMS
- *  path         [I]
- *
- * RETURNS
- *  the newly created complex ItemIDList or NULL if failed
- *
- * NOTES
- *  exported by ordinal.
- */
-LPITEMIDLIST WINAPI ILCreateFromPathA (LPCSTR path)
-{
-    LPITEMIDLIST pidlnew = NULL;
-
-    TRACE_(shell)("%s\n", debugstr_a(path));
-
-    if (SUCCEEDED(SHILCreateFromPathA(path, &pidlnew, NULL)))
-        return pidlnew;
-    return NULL;
-}
-
-/*************************************************************************
- * ILCreateFromPathW         [SHELL32.190]
- *
- * See ILCreateFromPathA.
- */
-LPITEMIDLIST WINAPI ILCreateFromPathW (LPCWSTR path)
-{
-    LPITEMIDLIST pidlnew = NULL;
-
-    TRACE_(shell)("%s\n", debugstr_w(path));
-
-    if (SUCCEEDED(SHILCreateFromPathW(path, &pidlnew, NULL)))
-        return pidlnew;
-    return NULL;
-}
-
-/*************************************************************************
- * ILCreateFromPath          [SHELL32.157]
- */
-EXTERN_C LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path)
-{
-    if ( SHELL_OsIsUnicode())
-        return ILCreateFromPathW ((LPCWSTR)path);
-    return ILCreateFromPathA ((LPCSTR)path);
-}
-
-/*************************************************************************
- * _ILParsePathW             [internal]
- *
- * Creates an ItemIDList from a path and returns it.
- *
- * PARAMS
- *  path         [I]   path to parse and convert into an ItemIDList
- *  lpFindFile   [I]   pointer to buffer to initialize the FileSystem
- *                     Bind Data object with
- *  bBindCtx     [I]   indicates to create a BindContext and assign a
- *                     FileSystem Bind Data object
- *  ppidl        [O]   the newly create ItemIDList
- *  prgfInOut    [I/O] requested attributes on input and actual
- *                     attributes on return
- *
- * RETURNS
- *  NO_ERROR on success or an OLE error code
- *
- * NOTES
- *  If either lpFindFile is non-NULL or bBindCtx is TRUE, this function
- *  creates a BindContext object and assigns a FileSystem Bind Data object
- *  to it, passing the BindContext to IShellFolder_ParseDisplayName. Each
- *  IShellFolder uses that FileSystem Bind Data object of the BindContext
- *  to pass data about the current path element to the next object. This
- *  is used to avoid having to verify the current path element on disk, so
- *  that creating an ItemIDList from a nonexistent path still can work.
- */
-static HRESULT _ILParsePathW(LPCWSTR path, LPWIN32_FIND_DATAW lpFindFile,
-                             BOOL bBindCtx, LPITEMIDLIST *ppidl, LPDWORD 
prgfInOut)
-{
-    CComPtr<IShellFolder>    pSF;
-    CComPtr<IBindCtx>        pBC;
-    HRESULT ret;
-
-    TRACE("%s %p %d (%p)->%p (%p)->0x%x\n", debugstr_w(path), lpFindFile, 
bBindCtx,
-          ppidl, ppidl ? *ppidl : NULL,
-          prgfInOut, prgfInOut ? *prgfInOut : 0);
-
-    ret = SHGetDesktopFolder(&pSF);
-    if (FAILED(ret))
-        return ret;
-
-    if (lpFindFile || bBindCtx)
-        ret = IFileSystemBindData_Constructor(lpFindFile, &pBC);
-
-    if (SUCCEEDED(ret))
-    {
-        ret = pSF->ParseDisplayName(0, pBC, (LPOLESTR)path, NULL, ppidl, 
prgfInOut);
-    }
-
-    if (FAILED(ret) && ppidl)
-        *ppidl = NULL;
-
-    TRACE("%s %p 0x%x\n", debugstr_w(path), ppidl ? *ppidl : NULL, prgfInOut ? 
*prgfInOut : 0);
-
-    return ret;
-}
-
-/*************************************************************************
- * SHSimpleIDListFromPath    [SHELL32.162]
- *
- * Creates a simple ItemIDList from a path and returns it. This function
- * does not fail on nonexistent paths.
- *
- * PARAMS
- *  path         [I]   path to parse and convert into an ItemIDList
- *
- * RETURNS
- *  the newly created simple ItemIDList
- *
- * NOTES
- *  Simple in the name does not mean a relative ItemIDList but rather a
- *  fully qualified list, where only the file name is filled in and the
- *  directory flag for those ItemID elements this is known about, eg.
- *  it is not the last element in the ItemIDList or the actual directory
- *  exists on disk.
- *  exported by ordinal.
- */
-LPITEMIDLIST WINAPI SHSimpleIDListFromPathA(LPCSTR lpszPath)
-{
-    LPITEMIDLIST pidl = NULL;
-    LPWSTR wPath = NULL;
-    int len;
-
-    TRACE("%s\n", debugstr_a(lpszPath));
-
-    if (lpszPath)
-    {
-        len = MultiByteToWideChar(CP_ACP, 0, lpszPath, -1, NULL, 0);
-        wPath = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-        MultiByteToWideChar(CP_ACP, 0, lpszPath, -1, wPath, len);
-    }
-
-    _ILParsePathW(wPath, NULL, TRUE, &pidl, NULL);
-
-    HeapFree(GetProcessHeap(), 0, wPath);
-    TRACE("%s %p\n", debugstr_a(lpszPath), pidl);
-    return pidl;
-}
-
-LPITEMIDLIST WINAPI SHSimpleIDListFromPathW(LPCWSTR lpszPath)
-{
-    LPITEMIDLIST pidl = NULL;
-
-    TRACE("%s\n", debugstr_w(lpszPath));
-
-    _ILParsePathW(lpszPath, NULL, TRUE, &pidl, NULL);
-    TRACE("%s %p\n", debugstr_w(lpszPath), pidl);
-    return pidl;
-}
-
-EXTERN_C LPITEMIDLIST WINAPI SHSimpleIDListFromPathAW(LPCVOID lpszPath)
-{
-    if ( SHELL_OsIsUnicode())
-        return SHSimpleIDListFromPathW ((LPCWSTR)lpszPath);
-    return SHSimpleIDListFromPathA ((LPCSTR)lpszPath);
-}
-
-/*************************************************************************
- * SHGetDataFromIDListA [SHELL32.247]
- *
- * NOTES
- *  the pidl can be a simple one. since we can't get the path out of the pidl
- *  we have to take all data from the pidl
- */
-HRESULT WINAPI SHGetDataFromIDListA(IShellFolder * psf, LPCITEMIDLIST pidl,
-                                    int nFormat, LPVOID dest, int len)
-{
-    LPSTR filename, shortname;
-    WIN32_FIND_DATAA * pfd;
-
-    TRACE_(shell)("sf=%p pidl=%p 0x%04x %p 0x%04x stub\n", psf, pidl, nFormat, 
dest, len);
-
-    pdump(pidl);
-    if (!psf || !dest)
-        return E_INVALIDARG;
-
-    switch (nFormat)
-    {
-        case SHGDFIL_FINDDATA:
-            pfd = (WIN32_FIND_DATAA *)dest;
-
-            if (_ILIsDrive(pidl) || _ILIsSpecialFolder(pidl))
-                return E_INVALIDARG;
-
-            if (len < (int)sizeof(WIN32_FIND_DATAA))
-                return E_INVALIDARG;
-
-            ZeroMemory(pfd, sizeof (WIN32_FIND_DATAA));
-            _ILGetFileDateTime( pidl, &(pfd->ftLastWriteTime));
-            pfd->dwFileAttributes = _ILGetFileAttributes(pidl, NULL, 0);
-            pfd->nFileSizeLow = _ILGetFileSize ( pidl, NULL, 0);
-
-            filename = _ILGetTextPointer(pidl);
-            shortname = _ILGetSTextPointer(pidl);
-
-            if (filename)
-                lstrcpynA(pfd->cFileName, filename, sizeof(pfd->cFileName));
-            else
-                pfd->cFileName[0] = '\0';
-
-            if (shortname)
-                lstrcpynA(pfd->cAlternateFileName, shortname, 
sizeof(pfd->cAlternateFileName));
-            else
-                pfd->cAlternateFileName[0] = '\0';
-            return S_OK;
-
-        case SHGDFIL_NETRESOURCE:
-        case SHGDFIL_DESCRIPTIONID:
-            FIXME_(shell)("SHGDFIL %i stub\n", nFormat);
-            break;
-
-        default:
-            ERR_(shell)("Unknown SHGDFIL %i, please report\n", nFormat);
-    }
-
-    return E_INVALIDARG;
-}
-
-/*************************************************************************
- * SHGetDataFromIDListW [SHELL32.248]
- *
- */
-HRESULT WINAPI SHGetDataFromIDListW(IShellFolder * psf, LPCITEMIDLIST pidl,
-                                    int nFormat, LPVOID dest, int len)
-{
-    LPSTR filename, shortname;
-    WIN32_FIND_DATAW * pfd = (WIN32_FIND_DATAW *)dest;
-
-    TRACE_(shell)("sf=%p pidl=%p 0x%04x %p 0x%04x stub\n", psf, pidl, nFormat, 
dest, len);
-
-    pdump(pidl);
-
-    if (!psf || !dest)
-        return E_INVALIDARG;
-
-    switch (nFormat)
-    {
-        case SHGDFIL_FINDDATA:
-            pfd = (WIN32_FIND_DATAW *)dest;
-
-            if (_ILIsDrive(pidl))
-                return E_INVALIDARG;
-
-            if (len < (int)sizeof(WIN32_FIND_DATAW))
-                return E_INVALIDARG;
-
-            ZeroMemory(pfd, sizeof (WIN32_FIND_DATAW));
-            _ILGetFileDateTime( pidl, &(pfd->ftLastWriteTime));
-            pfd->dwFileAttributes = _ILGetFileAttributes(pidl, NULL, 0);
-            pfd->nFileSizeLow = _ILGetFileSize ( pidl, NULL, 0);
-
-            filename = _ILGetTextPointer(pidl);
-            shortname = _ILGetSTextPointer(pidl);
-
-            if (!filename)
-                pfd->cFileName[0] = '\0';
-            else if (!MultiByteToWideChar(CP_ACP, 0, filename, -1, 
pfd->cFileName, MAX_PATH))
-                pfd->cFileName[MAX_PATH-1] = 0;
-
-            if (!shortname)
-                pfd->cAlternateFileName[0] = '\0';
-            else if (!MultiByteToWideChar(CP_ACP, 0, shortname, -1, 
pfd->cAlternateFileName, 14))
-                pfd->cAlternateFileName[13] = 0;
-            return S_OK;
-
-        case SHGDFIL_NETRESOURCE:
-        case SHGDFIL_DESCRIPTIONID:
-            FIXME_(shell)("SHGDFIL %i stub\n", nFormat);
-            break;
-
-        default:
-            ERR_(shell)("Unknown SHGDFIL %i, please report\n", nFormat);
-    }
-
-    return E_INVALIDARG;
-}
-
-/*************************************************************************
- * SHGetPathFromIDListA        [SHELL32.@][NT 4.0: SHELL32.220]
- *
- * PARAMETERS
- *  pidl,   [IN] pidl
- *  pszPath [OUT] path
- *
- * RETURNS
- *  path from a passed PIDL.
- *
- * NOTES
- *    NULL returns FALSE
- *    desktop pidl gives path to desktop directory back
- *    special pidls returning FALSE
- */
-BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath)
-{
-    WCHAR wszPath[MAX_PATH];
-    BOOL bSuccess;
-
-    bSuccess = SHGetPathFromIDListW(pidl, wszPath);
-    WideCharToMultiByte(CP_ACP, 0, wszPath, -1, pszPath, MAX_PATH, NULL, NULL);
-
-    return bSuccess;
-}
-
-/*************************************************************************
- * SHGetPathFromIDListW             [SHELL32.@]
- *
- * See SHGetPathFromIDListA.
- */
-BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
-{
-    HRESULT hr;
-    LPCITEMIDLIST pidlLast;
-    CComPtr<IShellFolder>        psfFolder;
-    DWORD dwAttributes;
-    STRRET strret;
-
-    TRACE_(shell)("(pidl=%p,%p)\n", pidl, pszPath);
-    pdump(pidl);
-
-    *pszPath = '\0';
-    if (!pidl)
-        return FALSE;
-
-    hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfFolder), 
&pidlLast);
-    if (FAILED(hr))
-    {
-        ERR("SHBindToParent failed: %x\n", hr);
-        return FALSE;
-    }
-
-    dwAttributes = SFGAO_FILESYSTEM;
-    hr = psfFolder->GetAttributesOf(1, &pidlLast, &dwAttributes);
-    if (FAILED(hr) || !(dwAttributes & SFGAO_FILESYSTEM))
-    {
-        WARN("Wrong dwAttributes or GetAttributesOf failed: %x\n", hr);
-        return FALSE;
-    }
-
-    hr = psfFolder->GetDisplayNameOf(pidlLast, SHGDN_FORPARSING, &strret);
-    if (FAILED(hr)) return FALSE;
-
-    hr = StrRetToBufW(&strret, pidlLast, pszPath, MAX_PATH);
-
-    TRACE_(shell)("-- %s, 0x%08x\n", debugstr_w(pszPath), hr);
-    return SUCCEEDED(hr);
-}
-
-/*************************************************************************
- *    SHBindToParent        [shell version 5.0]
- */
-HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, 
LPCITEMIDLIST *ppidlLast)
-{
-    CComPtr<IShellFolder>        psfDesktop;
-    HRESULT         hr = E_FAIL;
-
-    TRACE_(shell)("pidl=%p\n", pidl);
-    pdump(pidl);
-
-    if (!pidl || !ppv)
-        return E_INVALIDARG;
-
-    *ppv = NULL;
-    if (ppidlLast)
-        *ppidlLast = NULL;
-
-    hr = SHGetDesktopFolder(&psfDesktop);
-    if (FAILED(hr))
-        return hr;
-
-    if (_ILIsPidlSimple(pidl))
-    {
-        /* we are on desktop level */
-        hr = psfDesktop->QueryInterface(riid, ppv);
-    }
-    else
-    {
-        LPITEMIDLIST pidlParent = ILClone(pidl);
-        ILRemoveLastID(pidlParent);
-        hr = psfDesktop->BindToObject(pidlParent, NULL, riid, ppv);
-        SHFree (pidlParent);
-    }
-
-    if (SUCCEEDED(hr) && ppidlLast)
-        *ppidlLast = ILFindLastID(pidl);
-
-    TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08x\n", *ppv, (ppidlLast) ? 
*ppidlLast : NULL, hr);
-    return hr;
-}
-
-/**************************************************************************
- *
- *        internal functions
- *
- *    ### 1. section creating pidls ###
- *
- *************************************************************************
- */
-
-/* Basic PIDL constructor.  Allocates size + 5 bytes, where:
- * - two bytes are SHITEMID.cb
- * - one byte is PIDLDATA.type
- * - two bytes are the NULL PIDL terminator
- * Sets type of the returned PIDL to type.
- */
-static LPITEMIDLIST _ILAlloc(PIDLTYPE type, unsigned int size)
-{
-    LPITEMIDLIST pidlOut = NULL;
-
-    pidlOut = (LPITEMIDLIST)SHAlloc(size + 5);
-    if(pidlOut)
-    {
-        LPPIDLDATA pData;
-        LPITEMIDLIST pidlNext;
-
-        ZeroMemory(pidlOut, size + 5);
-        pidlOut->mkid.cb = size + 3;
-
-        pData = _ILGetDataPointer(pidlOut);
-        if (pData)
-            pData->type = type;
-
-        pidlNext = ILGetNext(pidlOut);
-        if (pidlNext)
-            pidlNext->mkid.cb = 0x00;
-        TRACE("-- (pidl=%p, size=%u)\n", pidlOut, size);
-    }
-
-    return pidlOut;
-}
-
-LPITEMIDLIST _ILCreateDesktop(void)
-{
-    LPITEMIDLIST ret;
-
-    TRACE("()\n");
-    ret = (LPITEMIDLIST)SHAlloc(2);
-    if (ret)
-        ret->mkid.cb = 0;
-    return ret;
-}
-
-LPITEMIDLIST _ILCreateMyComputer(void)
-{
-    TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_MyComputer);
-}
-
-LPITEMIDLIST _ILCreateMyDocuments(void)
-{
-    TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_MyDocuments);
-}
-
-LPITEMIDLIST _ILCreateIExplore(void)
-{
-    TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_Internet);
-}
-
-LPITEMIDLIST _ILCreateControlPanel(void)
-{
-    LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, CLSID_MyComputer), ret = NULL;
-
-    TRACE("()\n");
-    if (parent)
-    {
-        LPITEMIDLIST cpl = _ILCreateGuid(PT_SHELLEXT, CLSID_ControlPanel);
-
-        if (cpl)
-        {
-            ret = ILCombine(parent, cpl);
-            SHFree(cpl);
-        }
-        SHFree(parent);
-    }
-    return ret;
-}
-
-LPITEMIDLIST _ILCreatePrinters(void)
-{
-    LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, CLSID_MyComputer), ret = NULL;
-
-    TRACE("()\n");
-    if (parent)
-    {
-        LPITEMIDLIST printers = _ILCreateGuid(PT_YAGUID, CLSID_Printers);
-
-        if (printers)
-        {
-            ret = ILCombine(parent, printers);
-            SHFree(printers);
-        }
-        SHFree(parent);
-    }
-    return ret;
-}
-
-LPITEMIDLIST _ILCreateNetwork(void)
-{
-    TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_NetworkPlaces);
-}
-
-LPITEMIDLIST _ILCreateBitBucket(void)
-{
-    TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_RecycleBin);
-}
-
-LPITEMIDLIST _ILCreateAdminTools(void)
-{
-    TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_AdminFolderShortcut); //FIXME
-}
-
-LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid)
-{
-    LPITEMIDLIST pidlOut;
-
-    if (type == PT_SHELLEXT || type == PT_GUID || type == PT_YAGUID)
-    {
-        pidlOut = _ILAlloc(type, sizeof(GUIDStruct));
-        if (pidlOut)
-        {
-            LPPIDLDATA pData = _ILGetDataPointer(pidlOut);
-
-            pData->u.guid.guid = guid;
-            TRACE("-- create GUID-pidl %s\n",
-                  debugstr_guid(&(pData->u.guid.guid)));
-        }
-    }
-    else
-    {
-        WARN("%d: invalid type for GUID\n", type);
-        pidlOut = NULL;
-    }
-    return pidlOut;
-}
-
-LPITEMIDLIST _ILCreateGuidFromStrA(LPCSTR szGUID)
-{
-    IID iid;
-
-    if (FAILED(SHCLSIDFromStringA(szGUID, &iid)))
-    {
-        ERR("%s is not a GUID\n", szGUID);
-        return NULL;
-    }
-    return _ILCreateGuid(PT_GUID, iid);
-}
-
-LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID)
-{
-    IID iid;
-
-    if (FAILED(CLSIDFromString((LPOLESTR)szGUID, &iid)))
-    {
-        ERR("%s is not a GUID\n", debugstr_w(szGUID));
-        return NULL;
-    }
-    return _ILCreateGuid(PT_GUID, iid);
-}
-
-LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd )
-{
-    char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
-    DWORD len, len1, wlen, alen, cbData;
-    LPITEMIDLIST pidl;
-    PIDLTYPE type;
-
-    if (!wfd)
-        return NULL;
-
-    TRACE("(%s, %s)\n", debugstr_w(wfd->cAlternateFileName), 
debugstr_w(wfd->cFileName));
-
-    /* prepare buffer with both names */
-    len = WideCharToMultiByte(CP_ACP, 0, wfd->cFileName, -1, buff, MAX_PATH, 
NULL, NULL);
-    len1 = WideCharToMultiByte(CP_ACP, 0, wfd->cAlternateFileName, -1, buff + 
len, sizeof(buff) - len, NULL, NULL);
-    alen = len + len1;
-
-    type = (wfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : 
PT_VALUE;
-
-    wlen = wcslen(wfd->cFileName) + 1;
-    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);
-        FileStruct *fs = &pData->u.file;
-        FileStructW *fsw;
-        WORD *pOffsetW;
-
-        FileTimeToDosDateTime( &wfd->ftLastWriteTime, &fs->uFileDate, 
&fs->uFileTime);
-        fs->dwFileSize = wfd->nFileSizeLow;
-        fs->uFileAttribs = wfd->dwFileAttributes;
-        memcpy(fs->szNames, buff, alen);
-
-        fsw = (FileStructW*)(pData->u.file.szNames + alen + (alen & 0x1));
-        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));
-
-        pOffsetW = (WORD*)((LPBYTE)pidl + pidl->mkid.cb - sizeof(WORD));
-        *pOffsetW = (LPBYTE)fsw - (LPBYTE)pidl;
-        TRACE("-- Set Value: %s\n", debugstr_w(fsw->wszName));
-    }
-    return pidl;
-
-}
-
-HRESULT _ILCreateFromPathW(LPCWSTR szPath, LPITEMIDLIST* ppidl)
-{
-    HANDLE hFile;
-    WIN32_FIND_DATAW stffile;
-
-    if (!ppidl)
-        return E_INVALIDARG;
-
-    hFile = FindFirstFileW(szPath, &stffile);
-    if (hFile == INVALID_HANDLE_VALUE)
-        return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
-
-    FindClose(hFile);
-
-    *ppidl = _ILCreateFromFindDataW(&stffile);
-
-    return *ppidl ? S_OK : E_OUTOFMEMORY;
-}
-
-LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
-{
-    LPITEMIDLIST pidlOut;
-
-    TRACE("(%s)\n", debugstr_w(lpszNew));
-
-    pidlOut = _ILAlloc(PT_DRIVE, sizeof(DriveStruct));
-    if (pidlOut)
-    {
-        LPSTR pszDest;
-
-        pszDest = _ILGetTextPointer(pidlOut);
-        if (pszDest)
-        {
-            strcpy(pszDest, "x:\\");
-            pszDest[0] = towupper(lpszNew[0]);
-            TRACE("-- create Drive: %s\n", debugstr_a(pszDest));
-        }
-    }
-    return pidlOut;
-}
-
-/**************************************************************************
- *  _ILGetDrive()
- *
- *  Gets the text for the drive eg. 'c:\'
- *
- * RETURNS
- *  strlen (lpszText)
- */
-DWORD _ILGetDrive(LPCITEMIDLIST pidl, LPSTR pOut, UINT uSize)
-{
-    TRACE("(%p,%p,%u)\n", pidl, pOut, uSize);
-
-    if(_ILIsMyComputer(pidl))
-        pidl = ILGetNext(pidl);
-
-    if (pidl && _ILIsDrive(pidl))
-        return _ILSimpleGetText(pidl, pOut, uSize);
-
-    return 0;
-}
-
-/**************************************************************************
- *
- *    ### 2. section testing pidls ###
- *
- **************************************************************************
- *  _ILIsUnicode()
- *  _ILIsDesktop()
- *  _ILIsMyComputer()
- *  _ILIsSpecialFolder()
- *  _ILIsDrive()
- *  _ILIsFolder()
- *  _ILIsValue()
- *  _ILIsPidlSimple()
- */
-BOOL _ILIsUnicode(LPCITEMIDLIST pidl)
-{
-    LPPIDLDATA lpPData = _ILGetDataPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    return (pidl && lpPData && PT_VALUEW == lpPData->type);
-}
-
-BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
-{
-    TRACE("(%p)\n", pidl);
-
-    return pidl && pidl->mkid.cb ? 0 : 1;
-}
-
-BOOL _ILIsMyDocuments(LPCITEMIDLIST pidl)
-{
-    IID *iid = _ILGetGUIDPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    if (iid)
-        return IsEqualIID(*iid, CLSID_MyDocuments);
-    return FALSE;
-}
-
-BOOL _ILIsControlPanel(LPCITEMIDLIST pidl)
-{
-    IID *iid = _ILGetGUIDPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    if (iid)
-        return IsEqualIID(*iid, CLSID_ControlPanel);
-    return FALSE;
-}
-
-BOOL _ILIsNetHood(LPCITEMIDLIST pidl)
-{
-    IID *iid = _ILGetGUIDPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    if (iid)
-        return IsEqualIID(*iid, CLSID_NetworkPlaces);
-    return FALSE;
-}
-
-
-LPITEMIDLIST _ILCreateNetHood(void)
-{
-    return _ILCreateGuid(PT_GUID, CLSID_NetworkPlaces);
-}
-
-LPITEMIDLIST _ILCreateFont(void)
-{
-    return _ILCreateGuid(PT_GUID, CLSID_FontsFolderShortcut);
-}
-
-BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
-{
-    IID *iid = _ILGetGUIDPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    if (iid)
-        return IsEqualIID(*iid, CLSID_MyComputer);
-    return FALSE;
-}
-
-BOOL _ILIsPrinter(LPCITEMIDLIST pidl)
-{
-    IID *iid = _ILGetGUIDPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    if (iid)
-        return IsEqualIID(*iid, CLSID_Printers);
-    return FALSE;
-}
-
-BOOL _ILIsBitBucket(LPCITEMIDLIST pidl)
-{
-    IID *iid = _ILGetGUIDPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    if (iid)
-        return IsEqualIID(*iid, CLSID_RecycleBin);
-    return FALSE;
-}
-
-BOOL _ILIsAdminTools(LPCITEMIDLIST pidl)
-{
-    IID *iid = _ILGetGUIDPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    if (iid)
-        return IsEqualIID(*iid, CLSID_AdminFolderShortcut);
-    else
-        return FALSE;
-}
-
-BOOL _ILIsSpecialFolder (LPCITEMIDLIST pidl)
-{
-    LPPIDLDATA lpPData = _ILGetDataPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    return (pidl && ( (lpPData && (PT_GUID == lpPData->type || PT_SHELLEXT == 
lpPData->type || PT_YAGUID == lpPData->type)) ||
-                      (pidl && pidl->mkid.cb == 0x00)
-                    ));
-}
-
-BOOL _ILIsDrive(LPCITEMIDLIST pidl)
-{
-    LPPIDLDATA lpPData = _ILGetDataPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    return (pidl && lpPData && (PT_DRIVE == lpPData->type ||
-                                PT_DRIVE1 == lpPData->type ||
-                                PT_DRIVE2 == lpPData->type ||
-                                PT_DRIVE3 == lpPData->type));
-}
-
-BOOL _ILIsFolder(LPCITEMIDLIST pidl)
-{
-    LPPIDLDATA lpPData = _ILGetDataPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    return (pidl && lpPData && (PT_FOLDER == lpPData->type || PT_FOLDER1 == 
lpPData->type));
-}
-
-BOOL _ILIsValue(LPCITEMIDLIST pidl)
-{
-    LPPIDLDATA lpPData = _ILGetDataPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    return (pidl && lpPData && PT_VALUE == lpPData->type);
-}
-
-BOOL _ILIsCPanelStruct(LPCITEMIDLIST pidl)
-{
-    LPPIDLDATA lpPData = _ILGetDataPointer(pidl);
-
-    TRACE("(%p)\n", pidl);
-
-    return (pidl && lpPData && (lpPData->type == 0));
-}
-
-/**************************************************************************
- *    _ILIsPidlSimple
- */
-BOOL _ILIsPidlSimple(LPCITEMIDLIST pidl)
-{
-    BOOL ret = TRUE;
-
-    if(! _ILIsDesktop(pidl))    /* pidl=NULL or mkid.cb=0 */
-    {
-        WORD len = pidl->mkid.cb;
-        LPCITEMIDLIST pidlnext = (LPCITEMIDLIST) (((const BYTE*)pidl) + len );
-
-        if (pidlnext->mkid.cb)
-            ret = FALSE;
-    }
-
-    TRACE("%s\n", ret ? "Yes" : "No");
-    return ret;
-}
-
-/**************************************************************************
- *
- *    ### 3. section getting values from pidls ###
- */
-
-/**************************************************************************
-*  _ILSimpleGetText
-*
-* gets the text for the first item in the pidl (eg. simple pidl)
-*
-* returns the length of the string
-*/
-DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
-{
-    DWORD        dwReturn = 0;
-    LPSTR        szSrc;
-    LPWSTR       szSrcW;
-    GUID const * riid;
-    char szTemp[MAX_PATH];
-
-    TRACE("(%p %p %x)\n", pidl, szOut, uOutSize);
-
-    if (!pidl)
-        return 0;
-
-    if (szOut)
-        *szOut = 0;
-
-    if (_ILIsDesktop(pidl))
-    {
-        /* desktop */
-        if (HCR_GetClassNameA(CLSID_ShellDesktop, szTemp, MAX_PATH))
-        {
-            if (szOut)
-                lstrcpynA(szOut, szTemp, uOutSize);
-
-            dwReturn = strlen (szTemp);
-        }
-    }
-    else if (( szSrc = _ILGetTextPointer(pidl) ))
-    {
-        /* filesystem */
-        if (szOut)
-            lstrcpynA(szOut, szSrc, uOutSize);
-
-        dwReturn = strlen(szSrc);
-    }
-    else if (( szSrcW = _ILGetTextPointerW(pidl) ))
-    {
-        /* unicode filesystem */
-        WideCharToMultiByte(CP_ACP, 0, szSrcW, -1, szTemp, MAX_PATH, NULL, 
NULL);
-
-        if (szOut)
-            lstrcpynA(szOut, szTemp, uOutSize);
-
-        dwReturn = strlen (szTemp);
-    }
-    else if (( riid = _ILGetGUIDPointer(pidl) ))
-    {
-        /* special folder */
-        if (HCR_GetClassNameA(*riid, szTemp, MAX_PATH) )
-        {
-            if (szOut)
-                lstrcpynA(szOut, szTemp, uOutSize);
-
-            dwReturn = strlen (szTemp);
-        }
-    }
-    else
-    {
-        ERR("-- no text\n");
-    }
-
-    TRACE("-- (%p=%s 0x%08x)\n", szOut, debugstr_a(szOut), dwReturn);
-    return dwReturn;
-}
-
-/**************************************************************************
-*  _ILSimpleGetTextW
-*
-* gets the text for the first item in the pidl (eg. simple pidl)
-*
-* returns the length of the string
-*/
-DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
-{
-    DWORD   dwReturn;
-    FileStructW *pFileStructW = _ILGetFileStructW(pidl);
-
-    TRACE("(%p %p %x)\n", pidl, szOut, uOutSize);
-
-    if (pFileStructW) {
-        lstrcpynW(szOut, pFileStructW->wszName, uOutSize);
-        dwReturn = wcslen(pFileStructW->wszName);
-    } else {
-        GUID const * riid;
-        WCHAR szTemp[MAX_PATH];
-        LPSTR szSrc;
-        LPWSTR szSrcW;
-        dwReturn = 0;
-
-        if (!pidl)
-            return 0;
-
-        if (szOut)
-            *szOut = 0;
-
-        if (_ILIsDesktop(pidl))
-        {
-            /* desktop */
-            if (HCR_GetClassNameW(CLSID_ShellDesktop, szTemp, MAX_PATH))
-            {
-                if (szOut)
-                    lstrcpynW(szOut, szTemp, uOutSize);
-
-                dwReturn = wcslen (szTemp);
-            }
-        }
-        else if (( szSrcW = _ILGetTextPointerW(pidl) ))
-        {
-            /* unicode filesystem */
-            if (szOut)
-                lstrcpynW(szOut, szSrcW, uOutSize);
-
-            dwReturn = wcslen(szSrcW);
-        }
-        else if (( szSrc = _ILGetTextPointer(pidl) ))
-        {
-            /* filesystem */
-            MultiByteToWideChar(CP_ACP, 0, szSrc, -1, szTemp, MAX_PATH);
-
-            if (szOut)
-                lstrcpynW(szOut, szTemp, uOutSize);
-
-            dwReturn = wcslen (szTemp);
-        }
-        else if (( riid = _ILGetGUIDPointer(pidl) ))
-        {
-            /* special folder */
-            if ( HCR_GetClassNameW(*riid, szTemp, MAX_PATH) )
-            {
-                if (szOut)
-                    lstrcpynW(szOut, szTemp, uOutSize);
-
-                dwReturn = wcslen (szTemp);
-            }
-        }
-        else
-        {
-            ERR("-- no text\n");
-        }
-    }
-
-    TRACE("-- (%p=%s 0x%08x)\n", szOut, debugstr_w(szOut), dwReturn);
-    return dwReturn;
-}
-
-/**************************************************************************
- *
- *    ### 4. getting pointers to parts of pidls ###
- *
- **************************************************************************
- *  _ILGetDataPointer()
- */
-LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
-{
-    if(pidl && pidl->mkid.cb != 0x00)
-        return (LPPIDLDATA)pidl->mkid.abID;
-    return NULL;
-}
-
-/**************************************************************************
- *  _ILGetTextPointerW()
- * gets a pointer to the unicode long filename string stored in the pidl
- */
-static LPWSTR _ILGetTextPointerW(LPCITEMIDLIST pidl)
-{
-    /* TRACE(pidl,"(pidl%p)\n", pidl);*/
-
-    LPPIDLDATA pdata = _ILGetDataPointer(pidl);
-
-    if (!pdata)
-        return NULL;
-
-    switch (pdata->type)
-    {
-        case PT_GUID:
-        case PT_SHELLEXT:
-        case PT_YAGUID:
-            return NULL;
-
-        case PT_DRIVE:
-        case PT_DRIVE1:
-        case PT_DRIVE2:
-        case PT_DRIVE3:
-            /*return (LPSTR)&(pdata->u.drive.szDriveName);*/
-            return NULL;
-
-        case PT_FOLDER:
-        case PT_FOLDER1:
-        case PT_VALUE:
-        case PT_IESPECIAL1:
-        case PT_IESPECIAL2:
-            /*return (LPSTR)&(pdata->u.file.szNames);*/
-            return NULL;
-
-        case PT_WORKGRP:
-        case PT_COMP:
-        case PT_NETWORK:
-        case PT_NETPROVIDER:
-        case PT_SHARE:
-            /*return (LPSTR)&(pdata->u.network.szNames);*/
-            return NULL;
-
-        case PT_VALUEW:
-            return (LPWSTR)pdata->u.file.szNames;
-    }
-    return NULL;
-}
-
-
-/**************************************************************************
- *  _ILGetTextPointer()
- * gets a pointer to the long filename string stored in the pidl
- */
-LPSTR _ILGetTextPointer(LPCITEMIDLIST pidl)
-{
-    /* TRACE(pidl,"(pidl%p)\n", pidl);*/
-
-    LPPIDLDATA pdata = _ILGetDataPointer(pidl);
-
-    if (!pdata)
-        return NULL;
-
-    switch (pdata->type)
-    {
-        case PT_GUID:
-        case PT_SHELLEXT:
-        case PT_YAGUID:
-            return NULL;
-
-        case PT_DRIVE:
-        case PT_DRIVE1:
-        case PT_DRIVE2:
-        case PT_DRIVE3:
-            return pdata->u.drive.szDriveName;
-
-        case PT_FOLDER:
-        case PT_FOLDER1:
-        case PT_VALUE:
-        case PT_IESPECIAL1:
-        case PT_IESPECIAL2:
-            return pdata->u.file.szNames;
-
-        case PT_WORKGRP:
-        case PT_COMP:
-        case PT_NETWORK:
-        case PT_NETPROVIDER:
-        case PT_SHARE:
-            return pdata->u.network.szNames;
-
-        case PT_CPLAPPLET:
-            return pdata->u.cpanel.szName;
-    }
-    return NULL;
-}
-
-/**************************************************************************
- *  _ILGetSTextPointer()
- * gets a pointer to the short filename string stored in the pidl
- */
-static LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl)
-{
-    /* TRACE(pidl,"(pidl%p)\n", pidl); */
-
-    LPPIDLDATA pdata = _ILGetDataPointer(pidl);
-
-    if (!pdata)
-        return NULL;
-
-    switch (pdata->type)
-    {
-        case PT_FOLDER:
-        case PT_VALUE:
-        case PT_IESPECIAL1:
-        case PT_IESPECIAL2:
-            return pdata->u.file.szNames + strlen (pdata->u.file.szNames) + 1;
-
-        case PT_WORKGRP:
-            return pdata->u.network.szNames + strlen 
(pdata->u.network.szNames) + 1;
-    }
-    return NULL;
-}
-
-/**************************************************************************
- * _ILGetGUIDPointer()
- *
- * returns reference to guid stored in some pidls
- */
-IID* _ILGetGUIDPointer(LPCITEMIDLIST pidl)
-{
-    LPPIDLDATA pdata = _ILGetDataPointer(pidl);
-
-    TRACE("%p\n", pidl);
-
-    if (!pdata)
-        return NULL;
-
-    TRACE("pdata->type 0x%04x\n", pdata->type);
-    switch (pdata->type)
-    {
-        case PT_SHELLEXT:
-        case PT_GUID:
-        case PT_YAGUID:
-            return &(pdata->u.guid.guid);
-
-        default:
-            TRACE("Unknown pidl type 0x%04x\n", pdata->type);
-            break;
-    }
-    return NULL;
-}
-
-/******************************************************************************
- * _ILGetFileStructW [Internal]
- *
- * Get pointer the a SHITEMID's FileStructW field if present
- *
- * PARAMS
- *  pidl [I] The SHITEMID
- *
- * RETURNS
- *  Success: Pointer to pidl's FileStructW field.
- *  Failure: NULL
- */
-FileStructW* _ILGetFileStructW(LPCITEMIDLIST pidl) {
-    FileStructW *pFileStructW;
-    WORD cbOffset;
-
-    if (!(_ILIsValue(pidl) || _ILIsFolder(pidl)))
-        return NULL;
-
-    cbOffset = *(const WORD *)((const BYTE *)pidl + pidl->mkid.cb - 
sizeof(WORD));
-    pFileStructW = (FileStructW*)((LPBYTE)pidl + cbOffset);
-
-    /* Currently I don't see a fool prove way to figure out if a pidl is for 
sure of WinXP
-     * style with a FileStructW member. If we switch all our 
shellfolder-implementations to
-     * the new format, this won't be a problem. For now, we do as many sanity 
checks as possible. */
-    if (cbOffset & 0x1 || /* FileStructW member is word aligned in the pidl */
-            /* FileStructW is positioned after FileStruct */
-            cbOffset < sizeof(pidl->mkid.cb) + sizeof(PIDLTYPE) + 
sizeof(FileStruct) ||
-            /* There has to be enough space at cbOffset in the pidl to hold 
FileStructW and cbOffset */
-            cbOffset > pidl->mkid.cb - sizeof(cbOffset) - sizeof(FileStructW) 
||
-            pidl->mkid.cb != cbOffset + pFileStructW->cbLen)
-    {
-        ERR("Invalid pidl format (cbOffset = %d)!\n", cbOffset);
-        return NULL;
-    }
-
-    return pFileStructW;
-}
-
-/*************************************************************************
- * _ILGetFileDateTime
- *
- * Given the ItemIdList, get the FileTime
- *
- * PARAMS
- *      pidl        [I] The ItemIDList
- *      pFt         [I] the resulted FILETIME of the file
- *
- * RETURNS
- *     True if Successful
- *
- * NOTES
- *
- */
-BOOL _ILGetFileDateTime(LPCITEMIDLIST pidl, FILETIME *pFt)
-{
-    LPPIDLDATA pdata = _ILGetDataPointer(pidl);
-
-    if (!pdata)
-        return FALSE;
-
-    switch (pdata->type)
-    {
-        case PT_FOLDER:
-        case PT_VALUE:
-            DosDateTimeToFileTime(pdata->u.file.uFileDate, 
pdata->u.file.uFileTime, pFt);
-            break;
-        default:
-            return FALSE;
-    }
-    return TRUE;
-}
-
-BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
-{
-    FILETIME ft, lft;
-    SYSTEMTIME time;
-    BOOL ret;
-
-    if (_ILGetFileDateTime( pidl, &ft ))
-    {
-        FileTimeToLocalFileTime(&ft, &lft);
-        FileTimeToSystemTime (&lft, &time);
-
-        ret = GetDateFormatA(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &time, NULL, 
 pOut, uOutSize);
-        if (ret)
-        {
-            /* Append space + time without seconds */
-            pOut[ret-1] = ' ';
-            GetTimeFormatA(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &time, NULL, 
&pOut[ret], uOutSize - ret);
-        }
-    }
-    else
-    {
-        pOut[0] = '\0';
-        ret = FALSE;
-    }
-    return ret;
-}
-
-/*************************************************************************
- * _ILGetFileSize
- *
- * Given the ItemIdList, get the FileSize
- *
- * PARAMS
- *    pidl     [I] The ItemIDList
- *    pOut     [I] The buffer to save the result
- *    uOutsize [I] The size of the buffer
- *
- * RETURNS
- *    The FileSize
- *
- * NOTES
- *    pOut can be null when no string is needed
- *
- */
-DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
-{
-    LPPIDLDATA pdata = _ILGetDataPointer(pidl);
-    DWORD dwSize;
-
-    if (!pdata)
-        return 0;
-
-    switch (pdata->type)
-    {
-        case PT_VALUE:
-            dwSize = pdata->u.file.dwFileSize;
-            if (pOut)
-                StrFormatKBSizeA(dwSize, pOut, uOutSize);
-            return dwSize;
-    }
-    if (pOut)
-        *pOut = 0x00;
-    return 0;
-}
-
-BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
-{
-    char szTemp[MAX_PATH];
-    const char * pPoint;
-    LPCITEMIDLIST  pidlTemp = pidl;
-
-    TRACE("pidl=%p\n", pidl);
-
-    if (!pidl)
-        return FALSE;
-
-    pidlTemp = ILFindLastID(pidl);
-
-    if (!_ILIsValue(pidlTemp))
-        return FALSE;
-    if (!_ILSimpleGetText(pidlTemp, szTemp, MAX_PATH))
-        return FALSE;
-
-    pPoint = PathFindExtensionA(szTemp);
-
-    if (!*pPoint)
-        return FALSE;
-
-    pPoint++;
-    lstrcpynA(pOut, pPoint, uOutSize);
-    TRACE("%s\n", pOut);
-
-    return TRUE;
-}
-
-/*************************************************************************
- * _ILGetFileType
- *
- * Given the ItemIdList, get the file type description
- *
- * PARAMS
- *      pidl        [I] The ItemIDList (simple)
- *      pOut        [I] The buffer to save the result
- *      uOutsize    [I] The size of the buffer
- *
- * RETURNS
- *    nothing
- *
- * NOTES
- *    This function copies as much as possible into the buffer.
- */
-void _ILGetFileType(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
-{
-    char sType[64];
-
-    if(_ILIsValue(pidl))
-    {
-        char sTemp[64];
-
-        if(uOutSize > 0)
-            pOut[0] = 0;
-        if (_ILGetExtension (pidl, sType, 64))
-        {
-            if (HCR_MapTypeToValueA(sType, sTemp, 64, TRUE))
-            {
-                /* retrieve description */
-                if(HCR_MapTypeToValueA(sTemp, pOut, uOutSize, FALSE ))
-                    return;
-            }
-            /* display Ext-file as description */
-            strcpy(pOut, sType);
-            _strupr(pOut);
-            /* load localized file string */
-            sTemp[0] = '\0';
-            if(LoadStringA(shell32_hInstance, IDS_SHV_COLUMN1, sTemp, 64))
-            {
-                sTemp[63] = '\0';
-                strcat(pOut, "-");
-                strcat(pOut, sTemp);
-            }
-        }
-    }
-    else
-    {
-        pOut[0] = '\0';
-        LoadStringA(shell32_hInstance, IDS_DIRECTORY, pOut, uOutSize);
-        /* make sure its null terminated */
-        pOut[uOutSize-1] = '\0';
-    }
-}
-
-/*************************************************************************
- * _ILGetFileAttributes
- *
- * Given the ItemIdList, get the Attrib string format
- *
- * PARAMS
- *      pidl        [I] The ItemIDList
- *      pOut        [I] The buffer to save the result
- *      uOutsize    [I] The size of the Buffer
- *
- * RETURNS
- *     Attributes
- *
- * FIXME
- *  return value 0 in case of error is a valid return value
- *
- */
-DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
-{
-    LPPIDLDATA pData = _ILGetDataPointer(pidl);
-    WORD wAttrib = 0;
-    int i;
-
-    if (!pData)
-        return 0;
-
-    switch(pData->type)
-    {
-        case PT_FOLDER:
-        case PT_VALUE:
-            wAttrib = pData->u.file.uFileAttribs;
-            break;
-    }
-
-    if(uOutSize >= 6)
-    {
-        i = 0;
-        if(wAttrib & FILE_ATTRIBUTE_READONLY)
-            pOut[i++] = 'R';
-        if(wAttrib & FILE_ATTRIBUTE_HIDDEN)
-            pOut[i++] = 'H';
-        if(wAttrib & FILE_ATTRIBUTE_SYSTEM)
-            pOut[i++] = 'S';
-        if(wAttrib & FILE_ATTRIBUTE_ARCHIVE)
-            pOut[i++] = 'A';
-        if(wAttrib & FILE_ATTRIBUTE_COMPRESSED)
-            pOut[i++] = 'C';
-        pOut[i] = 0x00;
-    }
-    return wAttrib;
-}
-
-/*************************************************************************
- * ILFreeaPidl
- *
- * free a aPidl struct
- */
-void _ILFreeaPidl(LPITEMIDLIST * apidl, UINT cidl)
-{
-    UINT   i;
-
-    if (apidl)
-    {
-        for (i = 0; i < cidl; i++)
-            SHFree(apidl[i]);
-        SHFree(apidl);
-    }
-}
-
-/*************************************************************************
- * ILCopyaPidl
- *
- * copies an aPidl struct
- */
-LPITEMIDLIST* _ILCopyaPidl(const LPCITEMIDLIST * apidlsrc, UINT cidl)
-{
-    UINT i;
-    LPITEMIDLIST *apidldest;
-
-    apidldest = (LPITEMIDLIST *)SHAlloc(cidl * sizeof(LPITEMIDLIST));
-    if (!apidlsrc)
-        return NULL;
-
-    for (i = 0; i < cidl; i++)
-        apidldest[i] = ILClone(apidlsrc[i]);
-
-    return apidldest;
-}
-
-/*************************************************************************
- * _ILCopyCidaToaPidl
- *
- * creates aPidl from CIDA
- */
-LPITEMIDLIST* _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, const CIDA * cida)
-{
-    UINT i;
-    LPITEMIDLIST *dst;
-
-    dst = (LPITEMIDLIST *)SHAlloc(cida->cidl * sizeof(LPITEMIDLIST));
-    if (!dst)
-        return NULL;
-
-    if (pidl)
-        *pidl = ILClone((LPCITEMIDLIST)(&((const 
BYTE*)cida)[cida->aoffset[0]]));
-
-    for (i = 0; i < cida->cidl; i++)
-        dst[i] = ILClone((LPCITEMIDLIST)(&((const BYTE*)cida)[cida->aoffset[i 
+ 1]]));
-
-    return dst;
-}

Removed: branches/shell-experiments/dll/win32/shell32/pidl.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/pidl.h?rev=65232
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/pidl.h [iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/pidl.h (removed)
@@ -1,312 +0,0 @@
-/*
- * internal pidl functions
- *
- * Copyright 1998 Juergen Schmied
- * Copyright 2004 Juan Lang
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- *
- * NOTES:
- *
- * DO NOT use this definitions outside the shell32.dll !
- *
- * The contents of a pidl should never used from a application
- * directly.
- *
- * Undocumented:
- * MS says: the abID of SHITEMID should be treated as binary data and not
- * be interpreted by applications. Applies to everyone but MS itself.
- * Word95 interprets the contents of abID (Filesize/Date) so we have to go
- * for binary compatibility here.
- */
-
-#ifndef __WINE_PIDL_H
-#define __WINE_PIDL_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-* the pidl does cache fileattributes to speed up SHGetAttributes when
-* displaying a big number of files.
-*
-* a pidl of NULL means the desktop
-*
-* The structure of the pidl seems to be a union. The first byte of the
-* PIDLDATA describes the type of pidl.
-*
-*   object        ! first byte /  ! format       ! living space
-*                 ! size
-*   ----------------------------------------------------------------
-*   my computer 0x1F/20     guid (2)    (usual)
-*   network     0x1F        guid
-*   bitbucket   0x1F        guid
-*   drive       0x23/25     drive       (usual)
-*   drive       0x25/25     drive       (lnk/persistent)
-*   drive       0x29/25     drive
-*   shell extension 0x2E        guid
-*   drive       0x2F        drive       (lnk/persistent)
-*   folder/file 0x30        folder/file (1) (lnk/persistent)
-*   folder      0x31        folder      (usual)
-*   valueA      0x32        file        (ANSI file name)
-*   valueW      0x34        file        (Unicode file name)
-*   workgroup   0x41        network (3)
-*   computer    0x42        network (4)
-*   net provider    0x46        network
-*   whole network   0x47        network (5)
-*   MSITStore   0x61        htmlhlp (7)
-*   printers/ras connections    0x70        guid
-*   history/favorites 0xb1      file
-*   share       0xc3        network (6)
-*
-* guess: the persistent elements are non tracking
-*
-* (1) dummy byte is used, attributes are empty
-* (2) IID_MyComputer = 20D04FE0L-3AEA-1069-A2D8-08002B30309D
-* (3) two strings   "workgroup" "Microsoft Network"
-* (4) two strings   "\\sirius" "Microsoft Network"
-* (5) one string    "Entire Network"
-* (6) two strings   "\\sirius\c" "Microsoft Network"
-* (7) contains string   "mk:@MSITStore:C:\path\file.chm::/path/filename.htm"
-*       GUID    871C5380-42A0-1069-A2EA-08002B30309D
-*/
-
-#define PT_CPLAPPLET    0x00
-#define PT_GUID     0x1F
-#define PT_DRIVE    0x23
-#define PT_DRIVE2   0x25
-#define PT_DRIVE3   0x29
-#define PT_SHELLEXT 0x2E
-#define PT_DRIVE1   0x2F
-#define PT_FOLDER1  0x30
-#define PT_FOLDER   0x31
-#define PT_VALUE    0x32
-#define PT_VALUEW       0x34
-#define PT_WORKGRP  0x41
-#define PT_COMP     0x42
-#define PT_NETPROVIDER  0x46
-#define PT_NETWORK  0x47
-#define PT_IESPECIAL1   0x61
-#define PT_YAGUID   0x70 /* yet another guid.. */
-#define PT_CPEXT    0x71
-#define PT_IESPECIAL2   0xb1
-#define PT_SHARE    0xc3
-
-#include "pshpack1.h"
-typedef BYTE PIDLTYPE;
-
-typedef struct tagPIDLCPanelStruct
-{
-    BYTE dummy;         /*01 is 0x00 */
-    DWORD iconIdx;      /*02 negative icon ID */
-    WORD offsDispName;      /*06*/
-    WORD offsComment;       /*08*/
-    CHAR szName[1];     /*10*/ /* terminated by 0x00, followed by display name 
and comment string */
-} PIDLCPanelStruct;
-
-typedef struct tagPIDLFontStruct
-{
-    BYTE dummy;
-    WORD offsFile;
-    WCHAR szName[1];
-} PIDLFontStruct;
-
-typedef struct tagPIDLPrinterStruct
-{
-    BYTE dummy;
-    DWORD Attributes;
-    WORD offsServer;
-    WCHAR szName[1];
-} PIDLPrinterStruct;
-
-typedef struct tagPIDLRecycleStruct
-{
-    FILETIME LastModification;
-    FILETIME DeletionTime;
-    ULARGE_INTEGER FileSize;
-    ULARGE_INTEGER PhysicalFileSize;
-    DWORD Attributes;
-    WCHAR szName[1];
-} PIDLRecycleStruct;
-
-typedef struct tagGUIDStruct
-{
-    BYTE dummy; /* offset 01 is unknown */
-    GUID guid;  /* offset 02 */
-} GUIDStruct;
-
-typedef struct tagDriveStruct
-{
-    CHAR szDriveName[20];   /*01*/
-    WORD unknown;       /*21*/
-} DriveStruct;
-
-typedef struct tagFileStruct
-{
-    BYTE dummy;         /*01 is 0x00 for files or dirs */
-    DWORD dwFileSize;       /*02*/
-    WORD uFileDate;     /*06*/
-    WORD uFileTime;     /*08*/
-    WORD uFileAttribs;      /*10*/
-    CHAR szNames[1];        /*12*/
-    /* Here are coming two strings. The first is the long name.
-    The second the dos name when needed or just 0x00 */
-} FileStruct;
-
-/* At least on WinXP, this struct is appended with 2-byte-alignment to 
FileStruct. There follows
- * a WORD member after the wszName string, which gives the offset from the 
beginning of the PIDL
- * to the FileStructW member. */
-typedef struct tagFileStructW {
-    WORD cbLen;
-    BYTE dummy1[6];
-    WORD uCreationDate;
-    WORD uCreationTime;
-    WORD uLastAccessDate;
-    WORD uLastAccessTime;
-    BYTE dummy2[4];
-    WCHAR wszName[1];
-} FileStructW;
-
-typedef struct tagValueW
-{
-    WCHAR name[1];
-} ValueWStruct;
-
-typedef struct tagPIDLDATA
-{   PIDLTYPE type;          /*00*/
-    union
-    {
-        struct tagGUIDStruct guid;
-        struct tagDriveStruct drive;
-        struct tagFileStruct file;
-        struct
-        {   WORD dummy;     /*01*/
-            CHAR szNames[1];    /*03*/
-        } network;
-        struct
-        {   WORD dummy;     /*01*/
-            DWORD dummy1;   /*02*/
-            CHAR szName[1]; /*06*/ /* terminated by 0x00 0x00 */
-        } htmlhelp;
-        struct tagPIDLCPanelStruct cpanel;
-        struct tagValueW valueW;
-        struct tagPIDLFontStruct cfont;
-        struct tagPIDLPrinterStruct cprinter;
-        struct tagPIDLRecycleStruct crecycle;
-    } u;
-} PIDLDATA, *LPPIDLDATA;
-#include "poppack.h"
-
-/*
- * getting special values from simple pidls
- */
-DWORD   _ILSimpleGetText    (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize);
-DWORD   _ILSimpleGetTextW   (LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize);
-BOOL    _ILGetFileDate      (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize);
-DWORD   _ILGetFileSize      (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize);
-BOOL    _ILGetExtension     (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize);
-void    _ILGetFileType      (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize);
-DWORD   _ILGetFileAttributes    (LPCITEMIDLIST pidl, LPSTR pOut, UINT 
uOutSize);
-
-BOOL    _ILGetFileDateTime  (LPCITEMIDLIST pidl, FILETIME *ft);
-DWORD   _ILGetDrive     (LPCITEMIDLIST, LPSTR, UINT);
-
-/*
- * testing simple pidls
- */
-BOOL    _ILIsUnicode        (LPCITEMIDLIST pidl);
-BOOL    _ILIsDesktop        (LPCITEMIDLIST pidl);
-BOOL    _ILIsMyComputer     (LPCITEMIDLIST pidl);
-BOOL    _ILIsPrinter        (LPCITEMIDLIST pidl);
-BOOL    _ILIsMyDocuments       (LPCITEMIDLIST pidl);
-BOOL    _ILIsControlPanel       (LPCITEMIDLIST pidl);
-BOOL    _ILIsBitBucket      (LPCITEMIDLIST pidl);
-BOOL    _ILIsAdminTools (LPCITEMIDLIST pidl);
-BOOL    _ILIsNetHood      (LPCITEMIDLIST pidl);
-BOOL    _ILIsDrive      (LPCITEMIDLIST pidl);
-BOOL    _ILIsFolder     (LPCITEMIDLIST pidl);
-BOOL    _ILIsValue      (LPCITEMIDLIST pidl);
-BOOL    _ILIsSpecialFolder  (LPCITEMIDLIST pidl);
-BOOL    _ILIsPidlSimple     (LPCITEMIDLIST pidl);
-BOOL    _ILIsCPanelStruct   (LPCITEMIDLIST pidl);
-static __inline
-BOOL    _ILIsEqualSimple        (LPCITEMIDLIST pidlA, LPCITEMIDLIST pidlB)
-{
-    return (pidlA->mkid.cb > 0 && !memcmp(pidlA, pidlB, pidlA->mkid.cb)) ||
-            (!pidlA->mkid.cb && !pidlB->mkid.cb);
-}
-static __inline
-BOOL    _ILIsEmpty              (LPCITEMIDLIST pidl) { return 
_ILIsDesktop(pidl); }
-
-/*
- * simple pidls
- */
-
-/* Creates a PIDL with guid format and type type, which must be one of PT_GUID,
- * PT_SHELLEXT, or PT_YAGUID.
- */
-LPITEMIDLIST    _ILCreateGuid(PIDLTYPE type, REFIID guid);
-
-/* Like _ILCreateGuid, but using the string szGUID. */
-LPITEMIDLIST    _ILCreateGuidFromStrA(LPCSTR szGUID);
-LPITEMIDLIST    _ILCreateGuidFromStrW(LPCWSTR szGUID);
-
-/* Commonly used PIDLs representing file system objects. */
-LPITEMIDLIST    _ILCreateDesktop    (void);
-LPITEMIDLIST    _ILCreateFromFindDataW(const WIN32_FIND_DATAW *stffile);
-HRESULT     _ILCreateFromPathW  (LPCWSTR szPath, LPITEMIDLIST* ppidl);
-
-/* Other helpers */
-LPITEMIDLIST    _ILCreateMyComputer (void);
-LPITEMIDLIST    _ILCreateMyDocuments    (void);
-LPITEMIDLIST    _ILCreateIExplore   (void);
-LPITEMIDLIST    _ILCreateControlPanel   (void);
-LPITEMIDLIST    _ILCreatePrinters   (void);
-LPITEMIDLIST    _ILCreateNetwork    (void);
-LPITEMIDLIST    _ILCreateNetHood    (void);
-LPITEMIDLIST    _ILCreateAdminTools (void);
-LPITEMIDLIST    _ILCreateFont       (void);
-LPITEMIDLIST    _ILCreateBitBucket  (void);
-LPITEMIDLIST    _ILCreateDrive      (LPCWSTR);
-
-/*
- * helper functions (getting struct-pointer)
- */
-LPPIDLDATA  _ILGetDataPointer   (LPCITEMIDLIST);
-LPSTR       _ILGetTextPointer   (LPCITEMIDLIST);
-IID     *_ILGetGUIDPointer  (LPCITEMIDLIST pidl);
-FileStructW     *_ILGetFileStructW      (LPCITEMIDLIST pidl);
-
-/*
- * debug helper
- */
-void    pdump   (LPCITEMIDLIST pidl);
-BOOL    pcheck  (LPCITEMIDLIST pidl);
-
-/*
- * aPidl helper
- */
-void _ILFreeaPidl(LPITEMIDLIST * apidl, UINT cidl);
-LPITEMIDLIST * _ILCopyaPidl(const LPCITEMIDLIST * apidlsrc, UINT cidl);
-LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, const CIDA * cida);
-
-BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR 
path, DWORD type);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* __WINE_PIDL_H */

Modified: branches/shell-experiments/dll/win32/shell32/precomp.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/precomp.h?rev=65233&r1=65232&r2=65233&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/precomp.h      [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/precomp.h      [iso-8859-1] 
Mon Nov  3 19:50:36 2014
@@ -34,7 +34,7 @@
 
 //#include "base/shell/explorer-new/todo.h"
 //#include "dlgs.h"
-#include "pidl.h"
+#include "wine/pidl.h"
 #include "debughlp.h"
 #include "undocshell.h"
 #include "wine/shell32_main.h"

Copied: branches/shell-experiments/dll/win32/shell32/wine/pidl.c (from r65228, 
branches/shell-experiments/dll/win32/shell32/pidl.cpp)
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/wine/pidl.c?p2=branches/shell-experiments/dll/win32/shell32/wine/pidl.c&p1=branches/shell-experiments/dll/win32/shell32/pidl.cpp&r1=65228&r2=65233&rev=65233&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/pidl.cpp       [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/wine/pidl.c    [iso-8859-1] 
Mon Nov  3 19:50:36 2014
@@ -22,7 +22,25 @@
  *
  */
 
-#include "precomp.h"
+#include <wine/config.h>
+
+#define WIN32_NO_STATUS
+#define _INC_WINDOWS
+#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include <windef.h>
+#include <winbase.h>
+#include <shlobj.h>
+#include <undocshell.h>
+#include <shlwapi.h>
+#include <shlguid_undoc.h>
+#include <wine/debug.h>
+
+#include "pidl.h"
+#include "shell32_main.h"
+#include "shresdef.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(pidl);
 WINE_DECLARE_DEBUG_CHANNEL(shell);
@@ -70,8 +88,7 @@
 
 BOOL WINAPI ILGetDisplayNameExW(IShellFolder * psf, LPCITEMIDLIST pidl, LPWSTR 
path, DWORD type)
 {
-    CComPtr<IShellFolder>        psfParent;
-    CComPtr<IShellFolder> lsf = psf;
+    LPSHELLFOLDER psfParent, lsf = psf;
     HRESULT ret = NO_ERROR;
     LPCITEMIDLIST pidllast;
     STRRET strret;
@@ -109,7 +126,7 @@
         }
         if (!*(const WORD*)pidl || type == ILGDN_FORPARSING)
         {
-            ret = lsf->GetDisplayNameOf(pidl, flag, &strret);
+            ret = IShellFolder_GetDisplayNameOf(lsf, pidl, flag, &strret);
             if (SUCCEEDED(ret))
             {
                 if(!StrRetToStrNW(path, MAX_PATH, &strret, pidl))
@@ -118,10 +135,10 @@
         }
         else
         {
-            ret = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfParent), 
&pidllast);
+            ret = SHBindToParent(pidl, &IID_IShellFolder, (LPVOID*)&psfParent, 
&pidllast);
             if (SUCCEEDED(ret))
             {
-                ret = psfParent->GetDisplayNameOf(pidllast, flag, &strret);
+                ret = IShellFolder_GetDisplayNameOf(psfParent, pidllast, flag, 
&strret);
                 if (SUCCEEDED(ret))
                 {
                     if(!StrRetToStrNW(path, MAX_PATH, &strret, pidllast))
@@ -273,15 +290,15 @@
     SHFree(*ppPidl);
     *ppPidl = NULL;
 
-    pStream->AddRef ();
-
-    if (SUCCEEDED(pStream->Read(&wLen, 2, &dwBytesRead)))
+    IStream_AddRef (pStream);
+
+    if (SUCCEEDED(IStream_Read(pStream, &wLen, 2, &dwBytesRead)))
     {
         TRACE("PIDL length is %d\n", wLen);
         if (wLen != 0)
         {
-            *ppPidl = (LPITEMIDLIST)SHAlloc(wLen);
-            if (SUCCEEDED(pStream->Read(*ppPidl , wLen, &dwBytesRead)))
+            *ppPidl = SHAlloc (wLen);
+            if (SUCCEEDED(IStream_Read(pStream, *ppPidl , wLen, &dwBytesRead)))
             {
                 TRACE("Stream read OK\n");
                 ret = S_OK;
@@ -308,7 +325,7 @@
         *ppPidl = NULL;
     }
 
-    pStream->Release ();
+    IStream_Release (pStream);
     TRACE("done\n");
     return ret;
 }
@@ -326,16 +343,16 @@
 
     TRACE_(shell)("%p %p\n", pStream, pPidl);
 
-    pStream->AddRef ();
+    IStream_AddRef (pStream);
 
     wLen = ILGetSize(pPidl);
 
-    if (SUCCEEDED(pStream->Write(&wLen, 2, NULL)))
-    {
-        if (SUCCEEDED(pStream->Write(pPidl, wLen, NULL)))
+    if (SUCCEEDED(IStream_Write(pStream, &wLen, 2, NULL)))
+    {
+        if (SUCCEEDED(IStream_Write(pStream, pPidl, wLen, NULL)))
             ret = S_OK;
     }
-    pStream->Release ();
+    IStream_Release (pStream);
 
     return ret;
 }
@@ -371,14 +388,14 @@
 
 HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * 
attributes)
 {
-    CComPtr<IShellFolder>        sf;
+    LPSHELLFOLDER sf;
     DWORD pchEaten;
     HRESULT ret = E_FAIL;
 
     TRACE_(shell)("%s %p 0x%08x\n", debugstr_w(path), ppidl, attributes ? 
*attributes : 0);
 
     if (SUCCEEDED (SHGetDesktopFolder(&sf)))
-        ret = sf->ParseDisplayName(0, NULL, (LPWSTR)path, &pchEaten, ppidl, 
attributes);
+        ret = IShellFolder_ParseDisplayName(sf, 0, NULL, (LPWSTR)path, 
&pchEaten, ppidl, attributes);
     return ret;
 }
 
@@ -681,10 +698,11 @@
  */
 HRESULT WINAPI SHGetRealIDL(IShellFolder * lpsf, LPCITEMIDLIST pidlSimple, 
LPITEMIDLIST *pidlReal)
 {
-    CComPtr<IDataObject>        pDataObj;
+    IDataObject* pDataObj;
     HRESULT hr;
 
-    hr = lpsf->GetUIObjectOf(0, 1, &pidlSimple, IID_NULL_PPV_ARG(IDataObject, 
&pDataObj));
+    hr = IShellFolder_GetUIObjectOf(lpsf, 0, 1, &pidlSimple,
+                             &IID_IDataObject, 0, (LPVOID*)&pDataObj);
     if (SUCCEEDED(hr))
     {
         STGMEDIUM medium;
@@ -696,12 +714,12 @@
         fmt.lindex = -1;
         fmt.tymed = TYMED_HGLOBAL;
 
-        hr = pDataObj->GetData(&fmt, &medium);
+        hr = IDataObject_GetData(pDataObj, &fmt, &medium);
 
         if (SUCCEEDED(hr))
         {
             /*assert(pida->cidl==1);*/
-            LPIDA pida = (LPIDA)GlobalLock(medium.hGlobal);
+            LPIDA pida = (LPIDA)GlobalLock(medium.u.hGlobal);
 
             LPCITEMIDLIST pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida + 
pida->aoffset[0]);
             LPCITEMIDLIST pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida + 
pida->aoffset[1]);
@@ -711,8 +729,8 @@
             if (!*pidlReal)
                 hr = E_OUTOFMEMORY;
 
-            GlobalUnlock(medium.hGlobal);
-            GlobalFree(medium.hGlobal);
+            GlobalUnlock(medium.u.hGlobal);
+            GlobalFree(medium.u.hGlobal);
         }
     }
 
@@ -966,8 +984,8 @@
 static HRESULT _ILParsePathW(LPCWSTR path, LPWIN32_FIND_DATAW lpFindFile,
                              BOOL bBindCtx, LPITEMIDLIST *ppidl, LPDWORD 
prgfInOut)
 {
-    CComPtr<IShellFolder>    pSF;
-    CComPtr<IBindCtx>        pBC;
+    LPSHELLFOLDER pSF = NULL;
+    LPBC pBC = NULL;
     HRESULT ret;
 
     TRACE("%s %p %d (%p)->%p (%p)->0x%x\n", debugstr_w(path), lpFindFile, 
bBindCtx,
@@ -983,7 +1001,7 @@
 
     if (SUCCEEDED(ret))
     {
-        ret = pSF->ParseDisplayName(0, pBC, (LPOLESTR)path, NULL, ppidl, 
prgfInOut);
+        ret = IShellFolder_ParseDisplayName(pSF, 0, pBC, (LPOLESTR)path, NULL, 
ppidl, prgfInOut);
     }
 
     if (FAILED(ret) && ppidl)
@@ -1209,7 +1227,7 @@
 {
     HRESULT hr;
     LPCITEMIDLIST pidlLast;
-    CComPtr<IShellFolder>        psfFolder;
+    LPSHELLFOLDER psfFolder;
     DWORD dwAttributes;
     STRRET strret;
 
@@ -1220,7 +1238,7 @@
     if (!pidl)
         return FALSE;
 
-    hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfFolder), 
&pidlLast);
+    hr = SHBindToParent(pidl, &IID_IShellFolder, (VOID**)&psfFolder, 
&pidlLast);
     if (FAILED(hr))
     {
         ERR("SHBindToParent failed: %x\n", hr);
@@ -1228,14 +1246,14 @@
     }
 
     dwAttributes = SFGAO_FILESYSTEM;
-    hr = psfFolder->GetAttributesOf(1, &pidlLast, &dwAttributes);
+    hr = IShellFolder_GetAttributesOf(psfFolder, 1, &pidlLast, &dwAttributes);
     if (FAILED(hr) || !(dwAttributes & SFGAO_FILESYSTEM))
     {
         WARN("Wrong dwAttributes or GetAttributesOf failed: %x\n", hr);
         return FALSE;
     }
 
-    hr = psfFolder->GetDisplayNameOf(pidlLast, SHGDN_FORPARSING, &strret);
+    hr = IShellFolder_GetDisplayNameOf(psfFolder, pidlLast, SHGDN_FORPARSING, 
&strret);
     if (FAILED(hr)) return FALSE;
 
     hr = StrRetToBufW(&strret, pidlLast, pszPath, MAX_PATH);
@@ -1249,8 +1267,8 @@
  */
 HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, 
LPCITEMIDLIST *ppidlLast)
 {
-    CComPtr<IShellFolder>        psfDesktop;
-    HRESULT         hr = E_FAIL;
+    IShellFolder    * psfDesktop;
+    HRESULT         hr=E_FAIL;
 
     TRACE_(shell)("pidl=%p\n", pidl);
     pdump(pidl);
@@ -1269,13 +1287,13 @@
     if (_ILIsPidlSimple(pidl))
     {
         /* we are on desktop level */
-        hr = psfDesktop->QueryInterface(riid, ppv);
+        hr = IShellFolder_QueryInterface(psfDesktop, riid, ppv);
     }
     else
     {
         LPITEMIDLIST pidlParent = ILClone(pidl);
         ILRemoveLastID(pidlParent);
-        hr = psfDesktop->BindToObject(pidlParent, NULL, riid, ppv);
+        hr = IShellFolder_BindToObject(psfDesktop, pidlParent, NULL, riid, 
ppv);
         SHFree (pidlParent);
     }
 
@@ -1341,29 +1359,29 @@
 LPITEMIDLIST _ILCreateMyComputer(void)
 {
     TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_MyComputer);
+    return _ILCreateGuid(PT_GUID, &CLSID_MyComputer);
 }
 
 LPITEMIDLIST _ILCreateMyDocuments(void)
 {
     TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_MyDocuments);
+    return _ILCreateGuid(PT_GUID, &CLSID_MyDocuments);
 }
 
 LPITEMIDLIST _ILCreateIExplore(void)
 {
     TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_Internet);
+    return _ILCreateGuid(PT_GUID, &CLSID_Internet);
 }
 
 LPITEMIDLIST _ILCreateControlPanel(void)
 {
-    LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, CLSID_MyComputer), ret = NULL;
+    LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = 
NULL;
 
     TRACE("()\n");
     if (parent)
     {
-        LPITEMIDLIST cpl = _ILCreateGuid(PT_SHELLEXT, CLSID_ControlPanel);
+        LPITEMIDLIST cpl = _ILCreateGuid(PT_SHELLEXT, &CLSID_ControlPanel);
 
         if (cpl)
         {
@@ -1377,12 +1395,12 @@
 
 LPITEMIDLIST _ILCreatePrinters(void)
 {
-    LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, CLSID_MyComputer), ret = NULL;
+    LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = 
NULL;
 
     TRACE("()\n");
     if (parent)
     {
-        LPITEMIDLIST printers = _ILCreateGuid(PT_YAGUID, CLSID_Printers);
+        LPITEMIDLIST printers = _ILCreateGuid(PT_YAGUID, &CLSID_Printers);
 
         if (printers)
         {
@@ -1397,19 +1415,19 @@
 LPITEMIDLIST _ILCreateNetwork(void)
 {
     TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_NetworkPlaces);
+    return _ILCreateGuid(PT_GUID, &CLSID_NetworkPlaces);
 }
 
 LPITEMIDLIST _ILCreateBitBucket(void)
 {
     TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_RecycleBin);
+    return _ILCreateGuid(PT_GUID, &CLSID_RecycleBin);
 }
 
 LPITEMIDLIST _ILCreateAdminTools(void)
 {
     TRACE("()\n");
-    return _ILCreateGuid(PT_GUID, CLSID_AdminFolderShortcut); //FIXME
+    return _ILCreateGuid(PT_GUID, &CLSID_AdminFolderShortcut); //FIXME
 }
 
 LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid)
@@ -1423,7 +1441,7 @@
         {
             LPPIDLDATA pData = _ILGetDataPointer(pidlOut);
 
-            pData->u.guid.guid = guid;
+            pData->u.guid.guid = *guid;
             TRACE("-- create GUID-pidl %s\n",
                   debugstr_guid(&(pData->u.guid.guid)));
         }
@@ -1445,7 +1463,7 @@
         ERR("%s is not a GUID\n", szGUID);
         return NULL;
     }
-    return _ILCreateGuid(PT_GUID, iid);
+    return _ILCreateGuid(PT_GUID, &iid);
 }
 
 LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID)
@@ -1457,7 +1475,7 @@
         ERR("%s is not a GUID\n", debugstr_w(szGUID));
         return NULL;
     }
-    return _ILCreateGuid(PT_GUID, iid);
+    return _ILCreateGuid(PT_GUID, &iid);
 }
 
 LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd )
@@ -1609,7 +1627,7 @@
     TRACE("(%p)\n", pidl);
 
     if (iid)
-        return IsEqualIID(*iid, CLSID_MyDocuments);
+        return IsEqualIID(iid, &CLSID_MyDocuments);
     return FALSE;
 }
 
@@ -1620,7 +1638,7 @@
     TRACE("(%p)\n", pidl);
 
     if (iid)
-        return IsEqualIID(*iid, CLSID_ControlPanel);
+        return IsEqualIID(iid, &CLSID_ControlPanel);
     return FALSE;
 }
 
@@ -1631,19 +1649,19 @@
     TRACE("(%p)\n", pidl);
 
     if (iid)
-        return IsEqualIID(*iid, CLSID_NetworkPlaces);
+        return IsEqualIID(iid, &CLSID_NetworkPlaces);
     return FALSE;
 }
 
 
 LPITEMIDLIST _ILCreateNetHood(void)
 {
-    return _ILCreateGuid(PT_GUID, CLSID_NetworkPlaces);
+    return _ILCreateGuid(PT_GUID, &CLSID_NetworkPlaces);
 }
 
 LPITEMIDLIST _ILCreateFont(void)
 {
-    return _ILCreateGuid(PT_GUID, CLSID_FontsFolderShortcut);
+    return _ILCreateGuid(PT_GUID, &CLSID_FontsFolderShortcut);
 }
 
 BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
@@ -1653,7 +1671,7 @@
     TRACE("(%p)\n", pidl);
 
     if (iid)
-        return IsEqualIID(*iid, CLSID_MyComputer);
+        return IsEqualIID(iid, &CLSID_MyComputer);
     return FALSE;
 }
 
@@ -1664,7 +1682,7 @@
     TRACE("(%p)\n", pidl);
 
     if (iid)
-        return IsEqualIID(*iid, CLSID_Printers);
+        return IsEqualIID(iid, &CLSID_Printers);
     return FALSE;
 }
 
@@ -1675,7 +1693,7 @@
     TRACE("(%p)\n", pidl);
 
     if (iid)
-        return IsEqualIID(*iid, CLSID_RecycleBin);
+        return IsEqualIID(iid, &CLSID_RecycleBin);
     return FALSE;
 }
 
@@ -1686,7 +1704,7 @@
     TRACE("(%p)\n", pidl);
 
     if (iid)
-        return IsEqualIID(*iid, CLSID_AdminFolderShortcut);
+        return IsEqualIID(iid, &CLSID_AdminFolderShortcut);
     else
         return FALSE;
 }
@@ -1792,7 +1810,7 @@
     if (_ILIsDesktop(pidl))
     {
         /* desktop */
-        if (HCR_GetClassNameA(CLSID_ShellDesktop, szTemp, MAX_PATH))
+        if (HCR_GetClassNameA(&CLSID_ShellDesktop, szTemp, MAX_PATH))
         {
             if (szOut)
                 lstrcpynA(szOut, szTemp, uOutSize);
@@ -1821,7 +1839,7 @@
     else if (( riid = _ILGetGUIDPointer(pidl) ))
     {
         /* special folder */
-        if (HCR_GetClassNameA(*riid, szTemp, MAX_PATH) )
+        if (HCR_GetClassNameA(riid, szTemp, MAX_PATH) )
         {
             if (szOut)
                 lstrcpynA(szOut, szTemp, uOutSize);
@@ -1871,7 +1889,7 @@
         if (_ILIsDesktop(pidl))
         {
             /* desktop */
-            if (HCR_GetClassNameW(CLSID_ShellDesktop, szTemp, MAX_PATH))
+            if (HCR_GetClassNameW(&CLSID_ShellDesktop, szTemp, MAX_PATH))
             {
                 if (szOut)
                     lstrcpynW(szOut, szTemp, uOutSize);
@@ -1900,7 +1918,7 @@
         else if (( riid = _ILGetGUIDPointer(pidl) ))
         {
             /* special folder */
-            if ( HCR_GetClassNameW(*riid, szTemp, MAX_PATH) )
+            if ( HCR_GetClassNameW(riid, szTemp, MAX_PATH) )
             {
                 if (szOut)
                     lstrcpynW(szOut, szTemp, uOutSize);


Reply via email to