Implemented: ILIsEqal, ILFindChild, _ILGetFileDate, _ILGetFileSize.

diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index 676528a..0201c1f 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -140,20 +140,111 @@
  *
  */
 BOOL32 WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
-{	FIXME(pidl,"pidl1=%p pidl2=%p stub\n",pidl1, pidl2);
+{	LPPIDLDATA ppidldata;
+	CHAR * szData1;
+	CHAR * szData2;
+
+	LPITEMIDLIST pidltemp1 = pidl1;
+	LPITEMIDLIST pidltemp2 = pidl2;
+
+	TRACE(pidl,"pidl1=%p pidl2=%p\n",pidl1, pidl2);
+
 	pdump (pidl1);
 	pdump (pidl2);
+
+	if ( (!pidl1) || (!pidl2) )
+	{ return FALSE;
+	}
+
+	if (pidltemp1->mkid.cb && pidltemp2->mkid.cb)
+	{ do
+	  { ppidldata = _ILGetDataPointer(pidltemp1);
+	    szData1 = _ILGetTextPointer(ppidldata->type, ppidldata);
+	    
+	    ppidldata = _ILGetDataPointer(pidltemp2);    
+	    szData2 = _ILGetTextPointer(ppidldata->type, ppidldata);
+
+	    if (strcmp ( szData1, szData2 )!=0 )
+	      return FALSE;
+
+	    pidltemp1 = ILGetNext(pidltemp1);
+	    pidltemp2 = ILGetNext(pidltemp2);
+
+	  } while (pidltemp1->mkid.cb && pidltemp2->mkid.cb);
+	}	
+	if (!pidltemp1->mkid.cb && !pidltemp2->mkid.cb)
+	{ TRACE(shell, "--- equal\n");
+	  return TRUE;
+	}
+
 	return FALSE;
 }
 /*************************************************************************
- * ILFindChild [SHELL32.24]
+ * ILIsParent [SHELL32.23]
  *
  */
-DWORD WINAPI ILFindChild(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2)
-{	FIXME(pidl,"%p %p stub\n",pidl1,pidl2);
+DWORD WINAPI ILIsParent( DWORD x, DWORD y, DWORD z)
+{	FIXME(pidl,"0x%08lx 0x%08lx 0x%08lx stub\n",x,y,z);
+	return 0;
+}
+
+/*************************************************************************
+ * ILFindChild [SHELL32.24]
+ *
+ * NOTES
+ *  Compares elements from pidl1 and pidl2.
+ *  When at least the first element is equal, it gives a pointer
+ *  to the first different element of pidl 2 back.
+ *  Returns 0 if pidl 2 is shorter.
+ */
+LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2)
+{	LPPIDLDATA ppidldata;
+	CHAR * szData1;
+	CHAR * szData2;
+
+	LPITEMIDLIST pidltemp1 = pidl1;
+	LPITEMIDLIST pidltemp2 = pidl2;
+	LPITEMIDLIST ret=NULL;
+
+	TRACE(pidl,"pidl1=%p pidl2=%p\n",pidl1, pidl2);
+
 	pdump (pidl1);
 	pdump (pidl2);
-	return 0;
+
+	if ( !pidl1 || !pidl1->mkid.cb)		/* pidl 1 is desktop (root) */
+	{ TRACE(shell, "--- %p\n", pidl2);
+	  return pidl2;
+	}
+
+	if (pidltemp1->mkid.cb && pidltemp2->mkid.cb)
+	{ do
+	  { ppidldata = _ILGetDataPointer(pidltemp1);
+	    szData1 = _ILGetTextPointer(ppidldata->type, ppidldata);
+	    
+	    ppidldata = _ILGetDataPointer(pidltemp2);    
+	    szData2 = _ILGetTextPointer(ppidldata->type, ppidldata);
+
+	    pidltemp2 = ILGetNext(pidltemp2);	/* points behind the pidl2 */
+
+	    if (strcmp(szData1,szData2) == 0)
+	    { ret = pidltemp2;	/* found equal element */
+	    }
+	    else
+	    { if (ret)		/* different element after equal -> break */
+	      { ret = NULL;
+	        break;
+	      }
+	    }
+	    pidltemp1 = ILGetNext(pidltemp1);
+	  } while (pidltemp1->mkid.cb && pidltemp2->mkid.cb);
+	}	
+
+	if (!pidltemp2->mkid.cb)
+	{ return NULL; /* complete equal or pidl 2 is shorter */
+	}
+
+	TRACE(shell, "--- %p\n", ret);
+	return ret; /* pidl 1 is shorter */
 }
 
 /*************************************************************************
@@ -213,12 +304,11 @@
  *  SHLogILFromFSIL [SHELL32.95]
  *
  * NOTES
- *  might be the prepending of MyComputer to a filesystem pidl (?)
  */
 LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl)
 {	FIXME(pidl,"(pidl=%p)\n",pidl);
 	pdump(pidl);
-	return ILClone(pidl);
+	return 0;
 }
 
 /*************************************************************************
@@ -262,7 +352,7 @@
 LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl)
 {	LPITEMIDLIST nextpidl;
 
-	TRACE(pidl,"(pidl=%p)\n",pidl);
+	/* TRACE(pidl,"(pidl=%p)\n",pidl);*/
 	if(pidl)
 	{ nextpidl = (LPITEMIDLIST)(LPBYTE)(((LPBYTE)pidl) + pidl->mkid.cb);
 	  return nextpidl;
@@ -773,7 +863,7 @@
 /**************************************************************************
  *  _ILGetData(PIDLTYPE, LPCITEMIDLIST, LPVOID, UINT16)
  */
-DWORD WINAPI _ILGetData(PIDLTYPE type, LPCITEMIDLIST pidl, LPVOID pOut, UINT16 uOutSize)
+DWORD WINAPI _ILGetData(PIDLTYPE type, LPCITEMIDLIST pidl, LPVOID pOut, UINT32 uOutSize)
 {	LPPIDLDATA  pData;
 	DWORD       dwReturn=0; 
 	LPSTR	    pszSrc;
@@ -852,7 +942,44 @@
 	}
 	return NULL;
 }
