Commit in reactos/lib/shell32 on MAIN
cpanelfolder.c+1-11.1 -> 1.2
debughlp.c+7-71.1 -> 1.2
enumidlist.c+5-51.3 -> 1.4
folders.c+13-111.2 -> 1.3
pidl.c+182-3001.18 -> 1.19
pidl.h+33-201.4 -> 1.5
shelllink.c+12-121.15 -> 1.16
shellpath.c+182-411.7 -> 1.8
shfldr_desktop.c+3-41.5 -> 1.6
shfldr_mycomp.c+4-41.7 -> 1.8
shlexec.c+1-11.31 -> 1.32
+443-406
11 modified files
Merge latest Wine commits:

Juan Lang <juan_lang@yahoo.com>
Use symbolic constants for magic numbers in SHGetFolderPathW, avoid
doing MultiByteToWideChar on values that don't need it,

Juan Lang <juan_lang@yahoo.com>
Rename PT_MYCOMP to PT_GUID, and the corresponding union member from mycomp to guid.

Martin Fuchs <martin-fuchs@gmx.net>
Resolve shell shortcuts and process ID lists in ShellExecute() functions.

Juan Lang <juan_lang@yahoo.com>
- comment fixes
- improved error checking and conformance with Windows
- remove some spurious error messages

reactos/lib/shell32
cpanelfolder.c 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- cpanelfolder.c	27 Mar 2004 09:08:10 -0000	1.1
+++ cpanelfolder.c	7 Apr 2004 20:41:31 -0000	1.2
@@ -131,7 +131,7 @@
     sf->lpVtblPersistFolder2 = &vt_PersistFolder2;
     sf->lpVtblShellExecuteHookW = &vt_ShellExecuteHookW;
     sf->lpVtblShellExecuteHookA = &vt_ShellExecuteHookA;
