Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt	(révision 70626)
+++ CMakeLists.txt	(copie de travail)
@@ -84,6 +84,6 @@
 set_module_type(shell32 win32dll UNICODE)
 target_link_libraries(shell32 shellmenu shelldesktop atlnew wine uuid recyclebin)
 add_delay_importlibs(shell32 uxtheme ole32 userenv version fmifs)
-add_importlibs(shell32 advapi32 browseui gdi32 user32 powrprof comctl32 comdlg32 shdocvw shlwapi devmgr winspool winmm msvcrt kernel32 ntdll)
+add_importlibs(shell32 advapi32 browseui gdi32 user32 powrprof comctl32 comdlg32 shdocvw shlwapi devmgr winspool winmm msvcrt kernel32 ntdll mpr)
 add_pch(shell32 precomp.h SOURCE)
 add_cd_file(TARGET shell32 DESTINATION reactos/system32 FOR all)
Index: folders/CNetFolder.cpp
===================================================================
--- folders/CNetFolder.cpp	(révision 70626)
+++ folders/CNetFolder.cpp	(copie de travail)
@@ -31,6 +31,21 @@
 *   IShellFolder implementation
 */
 
+class CNetFolderEnum :
+    public CEnumIDListBase
+{
+    public:
+        CNetFolderEnum();
+        ~CNetFolderEnum();
+        HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags);
+        BOOL CreateMyCompEnumList(DWORD dwFlags);
+        BOOL EnumerateRec(LPNETRESOURCE lpNet);
+
+        BEGIN_COM_MAP(CNetFolderEnum)
+        COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
+        END_COM_MAP()
+};
+
 static shvheader NetworkPlacesSFHeader[] = {
     {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},
     {IDS_SHV_COLUMN13, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
@@ -45,6 +60,117 @@
 
 #define NETWORKPLACESSHELLVIEWCOLUMNS 4
 
+CNetFolderEnum::CNetFolderEnum()
+{
+}
+
+CNetFolderEnum::~CNetFolderEnum()
+{
+}
+
+HRESULT WINAPI CNetFolderEnum::Initialize(HWND hwndOwner, DWORD dwFlags)
+{
+    if (CreateMyCompEnumList(dwFlags) == FALSE)
+        return E_FAIL;
+
+    return S_OK;
+}
+
+/**************************************************************************
+ *  CDrivesFolderEnum::CreateMyCompEnumList()
+ */
+
+BOOL CNetFolderEnum::EnumerateRec(LPNETRESOURCE lpNet)
+{
+    BOOL bRet = TRUE;
+    DWORD dRet;
+    HANDLE hEnum;
+    LPNETRESOURCE lpRes;
+    DWORD dSize = 0x1000;
+    DWORD dCount = -1;
+    LPNETRESOURCE lpCur;
+
+    dRet = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, lpNet, &hEnum);
+    if (dRet != WN_SUCCESS)
+    {
+        ERR("WNetOpenEnum() failed: %x\n", dRet);
+        return FALSE;
+    }
+
+    lpRes = (LPNETRESOURCE)CoTaskMemAlloc(dSize);
+    if (!lpRes)
+    {
+        ERR("CoTaskMemAlloc() failed\n");
+        WNetCloseEnum(hEnum);
+        return FALSE;
+    }
+
+    do
+    {
+        dSize = 0x1000;
+        dCount = -1;
+
+        memset(lpRes, 0, dSize);
+        dRet = WNetEnumResource(hEnum, &dCount, lpRes, &dSize);
+        if (dRet == WN_SUCCESS || dRet == WN_MORE_DATA)
+        {
+            lpCur = lpRes;
+            for (; dCount; dCount--)
+            {
+                ERR("lpRemoteName: %S\n", lpCur->lpRemoteName);
+
+                if ((lpCur->dwUsage & RESOURCEUSAGE_CONTAINER) == RESOURCEUSAGE_CONTAINER)
+                {
+                    ERR("Found provider: %S\n", lpCur->lpProvider);
+                    /* Sounds like a WTF hack.... Is Wine doing correct? */
+                    if (!wcscmp(lpCur->lpRemoteName, lpCur->lpProvider))
+                    {
+                        lpCur->lpRemoteName = NULL;
+                    }
+                    EnumerateRec(lpCur);
+                }
+                else
+                {
+                    LPITEMIDLIST pidl;
+
+                    pidl = ILCreateFromPathW(lpCur->lpRemoteName);
+                    if (pidl != NULL)
+                        bRet = AddToEnumList(pidl);
+                    else
+                    {
+                        ERR("ILCreateFromPathW() failed\n");
+                        bRet = FALSE;
+                        break;
+                    }
+                }
+
+                lpCur++;
+            }
+        }
+    } while (dRet != WN_NO_MORE_ENTRIES);
+
+    WNetCloseEnum(hEnum);
+
+    ERR("Done: %u\n", bRet);
+
+    return bRet;
+}
+
+BOOL CNetFolderEnum::CreateMyCompEnumList(DWORD dwFlags)
+{
+    BOOL bRet = TRUE;
+
+    TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags);
+
+    /* enumerate the folders */
+    if (dwFlags & SHCONTF_FOLDERS)
+    {
+        bRet = EnumerateRec(NULL);
+    }
+
+    return bRet;
+}
+
 CNetFolder::CNetFolder()
 {
     pidlRoot = NULL;
@@ -74,22 +200,32 @@
 #ifdef HACKY_UNC_PATHS
     /* FIXME: the code below is an ugly hack */
 
+    ERR("ParseDisplayName(%s)\n", debugstr_w (lpszDisplayName));
+
     /* Can we use a CFSFolder on that path? */
     DWORD attrs = GetFileAttributes(lpszDisplayName);
     if ((attrs & FILE_ATTRIBUTE_DIRECTORY))
     {
+        if (pchEaten)
+            *pchEaten = 0;        /* strange but like the original */
+
         /* YES WE CAN */
 
         /* Create our hacky pidl */
-        int cbData = sizeof(WORD) + sizeof(WCHAR) * (wcslen(lpszDisplayName)+1);
+        DWORD len = wcslen(lpszDisplayName);
+        int cbData =  2 * sizeof(WORD) + sizeof(WCHAR) * (len+1);
         LPITEMIDLIST pidl = (LPITEMIDLIST)SHAlloc(cbData + sizeof(WORD));
         if (!pidl)
             return NULL;
 
-        pidl->mkid.cb = cbData;
-        wcscpy((WCHAR*)&pidl->mkid.abID[0], lpszDisplayName);
-        *(WORD*)((char*)pidl + cbData) = 0;
+        pidl->mkid.cb = cbData - sizeof(DWORD);
+        PWSTR str = (WCHAR*)pidl->mkid.abID;
+        wcscpy(str, lpszDisplayName);
+        str[len] = UNICODE_NULL;
+        ILGetNext(pidl)->mkid.cb = 0;
 
+        ERR("pidl: %p, %s\n", pidl, debugstr_w (lpszDisplayName));
+
         *ppidl = pidl;
         if (pdwAttributes)
             *pdwAttributes = SFGAO_FILESYSTEM | SFGAO_CANLINK | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_FILESYSANCESTOR;
@@ -115,14 +251,7 @@
 */
 HRESULT WINAPI CNetFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
 {
-    TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this,
-          hwndOwner, dwFlags, ppEnumIDList);
-
-    *ppEnumIDList = NULL; //IEnumIDList_Constructor();
-
-    TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-    return S_FALSE;
-    // return (*ppEnumIDList) ? S_OK : E_OUTOFMEMORY;
+    return ShellObjectCreatorInit<CNetFolderEnum>(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
 }
 
 /**************************************************************************
@@ -363,10 +492,16 @@
     else
     {
         LPCWSTR pstr = (LPCWSTR)pidl->mkid.abID;
+
+        ERR("GetDisplayNameOf: %p, %s\n", pidl, debugstr_w (pstr));
+
         pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
         if (!pszName)
             return E_OUTOFMEMORY;
 
+        // HACK! It may start with CLSID_NetworkPlaces?!
+        pstr = wcschr(pstr, '\\');
+
         wcscpy(pszName, pstr);
         strRet->pOleStr = pszName;
         strRet->uType = STRRET_WSTR;
Index: precomp.h
===================================================================
--- precomp.h	(révision 70626)
+++ precomp.h	(copie de travail)
@@ -29,6 +29,7 @@
 #include <atlcom.h>
 #include <atlwin.h>
 #include <powrprof.h>
+#include <winnetwk.h>
 
 #include <comctl32_undoc.h>
 #include <shlguid_undoc.h>