+BOOL32 WINAPI _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize)
+{	LPPIDLDATA pdata =_ILGetDataPointer(pidl);
+	FILETIME ft;
+	SYSTEMTIME time;
 
+	switch (pdata->type)
+	{ case PT_DRIVE:
+	  case PT_MYCOMP:
+	    return FALSE;
+	  case PT_FOLDER:
+	    DosDateTimeToFileTime(pdata->u.folder.uFileDate, pdata->u.folder.uFileTime, &ft);
+	    break;	    
+	  case PT_VALUE:
+	    DosDateTimeToFileTime(pdata->u.file.uFileDate, pdata->u.file.uFileTime, &ft);
+	    break;
+	  default:
+	    return FALSE;
+	}
+	FileTimeToSystemTime (&ft, &time);
+	return GetDateFormat32A(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL,  pOut, uOutSize);
+}
+BOOL32 WINAPI _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize)
+{	LPPIDLDATA pdata =_ILGetDataPointer(pidl);
+	char stemp[20]; /* for filesize */
+	
+	switch (pdata->type)
+	{ case PT_DRIVE:
+	  case PT_MYCOMP:
+	  case PT_FOLDER:
+	    return FALSE;
+	  case PT_VALUE:
+	    break;
+	  default:
+	    return FALSE;
+	}
+	sprintf(stemp,"%lu", pdata->u.file.dwFileSize);
+	return GetNumberFormat32A(LOCALE_USER_DEFAULT, 0, stemp, NULL, pOut, uOutSize);
+}
 /**************************************************************************
  *  IDLList "Item ID List List"
  * 
diff --git a/dlls/shell32/pidl.h b/dlls/shell32/pidl.h
index 9112c2d..eef7014 100644
--- a/dlls/shell32/pidl.h
+++ b/dlls/shell32/pidl.h
@@ -68,8 +68,8 @@
 } PIDLDATA, *LPPIDLDATA;
 #pragma pack(4)
 
-LPITEMIDLIST WINAPI _ILCreateDesktop();
-LPITEMIDLIST WINAPI _ILCreateMyComputer();
+LPITEMIDLIST WINAPI _ILCreateDesktop(void);
+LPITEMIDLIST WINAPI _ILCreateMyComputer(void);
 LPITEMIDLIST WINAPI _ILCreateDrive(LPCSTR);
 LPITEMIDLIST WINAPI _ILCreateFolder(LPCSTR);
 LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR);
@@ -81,7 +81,7 @@
 DWORD WINAPI _ILGetValueText(LPCITEMIDLIST,LPSTR,DWORD);
 DWORD WINAPI _ILGetDataText(LPCITEMIDLIST,LPCITEMIDLIST,LPSTR,DWORD);
 DWORD WINAPI _ILGetPidlPath(LPCITEMIDLIST,LPSTR,DWORD);
-DWORD WINAPI _ILGetData(PIDLTYPE,LPCITEMIDLIST,LPVOID,UINT16);
+DWORD WINAPI _ILGetData(PIDLTYPE,LPCITEMIDLIST,LPVOID,UINT32);
 
 BOOL32 WINAPI _ILIsDesktop(LPCITEMIDLIST);
 BOOL32 WINAPI _ILIsMyComputer(LPCITEMIDLIST);
@@ -93,6 +93,7 @@
 
 LPPIDLDATA WINAPI _ILGetDataPointer(LPCITEMIDLIST);
 LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata);
-
+BOOL32 WINAPI _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize);
+BOOL32 WINAPI _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize);
 void pdump (LPCITEMIDLIST pidl);
 #endif