-    sf->pidlRoot = _ILCreateControl();	/* my qualified pidl */
+    sf->pidlRoot = _ILCreateControlPanel();	/* my qualified pidl */
     sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_ (sf);
 
     if (!SUCCEEDED(IUnknown_QueryInterface(_IUnknown_(sf), riid, ppv))) {

reactos/lib/shell32
debughlp.c 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- debughlp.c	2 Jan 2004 19:49:45 -0000	1.1
+++ debughlp.c	7 Apr 2004 20:41:31 -0000	1.2
@@ -69,8 +69,8 @@
 	{
 	  switch (pdata->type)
 	  {
-	    case PT_MYCOMP:
-	    case PT_SPECIAL:
+	    case PT_GUID:
+	    case PT_SHELLEXT:
 	      return NULL;
 
 	    case PT_DRIVE:
@@ -128,9 +128,9 @@
 	{
 	  switch (pdata->type)
 	  {
-	    case PT_SPECIAL:
-	    case PT_MYCOMP:
-	      return (REFIID) &(pdata->u.mycomp.guid);
+	    case PT_SHELLEXT:
+	    case PT_GUID:
+	      return (REFIID) &(pdata->u.guid.guid);
 	  }
 	}
 	return NULL;
@@ -230,8 +230,8 @@
           { type   = _dbg_ILGetDataPointer(pidltemp)->type;
             switch (type)
 	    { case PT_DESKTOP:
-	      case PT_MYCOMP:
-	      case PT_SPECIAL:
+	      case PT_GUID:
+	      case PT_SHELLEXT:
 	      case PT_DRIVE:
 	      case PT_DRIVE1:
 	      case PT_DRIVE2:

reactos/lib/shell32
enumidlist.c 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- enumidlist.c	27 Mar 2004 09:08:10 -0000	1.3
+++ enumidlist.c	7 Apr 2004 20:41:31 -0000	1.4
@@ -133,7 +133,7 @@
 	      if( !(dwFlags & SHCONTF_INCLUDEHIDDEN) && (stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ) continue;
 	      if( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, ".."))
 	      {
-		pidl = _ILCreateFolder (&stffile);
+		pidl = _ILCreateFromFindDataA (&stffile);
 		if(pidl && AddToEnumList((IEnumIDList*)This, pidl))
 		{
 		  continue;
@@ -157,7 +157,7 @@
 	      if( !(dwFlags & SHCONTF_INCLUDEHIDDEN) && (stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ) continue;
 	      if(! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
 	      {
-		pidl = _ILCreateValue(&stffile);
+		pidl = _ILCreateFromFindDataA(&stffile);
 		if(pidl && AddToEnumList((IEnumIDList*)This, pidl))
 		{
 		  continue;
@@ -259,7 +259,7 @@
 	break;
 
       if (*name == '{') {
-	LPITEMIDLIST pidl = _ILCreateSpecial(name);
+	LPITEMIDLIST pidl = _ILCreateGuidFromStrA(name);
 
 	if (pidl && AddToEnumList(list, pidl))
 	    ++cnt;
@@ -364,7 +364,7 @@
 	      if(ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL))
 	        break;
 
-	      pidl = _ILCreateSpecial(iid);
+	      pidl = _ILCreateGuidFromStrA(iid);
 
 	      if(pidl)
 	        AddToEnumList((IEnumIDList*)This, pidl);
@@ -435,7 +435,7 @@
 	      if(ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL))
 	        break;
 
-	      pidl = _ILCreateSpecial(iid);
+	      pidl = _ILCreateGuidFromStrA(iid);
 
 	      if(pidl)
 	        AddToEnumList((IEnumIDList*)This, pidl);

reactos/lib/shell32
folders.c 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- folders.c	22 Mar 2004 21:40:12 -0000	1.2
+++ folders.c	7 Apr 2004 20:41:31 -0000	1.3
@@ -186,16 +186,19 @@
 	/* my computer and other shell extensions */
 	else if ((riid = _ILGetGUIDPointer(pSimplePidl)))
 	{
-	  char xriid[50];
+	  static WCHAR fmt[] = { 'C','L','S','I','D','\\','{','%','0','8','l','x',
+       '-','%','0','4','x','-','%','0','4','x','-','%','0','2','x',
+       '%','0','2','x','-','%','0','2','x', '%','0','2','x', '%','0','2','x',
+       '%','0','2','x','%','0','2','x','%','0','2','x','}',0 };
+	  WCHAR xriid[50];
 
-	  sprintf(xriid, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+	  sprintfW(xriid, fmt,
 	          riid->Data1, riid->Data2, riid->Data3,
 	          riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
 	          riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]);
 
-	  if (HCR_GetDefaultIconA(xriid, sTemp, MAX_PATH, &dwNr))
+	  if (HCR_GetDefaultIconW(xriid, szIconFile, cchMax, &dwNr))
 	  {
-	    MultiByteToWideChar(CP_ACP, 0, sTemp, -1, szIconFile, cchMax);
 	    *piIndex = dwNr;
 	  }
 	  else
@@ -207,9 +210,10 @@
 
 	else if (_ILIsDrive (pSimplePidl))
 	{
-	  if (HCR_GetDefaultIconA("Drive", sTemp, MAX_PATH, &dwNr))
+	  static WCHAR drive[] = { 'D','r','i','v','e',0 };
+
+	  if (HCR_GetDefaultIconW(drive, szIconFile, cchMax, &dwNr))
 	  {
-	    MultiByteToWideChar(CP_ACP, 0, sTemp, -1, szIconFile, cchMax);
 	    *piIndex = dwNr;
 	  }
 	  else
@@ -221,11 +225,9 @@
 
 	else if (_ILIsFolder (pSimplePidl))
 	{
-	  if (HCR_GetDefaultIconA("Folder", sTemp, MAX_PATH, &dwNr))
-	  {
-	    MultiByteToWideChar(CP_ACP, 0, sTemp, -1, szIconFile, cchMax);
-	  }
-	  else
+	  static WCHAR folder[] = { 'F','o','l','d','e','r',0 };
+
+	  if (!HCR_GetDefaultIconW(folder, szIconFile, cchMax, &dwNr))
 	  {
 	    lstrcpynW(szIconFile, swShell32Name, cchMax);
 	    dwNr = 3;

reactos/lib/shell32
pidl.c 1.18 -> 1.19
diff -u -r1.18 -r1.19
--- pidl.c	1 Apr 2004 20:10:07 -0000	1.18
+++ pidl.c	7 Apr 2004 20:41:31 -0000	1.19
@@ -278,6 +278,7 @@
 	DWORD		dwBytesRead;
 	HRESULT		ret = E_FAIL;
 
+
 	TRACE_(shell)("%p %p\n", pStream ,  ppPidl);
 
 	if (*ppPidl)
@@ -699,7 +700,7 @@
  *
  * NOTES
  */
-HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEMIDLISTpidlReal)
+HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST *pidlReal)
 {
 	IDataObject* pDataObj;
 	HRESULT hr = IShellFolder_GetUIObjectOf(lpsf, 0, 1, &pidlSimple, &IID_IDataObject, 0, (LPVOID*)&pDataObj);
@@ -1079,98 +1080,6 @@
 }
 
 /*************************************************************************
- * SHGetSpecialFolderLocation		[SHELL32.@]
- *
- * gets the folder locations from the registry and creates a pidl
- * creates missing reg keys and directories
- *
- * PARAMS
- *   hwndOwner [I]
- *   nFolder   [I] CSIDL_xxxxx
- *   ppidl     [O] PIDL of a special folder
- *
- * NOTES
- *   In NT5, SHGetSpecialFolderLocation needs the <winntdir>/Recent
- *   directory. If the directory is missing it returns a x80070002.
- */
-HRESULT WINAPI SHGetSpecialFolderLocation(
-	HWND hwndOwner,
-	INT nFolder,
-	LPITEMIDLIST * ppidl)
-{
-	CHAR		szPath[MAX_PATH];
-	HRESULT		hr = E_INVALIDARG;
-
-	TRACE_(shell)("(%p,0x%x,%p)\n", hwndOwner,nFolder,ppidl);
-
-	if (ppidl)
-	{
-	  *ppidl = NULL;
-	  switch (nFolder)
-	  {
-	    case CSIDL_DESKTOP:
-	      *ppidl = _ILCreateDesktop();
-	      break;
-
-	    case CSIDL_DRIVES:
-	      *ppidl = _ILCreateMyComputer();
-	      break;
-
-	    case CSIDL_NETWORK:
-	      *ppidl = _ILCreateNetwork ();
-	      break;
-
-	    case CSIDL_CONTROLS:
-	      *ppidl = _ILCreateControl ();
-	      break;
-
-	    case CSIDL_FONTS:
-	      FIXME("virtual font folder");		
-	      break;
-
-	    case CSIDL_PRINTERS:
-	      *ppidl = _ILCreatePrinter ();
-	      break;
-
-	    case CSIDL_BITBUCKET:
-	      *ppidl = _ILCreateBitBucket ();
-	      break;
-
-	    default:
-	      if (SHGetSpecialFolderPathA(hwndOwner, szPath, nFolder, TRUE))
-	      {
-		DWORD attributes=0;
-		TRACE_(shell)("Value=%s\n",szPath);
-		hr = SHILCreateFromPathA(szPath, ppidl, &attributes);
-	      }
-	  }
-	  if(*ppidl) hr = NOERROR;
-	}
-
-	TRACE_(shell)("-- (new pidl %p)\n",*ppidl);
-	return hr;
-}
-
-/*************************************************************************
- * SHGetFolderLocation [SHELL32.@]
- *
- * 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 SHGetFolderLocation(
-	HWND hwnd,
-	int csidl,
-	HANDLE hToken,
-	DWORD dwFlags,
-	LPITEMIDLIST *ppidl)
-{
-	FIXME("%p 0x%08x %p 0x%08lx %p\n",
-	 hwnd, csidl, hToken, dwFlags, ppidl);
-	return SHGetSpecialFolderLocation(hwnd, csidl, ppidl);
-}
-
-/*************************************************************************
  * SHGetDataFromIDListA [SHELL32.247]
  *
  * NOTES
@@ -1288,18 +1197,16 @@
  */
 HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize)
 {
-	LPSTR pstr = pszPath;
-	LPSTR end = pszPath + uOutSize;
 	HRESULT hr = S_OK;
 
-	pszPath[0] = '\0';
+        pszPath[0]=0;
 
 	/* One case is a PIDL rooted at desktop level */
 	if (_ILIsValue(pidl) || _ILIsFolder(pidl)) {
-	    hr = SHGetSpecialFolderPathA(0, pstr, CSIDL_DESKTOP, FALSE);
+	    hr = SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOP, FALSE);
 
 	    if (SUCCEEDED(hr))
-		pstr = PathAddBackslashA(pstr);
+		PathAddBackslashA(pszPath);
 	}
 	/* The only other valid case is a item ID list beginning at "My Computer" */
  	else if (_ILIsMyComputer(pidl))
@@ -1308,7 +1215,7 @@
         if (SUCCEEDED(hr)) {
 	    LPSTR txt;
 
-	    while(pidl && pidl->mkid.cb && pstr<end) {
+	    while(pidl && pidl->mkid.cb) {
 		if (_ILIsSpecialFolder(pidl))
 		    {hr = E_INVALIDARG; break;}
 
@@ -1316,11 +1223,13 @@
 		if (!txt)
 		    {hr = E_INVALIDARG; break;}
 
+                if (lstrlenA(txt) > pidl->mkid.cb)
+                    ERR("pidl %p is borked\n",pidl);
+
                 /* make sure there's enough space for the next segment */
-                if (pstr+lstrlenA(txt) >= end)
+                if ( (lstrlenA(txt) + lstrlenA(pszPath)) > uOutSize)
 		    {hr = E_INVALIDARG; break;}
-
-		lstrcpynA(pstr, txt, end-pstr);
+		lstrcatA( pszPath, txt );
 
 		pidl = ILGetNext(pidl);
 		if (!pidl)
@@ -1331,11 +1240,9 @@
 		    break;
 		}
 
-                if (pstr+1 >= end)
+                if( (lstrlenA(pszPath) + 1) > uOutSize)
 		    {hr = E_INVALIDARG; break;}
-
-		pstr = PathAddBackslashA(pstr);
-		if (!pstr)
+		if (!PathAddBackslashA(pszPath))
 		    {hr = E_INVALIDARG; break;}
 	    }
 	} else
@@ -1380,18 +1287,17 @@
  */
 HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
 {
-	LPWSTR pstr = pszPath;
-	LPWSTR end = pszPath + uOutSize;
 	HRESULT hr = S_OK;
+	UINT len;
 
-	pszPath[0] = '\0';
+        pszPath[0]=0;
 
 	/* One case is a PIDL rooted at desktop level */
 	if (_ILIsValue(pidl) || _ILIsFolder(pidl)) {
-	    hr = SHGetSpecialFolderPathW(0, pstr, CSIDL_DESKTOP, FALSE);
+	    hr = SHGetSpecialFolderPathW(0, pszPath, CSIDL_DESKTOP, FALSE);
 
 	    if (SUCCEEDED(hr))
-		pstr = PathAddBackslashW(pstr);
+		PathAddBackslashW(pszPath);
 	}
 	/* The only other valid case is a item ID list beginning at "My Computer" */
  	else if (_ILIsMyComputer(pidl))
@@ -1400,7 +1306,7 @@
         if (SUCCEEDED(hr)) {
 	    LPSTR txt;
 
-	    while(pidl && pidl->mkid.cb && pstr<end) {
+	    while(pidl && pidl->mkid.cb) {
 		if (_ILIsSpecialFolder(pidl))
 		    {hr = E_INVALIDARG; break;}
 
@@ -1408,12 +1314,14 @@
 		if (!txt)
 		    {hr = E_INVALIDARG; break;}
 
-                /* make sure there's enough space for the next segment */
-                if (pstr+lstrlenA(txt) >= end)
+                if (lstrlenA(txt) > pidl->mkid.cb)
+                    ERR("pidl %p is borked\n",pidl);
+		len = MultiByteToWideChar(CP_ACP, 0, txt, -1, NULL, 0);
+                if ( (lstrlenW(pszPath) + len) > uOutSize )
 		    {hr = E_INVALIDARG; break;}
 
-		if (!MultiByteToWideChar(CP_ACP, 0, txt, -1, pstr, uOutSize))
-		    {hr = E_OUTOFMEMORY; break;}
+		MultiByteToWideChar(CP_ACP, 0, txt, -1, 
+                                    &pszPath[lstrlenW(pszPath)], len);
 
 		pidl = ILGetNext(pidl);
 		if (!pidl)
@@ -1424,11 +1332,9 @@
 		    break;
 		}
 
-                if (pstr+1 >= end)
+                if ( (lstrlenW(pszPath) + 1) > uOutSize )
 		    {hr = E_INVALIDARG; break;}
-
-		pstr = PathAddBackslashW(pstr);
-		if (!pstr)
+		if (!PathAddBackslashW(pszPath))
 		    {hr = E_INVALIDARG; break;}
 	    }
 	} else
@@ -1466,7 +1372,6 @@
 
 	if (SHELL_OsIsUnicode())
 	  return SHGetPathFromIDListW(pidl,pszPath);
-
 	return SHGetPathFromIDListA(pidl,pszPath);
 }
 
@@ -1519,11 +1424,10 @@
 	    ILFree (pidlChild);
 
 	  SHFree (pidlParent);
-
-	  if (psf)
-		IShellFolder_Release(psf);
+	  if (psf) IShellFolder_Release(psf);
 	}
 
+
 	TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08lx\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr);
 	return hr;
 }
@@ -1535,119 +1439,169 @@
  *	### 1. section creating pidls ###
  *
  *************************************************************************
- *  _ILCreateDesktop()
- *  _ILCreateIExplore()
- *  _ILCreateMyComputer()
- *  _ILCreateDrive()
- *  _ILCreateFolder()
- *  _ILCreateValue()
  */
 LPITEMIDLIST _ILCreateDesktop()
 {	TRACE("()\n");
-	return _ILCreate(PT_DESKTOP, NULL, 0);
+	return _ILCreateWithTypeAndSize(PT_DESKTOP, 0);
 }
 
 LPITEMIDLIST _ILCreateMyComputer()
 {	TRACE("()\n");
-	return _ILCreate(PT_MYCOMP, &CLSID_MyComputer, sizeof(GUID));
+	return _ILCreateGuid(PT_GUID, &CLSID_MyComputer);
 }
 
 LPITEMIDLIST _ILCreateIExplore()
 {	TRACE("()\n");
-	return _ILCreate(PT_MYCOMP, &CLSID_Internet, sizeof(GUID));
+	return _ILCreateGuid(PT_GUID, &CLSID_Internet);
 }
 
-LPITEMIDLIST _ILCreateControl()
-{	TRACE("()\n");
-	return _ILCreate(PT_SPECIAL, &CLSID_ControlPanel, sizeof(GUID));
+LPITEMIDLIST _ILCreateControlPanel()
+{
+    LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = NULL;
+
+    TRACE("()\n");
+    if (parent)
+    {
+        LPITEMIDLIST cpl = _ILCreateGuid(PT_GUID, &CLSID_ControlPanel);
+
+        if (cpl)
+        {
+            ret = ILCombine(parent, cpl);
+            SHFree(cpl);
+        }
+        SHFree(parent);
+    }
+    return ret;
 }
 
-LPITEMIDLIST _ILCreatePrinter()
-{	TRACE("()\n");
-	return _ILCreate(PT_SPECIAL, &CLSID_Printers, sizeof(GUID));
+LPITEMIDLIST _ILCreatePrinters()
+{
+    LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = NULL;
+
+    TRACE("()\n");
+    if (parent)
+    {
+        LPITEMIDLIST printers = _ILCreateGuid(PT_GUID, &CLSID_ControlPanel);
+
+        if (printers)
+        {
+            ret = ILCombine(parent, printers);
+            SHFree(printers);
+        }
+        SHFree(parent);
+    }
+    return ret;
 }
 
 LPITEMIDLIST _ILCreateNetwork()
 {	TRACE("()\n");
-	return _ILCreate(PT_MYCOMP, &CLSID_NetworkPlaces, sizeof(GUID));
+	return _ILCreateGuid(PT_GUID, &CLSID_NetworkPlaces);
 }
 
 LPITEMIDLIST _ILCreateBitBucket()
 {	TRACE("()\n");
-	return _ILCreate(PT_MYCOMP, &CLSID_RecycleBin, sizeof(GUID));
+	return _ILCreateGuid(PT_GUID, &CLSID_RecycleBin);
 }
 
-LPITEMIDLIST _ILCreateDrive( LPCSTR lpszNew)
-{	char sTemp[4];
-	lstrcpynA (sTemp,lpszNew,4);
-	sTemp[2]='\\';
-	sTemp[3]=0x00;
-	TRACE("(%s)\n",sTemp);
-	return _ILCreate(PT_DRIVE,(LPVOID)&sTemp[0],4);
-}
-
-LPITEMIDLIST _ILCreateFolder( WIN32_FIND_DATAA * stffile )
-{
-	char	buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
-	char *	pbuff = buff;
-	ULONG	len, len1;
-	LPITEMIDLIST pidl;
-
-	TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName);
-
-	/* prepare buffer with both names */
-	len = strlen (stffile->cFileName) + 1;
-	memcpy (pbuff, stffile->cFileName, len);
-	pbuff += len;
+LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid)
+{
+    LPITEMIDLIST pidlOut;
 
-    len1 = strlen (stffile->cAlternateFileName)+1;
-    memcpy (pbuff, stffile->cAlternateFileName, len1);
+    if (type == PT_SHELLEXT || type == PT_GUID)
+    {
+        pidlOut = _ILCreateWithTypeAndSize(type, 2 + 2 + sizeof(GUID));
+        if (pidlOut)
+        {
+            LPPIDLDATA pData = _ILGetDataPointer(pidlOut);
+
+            memcpy(&(pData->u.guid.guid), guid, sizeof(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;
+}
 
-	pidl = _ILCreate(PT_FOLDER, (LPVOID)buff, len + len1);
+LPITEMIDLIST _ILCreateGuidFromStrA(LPCSTR szGUID)
+{
+	IID iid;
 
-	/* set attributes */
-	if (pidl)
+	if (!SUCCEEDED(SHCLSIDFromStringA(szGUID, &iid)))
 	{
-	  LPPIDLDATA pData;
-	  pData = _ILGetDataPointer(pidl);
-	  FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime);
-	  pData->u.folder.dwFileSize = stffile->nFileSizeLow;
-	  pData->u.folder.uFileAttribs = (WORD)stffile->dwFileAttributes;
+	  ERR("%s is not a GUID\n", szGUID);
+	  return NULL;
 	}
+	return _ILCreateGuid(PT_GUID, &iid);
+}
 
-	return pidl;
+LPITEMIDLIST _ILCreateWithTypeAndSize(PIDLTYPE type, UINT size)
+{
+    LPITEMIDLIST pidlOut = NULL, pidlTemp = NULL;
+    LPPIDLDATA   pData;
+
+    if(!(pidlOut = SHAlloc(size + 2))) return NULL;
+    ZeroMemory(pidlOut, size + 2);
+    pidlOut->mkid.cb = size;
+
+    if ((pData = _ILGetDataPointer(pidlOut)))
+        pData->type = type;
+
+    if ((pidlTemp = ILGetNext(pidlOut)))
+        pidlTemp->mkid.cb = 0x00;
+
+    TRACE("-- (pidl=%p, size=%u)\n", pidlOut, size);
+    return pidlOut;
 }
 
-LPITEMIDLIST _ILCreateValue(WIN32_FIND_DATAA * stffile)
+LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA * stffile )
 {
-	char	buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
-	char *	pbuff = buff;
-	ULONG	len, len1;
-	LPITEMIDLIST pidl;
-
-	TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName);
-
-	/* prepare buffer with both names */
-	len = strlen (stffile->cFileName) + 1;
-	memcpy (pbuff, stffile->cFileName, len);
-	pbuff += len;
+    char	buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
+    char *	pbuff = buff;
+    ULONG	len, len1;
+    LPITEMIDLIST pidl;
+    PIDLTYPE type;
+
+    if (!stffile)
+        return NULL;
+
+    TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName);
+
+    /* prepare buffer with both names */
+    len = strlen (stffile->cFileName) + 1;
+    memcpy (pbuff, stffile->cFileName, len);
+    pbuff += len;
 
     len1 = strlen (stffile->cAlternateFileName)+1;
     memcpy (pbuff, stffile->cAlternateFileName, len1);
 
-	pidl = _ILCreate(PT_VALUE, (LPVOID)buff, len + len1);
-
-	/* set attributes */
-	if (pidl)
-	{
-	  LPPIDLDATA pData;
-	  pData = _ILGetDataPointer(pidl);
-	  FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime);
-	  pData->u.folder.dwFileSize = stffile->nFileSizeLow;
-	  pData->u.folder.uFileAttribs = (WORD)stffile->dwFileAttributes;
-	}
+    type = (stffile->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : 
+     PT_VALUE;
+    /* FIXME: magic #s! */
+    if ((pidl = _ILCreateWithTypeAndSize(type, 2 + 12 + len + len1)))
+    {
+        LPPIDLDATA pData;
+        LPSTR pszDest;
 
-	return pidl;
+        /* set attributes */
+        if ((pData = _ILGetDataPointer(pidl)))
+        {
+            pData->type = type;
+            FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime);
+            pData->u.folder.dwFileSize = stffile->nFileSizeLow;
+            pData->u.folder.uFileAttribs = (WORD)stffile->dwFileAttributes;
+        }
+        if ((pszDest = _ILGetTextPointer(pidl)))
+        {
+            memcpy(pszDest, buff, len + len1);
+            TRACE("-- create Value: %s\n",debugstr_a(pszDest));
+        }
+    }
+    return pidl;
 }
 
 LPITEMIDLIST _ILCreateFromPathA(LPCSTR szPath)
@@ -1659,25 +1613,35 @@
 	hFile = FindFirstFileA(szPath, &stffile);
 	if (hFile != INVALID_HANDLE_VALUE) 
 	{
-	  if (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-	    pidl = _ILCreateFolder(&stffile);
-	  else
-	    pidl = _ILCreateValue(&stffile);
+	  pidl = _ILCreateFromFindDataA(&stffile);
 	  FindClose(hFile);
 	}
 	return pidl;
 }
 
-LPITEMIDLIST _ILCreateSpecial(LPCSTR szGUID)
+LPITEMIDLIST _ILCreateDrive( LPCSTR lpszNew)
 {
-	IID iid;
+    char sTemp[4];
+    LPITEMIDLIST pidlOut;
 
-	if (!SUCCEEDED(SHCLSIDFromStringA(szGUID, &iid)))
-	{
-	  ERR("%s is not a GUID\n", szGUID);
-	  return NULL;
-	}
-	return _ILCreate(PT_MYCOMP, &iid, sizeof(IID));
+    sTemp[0]=lpszNew[0];
+    sTemp[1]=':';
+    sTemp[2]='\\';
+    sTemp[3]=0x00;
+    TRACE("(%s)\n",sTemp);
+
+    /* FIXME: magic #s! */
+    if ((pidlOut = _ILCreateWithTypeAndSize(PT_DRIVE, 25)))
+    {
+        LPSTR pszDest;
+
+        if ((pszDest = _ILGetTextPointer(pidlOut)))
+        {
+            memcpy(pszDest, sTemp, sizeof(sTemp));
+            TRACE("-- create Drive: %s\n", debugstr_a(pszDest));
+        }
+    }
+    return pidlOut;
 }
 
 LPITEMIDLIST _ILCreateCPanel(LPCSTR name, LPCSTR displayName, LPCSTR comment, int iconIdx)
@@ -1724,88 +1688,6 @@
 }
 
 /**************************************************************************
- *  _ILCreate()
- *  Creates a new PIDL
- *  type = PT_DESKTOP | PT_DRIVE | PT_FOLDER | PT_VALUE
- *  pIn = data
- *  uInSize = size of data (raw)
- */
-
-LPITEMIDLIST _ILCreate(PIDLTYPE type, LPCVOID pIn, UINT uInSize)
-{
-	LPITEMIDLIST   pidlOut = NULL, pidlTemp = NULL;
-	LPPIDLDATA     pData;
-	UINT           uSize = 0;
-	LPSTR	pszDest;
-
-	TRACE("(0x%02x %p %i)\n",type,pIn,uInSize);
-
-	switch (type)
-	{
-	  case PT_DESKTOP:
-	    uSize = 0;
-	    break;
-	  case PT_SPECIAL:
-	  case PT_MYCOMP:
-	    uSize = 2 + 2 + sizeof(GUID);
-	    break;
-	  case PT_DRIVE:
-	    uSize = 2 + 23;
-	    break;
-	  case PT_FOLDER:
-	  case PT_VALUE:
-	    uSize = 2 + 12 + uInSize;
-	    break;
-	  default:
-	    FIXME("can't create type: 0x%08x\n",type);
-	    return NULL;
-	}
-
-	if(!(pidlOut = SHAlloc(uSize + 2))) return NULL;
-	ZeroMemory(pidlOut, uSize + 2);
-	pidlOut->mkid.cb = uSize;
-
-	switch (type)
-	{
-	  case PT_DESKTOP:
-	    TRACE("- create Desktop\n");
-	    break;
-
-	  case PT_SPECIAL:
-	  case PT_MYCOMP:
-	    pData = _ILGetDataPointer(pidlOut);
-	    pData->type = type;
-	    memcpy(&(pData->u.mycomp.guid), pIn, uInSize);
-	    TRACE("-- create GUID-pidl %s\n", debugstr_guid(&(pData->u.mycomp.guid)));
-	    break;
-
-	  case PT_DRIVE:
-	    pData = _ILGetDataPointer(pidlOut);
-	    pData->type = type;
-	    pszDest = _ILGetTextPointer(pidlOut);
-	    memcpy(pszDest, pIn, uInSize);
-	    TRACE("-- create Drive: %s\n",debugstr_a(pszDest));
-	    break;
-
-	  case PT_FOLDER:
-	  case PT_VALUE:
-	    pData = _ILGetDataPointer(pidlOut);
-	    pData->type = type;
-	    pszDest =  _ILGetTextPointer(pidlOut);
-	    memcpy(pszDest, pIn, uInSize);
-	    TRACE("-- create Value: %s\n",debugstr_a(pszDest));
-	    break;
-	}
-
-	pidlTemp = ILGetNext(pidlOut);
-	if (pidlTemp)
-	  pidlTemp->mkid.cb = 0x00;
-
-	TRACE("-- (pidl=%p, size=%u)\n", pidlOut, uSize);
-	return pidlOut;
-}
-
-/**************************************************************************
  *  _ILGetDrive()
  *
  *  Gets the text for the drive eg. 'c:\'
@@ -1858,7 +1740,7 @@
 {
 	LPPIDLDATA lpPData = _ILGetDataPointer(pidl);
 	TRACE("(%p)\n",pidl);
-	return (pidl && ( (lpPData && (PT_MYCOMP== lpPData->type || PT_SPECIAL== lpPData->type)) ||
+	return (pidl && ( (lpPData && (PT_GUID== lpPData->type || PT_SHELLEXT== lpPData->type)) ||
 			  (pidl && pidl->mkid.cb == 0x00)
 			));
 }
@@ -2024,8 +1906,8 @@
 	{
 	  switch (pdata->type)
 	  {
-	    case PT_MYCOMP:
-	    case PT_SPECIAL:
+	    case PT_GUID:
+	    case PT_SHELLEXT:
 	      return NULL;
 
 	    case PT_DRIVE:
@@ -2060,7 +1942,7 @@
 LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl)
 {/*	TRACE(pidl,"(pidl%p)\n", pidl);*/
 
-	LPPIDLDATA pdata = _ILGetDataPointer(pidl);
+	LPPIDLDATA pdata =_ILGetDataPointer(pidl);
 
 	if (pdata)
 	{
@@ -2087,7 +1969,7 @@
  */
 REFIID _ILGetGUIDPointer(LPCITEMIDLIST pidl)
 {
-	LPPIDLDATA pdata = _ILGetDataPointer(pidl);
+	LPPIDLDATA pdata =_ILGetDataPointer(pidl);
 
 	TRACE("%p\n", pidl);
 
@@ -2096,9 +1978,9 @@
 	  TRACE("pdata->type 0x%04x\n", pdata->type);
 	  switch (pdata->type)
 	  {
-	    case PT_SPECIAL:
-	    case PT_MYCOMP:
-	      return (REFIID) &(pdata->u.mycomp.guid);
+	    case PT_SHELLEXT:
+	    case PT_GUID:
+	      return (REFIID) &(pdata->u.guid.guid);
 
 	    default:
 		TRACE("Unknown pidl type 0x%04x\n", pdata->type);

reactos/lib/shell32
pidl.h 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- pidl.h	9 Jan 2004 00:09:29 -0000	1.4
+++ pidl.h	7 Apr 2004 20:41:31 -0000	1.5
@@ -53,13 +53,13 @@
 *	object        ! first byte /  ! format       ! living space
 *	              ! size
 *	----------------------------------------------------------------
-*	my computer	0x1F/20		mycomp (2)	(usual)
-*	network		0x1F		mycomp
-*	bitbucket	0x1F		mycomp
+*	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		mycomp
+*	shell extension	0x2E		guid
 *	drive		0x2F		drive		(lnk/persistent)
 *	folder/file	0x30		folder/file (1)	(lnk/persistent)
 *	folder		0x31		folder		(usual)
@@ -77,20 +77,20 @@
 *
 * (1) dummy byte is used, attributes are empty
 * (2) IID_MyComputer = 20D04FE0L-3AEA-1069-A2D8-08002B30309D
-* (3) two strings	"workgroup" "microsoft network"
-* (4) one string	"\\sirius"
-* (5) one string	"whole network"
-* (6) one string	"\\sirius\c"
+* (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_DESKTOP	0x00 /* internal */
-#define PT_MYCOMP	0x1F
+#define PT_GUID		0x1F
 #define PT_DRIVE	0x23
 #define PT_DRIVE2	0x25
 #define PT_DRIVE3	0x29
-#define PT_SPECIAL	0x2E
+#define PT_SHELLEXT	0x2E
 #define PT_DRIVE1	0x2F
 #define PT_FOLDER1	0x30
 #define PT_FOLDER	0x31
@@ -123,7 +123,7 @@
 	  { BYTE dummy;			/*01*/
 	    GUID guid;			/*02*/
 	    BYTE dummy1;		/*18*/
-	  } mycomp;
+	  } guid;
 	  struct
 	  { CHAR szDriveName[20];	/*01*/
 	    DWORD dwUnknown;		/*21*/
@@ -136,7 +136,7 @@
 	    WORD uFileTime;		/*08*/
 	    WORD uFileAttribs;		/*10*/
 	    CHAR szNames[1];		/*12*/
-	    /* Here are comming two strings. The first is the long name.
+	    /* Here are coming two strings. The first is the long name.
 	    The second the dos name when needed or just 0x00 */
 	  } file, folder, generic;
 	  struct
@@ -180,22 +180,35 @@
 BOOL	_ILIsCPanelStruct	(LPCITEMIDLIST pidl);
 
 /*
- * simple pidls from strings
+ * simple pidls
  */
-LPITEMIDLIST	_ILCreate	(PIDLTYPE,LPCVOID,UINT);
 
+/* Basic PIDL constructor.  Allocates size + 2 bytes (to include space for the
+ * NULL PIDL terminator), and sets type to type.
+ */
+LPITEMIDLIST	_ILCreateWithTypeAndSize(PIDLTYPE type, UINT size);
+
+/* Creates a PIDL with guid format and type type, which must be either PT_GUID
+ * or PT_SHELLEXT.
+ */
+LPITEMIDLIST	_ILCreateGuid(PIDLTYPE type, REFIID guid);
+
+/* Like _ILCreateGuid, but using the string szGUID. */
+LPITEMIDLIST	_ILCreateGuidFromStrA(LPCSTR szGUID);
+
+/* Commonly used PIDLs representing file system objects. */
 LPITEMIDLIST	_ILCreateDesktop	(void);
+LPITEMIDLIST	_ILCreateFromFindDataA(WIN32_FIND_DATAA *stffile);
+LPITEMIDLIST	_ILCreateFromPathA	(LPCSTR szPath);
+
+/* Other helpers */
 LPITEMIDLIST	_ILCreateMyComputer	(void);
 LPITEMIDLIST	_ILCreateIExplore	(void);
-LPITEMIDLIST	_ILCreateControl	(void);
-LPITEMIDLIST	_ILCreatePrinter	(void);
+LPITEMIDLIST	_ILCreateControlPanel	(void);
+LPITEMIDLIST	_ILCreatePrinters	(void);
 LPITEMIDLIST	_ILCreateNetwork	(void);
 LPITEMIDLIST	_ILCreateBitBucket	(void);
 LPITEMIDLIST	_ILCreateDrive		(LPCSTR);
-LPITEMIDLIST	_ILCreateFolder		(WIN32_FIND_DATAA * stffile);
-LPITEMIDLIST	_ILCreateValue		(WIN32_FIND_DATAA * stffile);
-LPITEMIDLIST	_ILCreateSpecial	(LPCSTR szGUID);
-LPITEMIDLIST	_ILCreateFromPathA	(LPCSTR szPath);
 LPITEMIDLIST	_ILCreateCPanel		(LPCSTR name, LPCSTR displayName, LPCSTR comment, int iconIdx);
 
 /*

reactos/lib/shell32
shelllink.c 1.15 -> 1.16
diff -u -r1.15 -r1.16
--- shelllink.c	5 Apr 2004 21:19:48 -0000	1.15
+++ shelllink.c	7 Apr 2004 20:41:31 -0000	1.16
@@ -24,6 +24,7 @@
  */
 
 #include "config.h"
+#include "wine/port.h"
 
 #include <ctype.h>
 #include <string.h>
@@ -38,7 +39,6 @@
 # include <sys/wait.h>
 #endif
 #include "wine/debug.h"
-#include "wine/port.h"
 #include "winerror.h"
 #include "windef.h"
 #include "winbase.h"
@@ -135,14 +135,14 @@
 	SYSTEMTIME	time2;
 	SYSTEMTIME	time3;
 
-	DWORD		iShowCmd;
-	LPWSTR		sIcoPath;
-	INT		iIcoNdx;
-	LPWSTR		sPath;
-	LPWSTR		sArgs;
-	LPWSTR		sWorkDir;
-	LPWSTR		sDescription;
-	LPWSTR		sPathRel;
+	DWORD         iShowCmd;
+	LPWSTR        sIcoPath;
+	INT           iIcoNdx;
+	LPWSTR        sPath;
+	LPWSTR        sArgs;
+	LPWSTR        sWorkDir;
+	LPWSTR        sDescription;
+	LPWSTR        sPathRel;
 
 	BOOL		bDirty;
 } IShellLinkImpl;
@@ -303,7 +303,7 @@
 
             This->bDirty = FALSE;
         }
-        else
+	else
         {
             DeleteFileW( pszFileName );
             WARN("Failed to create shortcut %s\n", debugstr_w(pszFileName) );
@@ -1808,10 +1808,10 @@
 
     This->sPath = HeapAlloc( GetProcessHeap(), 0,
                              (lstrlenW( buffer )+1) * sizeof (WCHAR) );
-    if ( !This->sPath )
+    if (!This->sPath)
         return E_OUTOFMEMORY;
 
-    lstrcpyW( This->sPath, buffer );
+    lstrcpyW(This->sPath, buffer);
     This->bDirty = TRUE;
 
     return S_OK;

reactos/lib/shell32
shellpath.c 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- shellpath.c	1 Apr 2004 19:14:14 -0000	1.7
+++ shellpath.c	7 Apr 2004 20:41:31 -0000	1.8
@@ -40,6 +40,7 @@
 #include "shlobj.h"
 #include "shell32_main.h"
 #include "undocshell.h"
+#include "pidl.h"
 #include "wine/unicode.h"
 #include "shlwapi.h"
 
@@ -714,6 +715,10 @@
 
 #define HKLM HKEY_LOCAL_MACHINE
 #define HKCU HKEY_CURRENT_USER
+#define HKEY_DISALLOWED    (HKEY)0
+#define HKEY_UNIMPLEMENTED (HKEY)1
+#define HKEY_WINDOWSPATH   (HKEY)2
+#define HKEY_NONEXISTENT   (HKEY)3
 static const CSIDL_DATA CSIDL_Data[] =
 {
     { /* CSIDL_DESKTOP */
@@ -722,14 +727,14 @@
 	"Desktop"
     },
     { /* CSIDL_INTERNET */
-	0, (HKEY)1, /* FIXME */
+	0, HKEY_DISALLOWED,
 	NULL,
 	NULL,
     },
     { /* CSIDL_PROGRAMS */
-	9, HKCU,
-	"Programs",
-	"Start Menu\\Programs"
+	0, HKEY_DISALLOWED,
+	NULL,
+	NULL,
     },
     { /* CSIDL_CONTROLS (.CPL files) */
 	10, HKLM,
@@ -767,9 +772,9 @@
 	"SendTo"
     },
     { /* CSIDL_BITBUCKET - Recycle Bin */
-	0, (HKEY)1, /* FIXME */
+	0, HKEY_DISALLOWED,
+	NULL,
 	NULL,
-	"recycled"
     },
     { /* CSIDL_STARTMENU */
 	9, HKCU,
@@ -777,7 +782,7 @@
 	"Start Menu"
     },
     { /* CSIDL_MYDOCUMENTS */
-	0, (HKEY)1, /* FIXME */
+	0, HKEY_UNIMPLEMENTED, /* FIXME */
 	NULL,
 	NULL
     },
@@ -786,7 +791,7 @@
 	"My Music",
 	"My Documents\\My Music"
     },
-    { /* CSIDL_MYMUSIC */
+    { /* CSIDL_MYVIDEO */
 	1, HKCU,
 	"My Video",
 	"My Documents\\My Video"
@@ -802,14 +807,14 @@
 	"Desktop"
     },
     { /* CSIDL_DRIVES */
-	0, (HKEY)1, /* FIXME */
+	0, HKEY_DISALLOWED,
+	NULL,
 	NULL,
-	"My Computer"
     },
     { /* CSIDL_NETWORK */
-	0, (HKEY)1, /* FIXME */
+	0, HKEY_DISALLOWED,
+	NULL,
 	NULL,
-	"Network Neighborhood"
     },
     { /* CSIDL_NETHOOD */
 	9, HKCU,
@@ -862,12 +867,12 @@
 	"Local Settings\\Application Data",
     },
     { /* CSIDL_ALTSTARTUP */
-	0, (HKEY)1, /* FIXME */
+	0, HKEY_NONEXISTENT,
 	NULL,
 	NULL
     },
     { /* CSIDL_COMMON_ALTSTARTUP */
-	0, (HKEY)1, /* FIXME */
+	0, HKEY_NONEXISTENT,
 	NULL,
 	NULL
     },
@@ -962,22 +967,22 @@
 	"Start Menu\\Programs\\Administrative Tools"
     },
     { /* CSIDL_CONNECTIONS */
-	0, 0, /* FIXME */
+	0, HKEY_DISALLOWED,
 	NULL,
 	NULL
     },
     { /* unassigned 32 */
-	0, 0,
+	0, HKEY_DISALLOWED,
 	NULL,
 	NULL
     },
     { /* unassigned 33 */
-	0, 0,
+	0, HKEY_DISALLOWED,
 	NULL,
 	NULL
     },
     { /* unassigned 34 */
-	0, 0,
+	0, HKEY_DISALLOWED,
 	NULL,
 	NULL
     },
@@ -997,7 +1002,7 @@
 	/*"Documents and Settings\\"*/"All Users\\Documents\\My Video"
     },
     { /* CSIDL_RESOURCES */
-	0, (HKEY)2,
+	0, HKEY_WINDOWSPATH,
 	NULL,
 	"Resources"
     },
@@ -1053,25 +1058,23 @@
 
 	TRACE("%p,%p,csidl=0x%04x\n", hwndOwner,pszPath,csidl);
 
+        if (!pszPath)
+            return E_INVALIDARG;
+
+        *pszPath = '\0';
 	if ((folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) ||
-	    (CSIDL_Data[folder].hRootKey == 0))
-	{
-	    ERR("folder 0x%04lx unknown or not allowed\n", folder);
-	    return E_FAIL;
-	}
-	if (CSIDL_Data[folder].hRootKey == (HKEY)1)
+	    (CSIDL_Data[folder].hRootKey == HKEY_DISALLOWED))
+	    return E_INVALIDARG;
+	if (CSIDL_Data[folder].hRootKey == HKEY_UNIMPLEMENTED)
 	{
 	    FIXME("folder 0x%04lx unknown, please add.\n", folder);
 	    return E_FAIL;
 	}
-
-	dwCsidlFlags = CSIDL_Data[folder].dwFlags;
-	hRootKey = CSIDL_Data[folder].hRootKey;
-	MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szValueName, -1, szValueName, MAX_PATH);
-	MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szDefaultPath, -1, szDefaultPath, MAX_PATH);
+        if (CSIDL_Data[folder].hRootKey == HKEY_NONEXISTENT)
+            return S_FALSE;
 
 	/* Special case for some values that don't exist in registry */
-	if (CSIDL_Data[folder].hRootKey == (HKEY)2)
+	if (CSIDL_Data[folder].hRootKey == HKEY_WINDOWSPATH)
 	{
 	    GetWindowsDirectoryW(pszPath, MAX_PATH);
 	    PathAddBackslashW(pszPath);
@@ -1079,6 +1082,11 @@
 	    return S_OK;
 	}
         
+	dwCsidlFlags = CSIDL_Data[folder].dwFlags;
+	hRootKey = CSIDL_Data[folder].hRootKey;
+	MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szValueName, -1, szValueName, MAX_PATH);
+	MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szDefaultPath, -1, szDefaultPath, MAX_PATH);
+
 	if (dwCsidlFlags & CSIDL_MYFLAG_SHFOLDER)
 	{
 	  /*   user shell folders */
@@ -1203,19 +1211,21 @@
 	DWORD dwFlags,
 	LPSTR pszPath)
 {
-	WCHAR szTemp[MAX_PATH];
-	HRESULT hr;
+    WCHAR szTemp[MAX_PATH];
+    HRESULT hr;
 
-	hr = SHGetFolderPathW(hwndOwner, csidl, hToken, dwFlags, szTemp);
-	if (hr == S_OK)
-	{
-            if (!WideCharToMultiByte( CP_ACP, 0, szTemp, -1, pszPath, MAX_PATH, NULL, NULL ))
-                pszPath[MAX_PATH - 1] = 0;
-        }
+    if (!pszPath)
+        return E_INVALIDARG;
+
+    *pszPath = '\0';
+    hr = SHGetFolderPathW(hwndOwner, csidl, hToken, dwFlags, szTemp);
+    if (SUCCEEDED(hr))
+        WideCharToMultiByte(CP_ACP, 0, szTemp, -1, pszPath, MAX_PATH, NULL,
+         NULL);
 
-	TRACE("%p,%p,csidl=0x%04x\n",hwndOwner,pszPath,csidl);
+    TRACE("%p,%p,csidl=0x%04x\n",hwndOwner,pszPath,csidl);
 
-	return hr;
+    return hr;
 }
 
 /*************************************************************************
@@ -1266,3 +1276,134 @@
 	  return SHGetSpecialFolderPathW (hwndOwner, szPath, csidl, bCreate);
 	return SHGetSpecialFolderPathA (hwndOwner, szPath, csidl, bCreate);
 }
+
+/*************************************************************************
+ * SHGetSpecialFolderLocation		[SHELL32.@]
+ *
+ * gets the folder locations from the registry and creates a pidl
+ * creates missing reg keys and directories
+ *
+ * PARAMS
+ *   hwndOwner [I]
+ *   nFolder   [I] CSIDL_xxxxx
+ *   ppidl     [O] PIDL of a special folder
+ *
+ * NOTES
+ *   In NT5, SHGetSpecialFolderLocation needs the <winntdir>/Recent
+ *   directory. If the directory is missing it returns a x80070002.
+ *   In most cases, this forwards to SHGetSpecialFolderPath, but
+ *   CSIDLs with virtual folders (not real paths) must be handled
+ *   here.
+ */
+HRESULT WINAPI SHGetSpecialFolderLocation(
+	HWND hwndOwner,
+	INT nFolder,
+	LPITEMIDLIST * ppidl)
+{
+    HRESULT hr = E_INVALIDARG;
+
+    TRACE("(%p,0x%x,%p)\n", hwndOwner,nFolder,ppidl);
+
+    if (!ppidl)
+        return E_INVALIDARG;
+
+    *ppidl = NULL;
+    switch (nFolder)
+    {
+        case CSIDL_DESKTOP:
+            *ppidl = _ILCreateDesktop();
+            break;
+
+        case CSIDL_INTERNET:
+            *ppidl = _ILCreateIExplore();
+            break;
+
+        case CSIDL_CONTROLS:
+            *ppidl = _ILCreateControlPanel();
+            break;
+
+        case CSIDL_FONTS:
+            FIXME("virtual font folder");         
+            break;
+
+        case CSIDL_PRINTERS:
+            *ppidl = _ILCreatePrinters();
+            break;
+
+        case CSIDL_BITBUCKET:
+            *ppidl = _ILCreateBitBucket();
+            break;
+
+        case CSIDL_DRIVES:
+            *ppidl = _ILCreateMyComputer();
+            break;
+
+        case CSIDL_NETWORK:
+            *ppidl = _ILCreateNetwork();
+            break;
+
+        case CSIDL_ALTSTARTUP:
+        case CSIDL_COMMON_ALTSTARTUP:
+            hr = E_FAIL;
+            break;
+
+        case CSIDL_COMPUTERSNEARME:
+            hr = E_FAIL;
+            break;
+
+        default:
+        {
+            WCHAR szPath[MAX_PATH];
+
+            if (SHGetSpecialFolderPathW(hwndOwner, szPath, nFolder, TRUE))
+            {
+                DWORD attributes=0;
+
+                TRACE("Value=%s\n", debugstr_w(szPath));
+                hr = SHILCreateFromPathW(szPath, ppidl, &attributes);
+            }
+        }
+    }
+    if(*ppidl)
+        hr = NOERROR;
+
+    TRACE("-- (new pidl %p)\n",*ppidl);
+    return hr;
+}
+
+/*************************************************************************
+ * SHGetFolderLocation [SHELL32.@]
+ *
+ * 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
+ *  Mostly we forward to SHGetSpecialFolderLocation, but a few special cases
+ *  we handle here.
+ */
+HRESULT WINAPI SHGetFolderLocation(
+	HWND hwnd,
+	int csidl,
+	HANDLE hToken,
+	DWORD dwFlags,
+	LPITEMIDLIST *ppidl)
+{
+    HRESULT hr;
+
+    TRACE_(shell)("%p 0x%08x %p 0x%08lx %p\n",
+     hwnd, csidl, hToken, dwFlags, ppidl);
+    
+    if (!ppidl)
+        return E_INVALIDARG;
+
+    switch (csidl)
+    {
+        case CSIDL_ALTSTARTUP:
+        case CSIDL_COMMON_ALTSTARTUP:
+            *ppidl = NULL;
+            hr = S_FALSE;
+            break;
+        default:
+            hr = SHGetSpecialFolderLocation(hwnd, csidl, ppidl);
+    }
+    return hr;
+}

reactos/lib/shell32
shfldr_desktop.c 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- shfldr_desktop.c	21 Jan 2004 20:49:13 -0000	1.5
+++ shfldr_desktop.c	7 Apr 2004 20:41:31 -0000	1.6
@@ -216,7 +216,7 @@
 	szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH);
 	TRACE ("-- element: %s\n", debugstr_w (szElement));
 	SHCLSIDFromStringW (szElement + 2, &clsid);
-	pidlTemp = _ILCreate (PT_MYCOMP, &clsid, sizeof (clsid));
+	pidlTemp = _ILCreateGuid (PT_GUID, &clsid);
     } else if (PathGetDriveNumberW (lpszDisplayName) >= 0) {
 	/* it's a filesystem path with a drive. Let MyComputer parse it */
 	pidlTemp = _ILCreateMyComputer ();
@@ -466,7 +466,7 @@
     GUID const *clsid;
     HRESULT hr = S_OK;
 
-	*szPath = '\0';
+    *szPath = '\0';
 
     TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet);
     pdump (pidl);
@@ -681,5 +681,4 @@
 	ISF_Desktop_fnGetDefaultColumnState,
 	ISF_Desktop_fnGetDetailsEx,
 	ISF_Desktop_fnGetDetailsOf,
-	ISF_Desktop_fnMapColumnToSCID
-};
+	ISF_Desktop_fnMapColumnToSCID};

reactos/lib/shell32
shfldr_mycomp.c 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- shfldr_mycomp.c	23 Jan 2004 21:44:15 -0000	1.7
+++ shfldr_mycomp.c	7 Apr 2004 20:41:31 -0000	1.8
@@ -212,7 +212,7 @@
 	szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH);
 	TRACE ("-- element: %s\n", debugstr_w (szElement));
 	SHCLSIDFromStringW (szElement + 2, &clsid);
-	pidlTemp = _ILCreate (PT_MYCOMP, &clsid, sizeof (clsid));
+	pidlTemp = _ILCreateGuid (PT_GUID, &clsid);
     }
     /* do we have an absolute path name ? */
     else if (PathGetDriveNumberW (lpszDisplayName) >= 0 && lpszDisplayName[2] == (WCHAR) '\\') {
@@ -433,7 +433,7 @@
     ICOM_THIS (IGenericSFImpl, iface);
 
     char szPath[MAX_PATH],
-    szDrive[18];
+      szDrive[18];
     int len = 0;
     BOOL bSimplePidl;
     HRESULT hr = S_OK;
@@ -658,7 +658,7 @@
 
 static ICOM_VTABLE (IShellFolder2) vt_ShellFolder2 =
 {
-	ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+        ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
 	ISF_MyComputer_fnQueryInterface,
 	ISF_MyComputer_fnAddRef,
 	ISF_MyComputer_fnRelease,
@@ -673,7 +673,7 @@
 	ISF_MyComputer_fnGetDisplayNameOf,
 	ISF_MyComputer_fnSetNameOf,
 	/* ShellFolder2 */
-	ISF_MyComputer_fnGetDefaultSearchGUID,
+        ISF_MyComputer_fnGetDefaultSearchGUID,
 	ISF_MyComputer_fnEnumSearches,
 	ISF_MyComputer_fnGetDefaultColumn,
 	ISF_MyComputer_fnGetDefaultColumnState,

reactos/lib/shell32
shlexec.c 1.31 -> 1.32
diff -u -r1.31 -r1.32
--- shlexec.c	5 Apr 2004 21:19:48 -0000	1.31
+++ shlexec.c	7 Apr 2004 20:41:31 -0000	1.32
@@ -230,7 +230,7 @@
 
 /*************************************************************************
  *	SHELL_ResolveShortCutW [Internal]
- *	read shortcut file at 'wcmd' and fill psei with its content
+ *	read shortcut file at 'wcmd'
  */
 static HRESULT SHELL_ResolveShortCutW(LPWSTR wcmd, LPWSTR wargs, LPWSTR wdir, HWND hwnd, LPCWSTR lpVerb, int* pshowcmd, LPITEMIDLIST* ppidl)
 {
CVSspam 0.2.8