Complete cleanup, bugfixes.
New: PathStripPath, PathMakeUniqueName, PathStripToRoot,
PathGetShortPath, PathParseIconLocation, PathRemoveExtension,
PathRemoveArgs, PathAppend, PathBuildRoot, PathCanonicalize,
PathFindNextComponent, PathRemoveFileSpec.

diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c
index 00f26f5..1eb7bcc 100644
--- a/dlls/shell32/brsfolder.c
+++ b/dlls/shell32/brsfolder.c
@@ -278,6 +278,6 @@
 	TRACE("(%lx,%s) empty stub!\n", (DWORD)lpbi, lpbi->lpszTitle);
 
 	return (LPITEMIDLIST) DialogBoxParamA( shell32_hInstance,
-			"SHBRSFORFOLDER_MSGBOX", 0,
+			"SHBRSFORFOLDER_MSGBOX",  lpbi->hwndOwner,
 			BrsFolderDlgProc, (INT)lpbi );
 }
diff --git a/dlls/shell32/shellguid.c b/dlls/shell32/shellguid.c
index 3fef58d..49b545d 100644
--- a/dlls/shell32/shellguid.c
+++ b/dlls/shell32/shellguid.c
@@ -8,6 +8,7 @@
  */
 #define INITGUID
 
+#include "shlwapi.h"
 /* #include "shlguid.h" */
 
 /*
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index ab96739..90375e1 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -11,192 +11,813 @@
 #include "winversion.h"
 #include "winreg.h"
 #include "crtdll.h"
-#include "tchar.h"
 
 #include "shlobj.h"
 #include "shell32_main.h"
 #include "windef.h"
 #include "options.h"
+#include "wine/undocshell.h"
+#include "shlwapi.h"
 
 DEFAULT_DEBUG_CHANNEL(shell)
 
-/* Supported protocols for PathIsURL */
-LPSTR SupportedProtocol[] = {"http","https","ftp","gopher","file","mailto",""};
+/*
+	Combining and Constructing paths
+*/
 
 /*************************************************************************
- * PathIsRootA
+ * PathAppendA		[SHLWAPI.@]
+ * 
+ * NOTES
+ *  concat path lpszPath2 onto lpszPath1
+ *
+ * FIXME
+ *  the resulting path is also canonicalized
  */
-BOOL WINAPI PathIsRootA(LPCSTR x)
-{	TRACE("%s\n",x);
-	if (*(x+1)==':' && *(x+2)=='\\')		/* "X:\" */
-	  return 1;
-	if (*x=='\\')		/* "\" */
-	  return 0;
-	if (x[0]=='\\' && x[1]=='\\')		/* UNC "\\<xx>\" */
-	{ int	foundbackslash = 0;
-	  x=x+2;
-	  while (*x)
-	  { if (*x++=='\\')
-	      foundbackslash++;
-	  }
-	  if (foundbackslash<=1)	/* max 1 \ more ... */
-	    return 1;
+LPSTR WINAPI PathAppendA(
+	LPSTR lpszPath1,
+	LPCSTR lpszPath2) 
+{
+	TRACE("%s %s\n",lpszPath1, lpszPath2);
+	while (lpszPath2[0]=='\\') lpszPath2++;
+	return PathCombineA(lpszPath1,lpszPath1,lpszPath2);
+}
+
+/*************************************************************************
+ * PathAppendW		[SHLWAPI.@]
+ */
+LPSTR WINAPI PathAppendW(
+	LPWSTR lpszPath1,
+	LPCWSTR lpszPath2) 
+{
+	FIXME("%s %s\n",debugstr_w(lpszPath1), debugstr_w(lpszPath2));
+	return NULL;
+}
+
+/*************************************************************************
+ * PathAppendAW		[SHELL32.36]
+ */
+LPVOID WINAPI PathAppendAW(
+	LPVOID lpszPath1,
+	LPCVOID lpszPath2)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathAppendW(lpszPath1, lpszPath2);
+	return PathAppendA(lpszPath1, lpszPath2);
+}
+
+/*************************************************************************
+ * PathCombineA		[SHLWAPI.@]
+ * 
+ * NOTES
+ *  if lpszFile='.' skip it
+ *  szDest can be equal to lpszFile. Thats why we use sTemp
+ *
+ * FIXME
+ *  the resulting path is also canonicalized
+ *  If lpszSrcPath2 starts with a backslash it is appended 
+ *  to the root of lpszSrcPath1.
+ */
+LPSTR WINAPI PathCombineA(
+	LPSTR szDest,
+	LPCSTR lpszDir,
+	LPCSTR lpszFile) 
+{
+	char sTemp[MAX_PATH];
+	TRACE("%p %p->%s %p->%s\n",szDest, lpszDir, lpszDir, lpszFile, lpszFile);
+	
+	
+	if (!lpszFile || !lpszFile[0] || (lpszFile[0]=='.' && !lpszFile[1]) ) 
+	{
+	  strcpy(szDest,lpszDir);
+	  return szDest;
 	}
-	return 0;
-}
 
-/*************************************************************************
- * PathIsRootW
- */
-BOOL WINAPI PathIsRootW(LPCWSTR x) 
-{	TRACE("%s\n",debugstr_w(x));
-	if (*(x+1)==':' && *(x+2)=='\\')		/* "X:\" */
-	  return 1;
-	if (*x == (WCHAR) '\\')		/* "\" */
-	  return 0;
-	if (x[0]==(WCHAR)'\\' && x[1]==(WCHAR)'\\')	/* UNC "\\<xx>\" */
-	{ int	foundbackslash = 0;
-	  x=x+2;
-	  while (*x) 
-	  { if (*x++==(WCHAR)'\\')
-	      foundbackslash++;
-	  }
-	  if (foundbackslash<=1)	/* max 1 \ more ... */
-	    return 1;
+	/*  if lpszFile is a complete path don't care about lpszDir */
+	if (PathIsRootA(lpszFile))
+	{
+	  strcpy(szDest,lpszFile);
 	}
-	return 0;
+	else
+	{
+	  strcpy(sTemp,lpszDir);
+	  PathAddBackslashA(sTemp);
+	  strcat(sTemp,lpszFile);
+	  strcpy(szDest,sTemp);
+	}
+	return szDest;
 }
 
 /*************************************************************************
- * PathIsRoot [SHELL32.29]
+ * PathCombineW		 [SHLWAPI.@]
  */
-BOOL WINAPI PathIsRootAW(LPCVOID x) 
-{	if (VERSION_OsIsUnicode())
-	  return PathIsRootW(x);
-	return PathIsRootA(x);
+LPWSTR WINAPI PathCombineW(
+	LPWSTR szDest,
+	LPCWSTR lpszDir,
+	LPCWSTR lpszFile) 
+{
+	WCHAR sTemp[MAX_PATH];
+	TRACE("%p %p->%s %p->%s\n",szDest, lpszDir, debugstr_w(lpszDir),
+			 lpszFile, debugstr_w(lpszFile));
+	
+	
+	if (!lpszFile || !lpszFile[0] || (lpszFile[0]==(WCHAR)'.' && !lpszFile[1]) ) 
+	{
+	  CRTDLL_wcscpy(szDest,lpszDir);
+	  return szDest;
+	}
 
+	/*  if lpszFile is a complete path don't care about lpszDir */
+	if (PathIsRootW(lpszFile))
+	{
+	  CRTDLL_wcscpy(szDest,lpszFile);
+	}
+	else
+	{
+	  CRTDLL_wcscpy(sTemp,lpszDir);
+	  PathAddBackslashW(sTemp);
+	  CRTDLL_wcscat(sTemp,lpszFile);
+	  CRTDLL_wcscpy(szDest,sTemp);
+	}
+	return szDest;
 }
 
 /*************************************************************************
- * PathBuildRootA [SHELL32.30]
+ * PathCombineAW	 [SHELL32.37]
  */
-LPSTR WINAPI PathBuildRootA(LPSTR root,BYTE drive) {
-  TRACE("%p %i\n",root, drive);
-	strcpy(root,"A:\\");
-	root[0]+=drive;
-	return root;
+LPVOID WINAPI PathCombineAW(
+	LPVOID szDest,
+	LPCVOID lpszDir,
+	LPCVOID lpszFile) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathCombineW( szDest, lpszDir, lpszFile );
+	return PathCombineA( szDest, lpszDir, lpszFile );
 }
 
 /*************************************************************************
- * PathFindExtensionA
+ * PathAddBackslashA	[SHLWAPI.@]
  *
  * NOTES
- *     returns pointer to last . in last pathcomponent or at \0.
+ *     append \ if there is none
  */
-LPCSTR WINAPI PathFindExtensionA(LPCSTR path) 
-{	LPCSTR   lastpoint = NULL;
-	TRACE("%p %s\n",path,path);
-	while (*path) 
-	{ if (*path=='\\'||*path==' ')
+LPSTR WINAPI PathAddBackslashA(LPSTR lpszPath)
+{
+	int len;
+	TRACE("%p->%s\n",lpszPath,lpszPath);
+
+	len = strlen(lpszPath);
+	if (len && lpszPath[len-1]!='\\') 
+	{
+	  lpszPath[len]  = '\\';
+	  lpszPath[len+1]= 0x00;
+	  return lpszPath+len+1;
+	}
+	return lpszPath+len;
+}
+
+/*************************************************************************
+ * PathAddBackslashW	[SHLWAPI.@]
+ */
+LPWSTR WINAPI PathAddBackslashW(LPWSTR lpszPath)
+{
+	int len;
+	TRACE("%p->%s\n",lpszPath,debugstr_w(lpszPath));
+
+	len = CRTDLL_wcslen(lpszPath);
+	if (len && lpszPath[len-1]!=(WCHAR)'\\') 
+	{
+	  lpszPath[len]  = (WCHAR)'\\';
+	  lpszPath[len+1]= 0x00;
+	  return lpszPath+len+1;
+	}
+	return lpszPath+len;
+}
+
+/*************************************************************************
+ * PathAddBackslashAW		[SHELL32.32]
+ */
+LPVOID WINAPI PathAddBackslashAW(LPVOID lpszPath)
+{
+	if(VERSION_OsIsUnicode())
+	  return PathAddBackslashW(lpszPath);
+	return PathAddBackslashA(lpszPath);
+}
+
+/*************************************************************************
+ * PathBuildRootA		[SHLWAPI.@]
+ */
+LPSTR WINAPI PathBuildRootA(LPSTR lpszPath, int drive) 
+{
+	TRACE("%p %i\n",lpszPath, drive);
+
+	strcpy(lpszPath,"A:\\");
+	lpszPath[0]+=drive;
+	return lpszPath;
+}
+
+/*************************************************************************
+ * PathBuildRootW		[SHLWAPI.@]
+ */
+LPWSTR WINAPI PathBuildRootW(LPWSTR lpszPath, int drive) 
+{
+	TRACE("%p %i\n",debugstr_w(lpszPath), drive);
+
+	lstrcpyAtoW(lpszPath,"A:\\");
+	lpszPath[0]+=drive;
+	return lpszPath;
+}
+
+/*************************************************************************
+ * PathBuildRootAW		[SHELL32.30]
+ */
+LPVOID WINAPI PathBuildRootAW(LPVOID lpszPath, int drive)
+{
+	if(VERSION_OsIsUnicode())
+	  return PathBuildRootW(lpszPath, drive);
+	return PathBuildRootA(lpszPath, drive);
+}
+
+/*
+	Extracting Component Parts
+*/
+
+/*************************************************************************
+ * PathFindFileNameA	[SHLWAPI.@]
+ */
+LPSTR WINAPI PathFindFileNameA(LPCSTR lpszPath)
+{
+	LPCSTR aslash;
+	aslash = lpszPath;
+
+	TRACE("%s\n",aslash);
+	while (lpszPath[0]) 
+	{
+	  if (((lpszPath[0]=='\\') || (lpszPath[0]==':')) && lpszPath[1] && lpszPath[1]!='\\')
+	      aslash = lpszPath+1;
+	  lpszPath++;
+	}
+	return (LPSTR)aslash;
+
+}
+
+/*************************************************************************
+ * PathFindFileNameW	[SHLWAPI.@]
+ */
+LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
+{
+	LPCWSTR wslash;
+	wslash = lpszPath;
+
+	TRACE("%s\n",debugstr_w(wslash));
+	while (lpszPath[0]) 
+	{
+	  if (((lpszPath[0]=='\\') || (lpszPath[0]==':')) && lpszPath[1] && lpszPath[1]!='\\')
+	    wslash = lpszPath+1;
+	  lpszPath++;
+	}
+	return (LPWSTR)wslash;	
+}
+
+/*************************************************************************
+ * PathFindFileNameAW	[SHELL32.34]
+ */
+LPVOID WINAPI PathFindFileNameAW(LPCVOID lpszPath)
+{
+	if(VERSION_OsIsUnicode())
+	  return PathFindFileNameW(lpszPath);
+	return PathFindFileNameA(lpszPath);
+}
+
+/*************************************************************************
+ * PathFindExtensionA	[SHLWAPI.@]
+ *
+ * NOTES
+ *     returns pointer to last . in last lpszPath component or at \0.
+ */
+
+LPSTR WINAPI PathFindExtensionA(LPCSTR lpszPath) 
+{
+	LPCSTR   lastpoint = NULL;
+
+	TRACE("%p %s\n",lpszPath,lpszPath);
+
+	while (*lpszPath) 
+	{
+	  if (*lpszPath=='\\'||*lpszPath==' ')
 	    lastpoint=NULL;
-	  if (*path=='.')
-	    lastpoint=path;
-	  path++;
+	  if (*lpszPath=='.')
+	    lastpoint=lpszPath;
+	  lpszPath++;
 	}
-	return lastpoint?lastpoint:path;
+	return (LPSTR)(lastpoint?lastpoint:lpszPath);
 }
 
 /*************************************************************************
- * PathFindExtensionW
- *
- * NOTES
- *     returns pointer to last . in last pathcomponent or at \0.
+ * PathFindExtensionW	[SHLWAPI.@]
  */
-LPCWSTR WINAPI PathFindExtensionW(LPCWSTR path) 
-{	LPCWSTR   lastpoint = NULL;
-	TRACE("(%p %s)\n",path,debugstr_w(path));
-	while (*path)
-	{ if (*path==(WCHAR)'\\'||*path==(WCHAR)' ')
+LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath) 
+{
+	LPCWSTR   lastpoint = NULL;
+
+	TRACE("(%p %s)\n",lpszPath,debugstr_w(lpszPath));
+
+	while (*lpszPath)
+	{
+	  if (*lpszPath==(WCHAR)'\\'||*lpszPath==(WCHAR)' ')
 	    lastpoint=NULL;
-	  if (*path==(WCHAR)'.')
-	    lastpoint=path;
-	  path++;
+	  if (*lpszPath==(WCHAR)'.')
+	    lastpoint=lpszPath;
+	  lpszPath++;
 	}
-	return lastpoint?lastpoint:path;
+	return (LPWSTR)(lastpoint?lastpoint:lpszPath);
 }
 
 /*************************************************************************
- * PathFindExtension [SHELL32.31]
+ * PathFindExtensionAW		[SHELL32.31]
+ */
+LPVOID WINAPI PathFindExtensionAW(LPCVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathFindExtensionW(lpszPath);
+	return PathFindExtensionA(lpszPath);
+
+}
+
+/*************************************************************************
+ * PathGetExtensionA		[internal]
  *
  * NOTES
- *     returns pointer to last . in last pathcomponent or at \0.
+ *  exported by ordinal
+ *  return value points to the first char after the dot
  */
-LPCVOID WINAPI PathFindExtensionAW(LPCVOID path) 
-{	if (VERSION_OsIsUnicode())
-	  return PathFindExtensionW(path);
-	return PathFindExtensionA(path);
+LPSTR WINAPI PathGetExtensionA(LPCSTR lpszPath)
+{
+	TRACE("(%s)\n",lpszPath);
 
+	lpszPath = PathFindExtensionA(lpszPath);
+	return (LPSTR)(*lpszPath?(lpszPath+1):lpszPath);
 }
 
 /*************************************************************************
- * PathAddBackslashA
- * 
- * NOTES
- *     append \ if there is none
+ * PathGetExtensionW		[internal]
  */
-LPSTR WINAPI PathAddBackslashA(LPSTR path)
-{	int len;
-	TRACE("%p->%s\n",path,path);
+LPWSTR WINAPI PathGetExtensionW(LPCWSTR lpszPath)
+{
+	TRACE("(%s)\n",debugstr_w(lpszPath));
 
-	len = strlen(path);
-	if (len && path[len-1]!='\\') 
-	{ path[len]  = '\\';
-	  path[len+1]= 0x00;
-	  return path+len+1;
+	lpszPath = PathFindExtensionW(lpszPath);
+	return (LPWSTR)(*lpszPath?(lpszPath+1):lpszPath);
+}
+
+/*************************************************************************
+ * PathGetExtensionAW		[SHELL32.158]
+ */
+LPVOID WINAPI PathGetExtensionAW(LPCVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathGetExtensionW(lpszPath);
+	return PathGetExtensionA(lpszPath);
+}
+
+/*************************************************************************
+ * PathGetArgsA		[SHLWAPI.@]
+ *
+ * NOTES
+ *     look for next arg in string. handle "quoted" strings
+ *     returns pointer to argument *AFTER* the space. Or to the \0.
+ *
+ * FIXME
+ *     quoting by '\'
+ */
+LPSTR WINAPI PathGetArgsA(LPCSTR lpszPath) 
+{
+	BOOL	qflag = FALSE;
+
+	TRACE("%s\n",lpszPath);
+
+	while (*lpszPath) 
+	{
+	  if ((*lpszPath==' ') && !qflag)
+	    return (LPSTR)lpszPath+1;
+	  if (*lpszPath=='"')
+	    qflag=!qflag;
+	  lpszPath++;
 	}
-	return path+len;
+	return (LPSTR)lpszPath;
+
 }
 
 /*************************************************************************
- * PathAddBackslashW
- * 
- * NOTES
- *     append \ if there is none
+ * PathGetArgsW		[SHLWAPI.@]
  */
-LPWSTR WINAPI PathAddBackslashW(LPWSTR path)
-{	int len;
-	TRACE("%p->%s\n",path,debugstr_w(path));
+LPWSTR WINAPI PathGetArgsW(LPCWSTR lpszPath) 
+{
+	BOOL	qflag = FALSE;
 
-	len = CRTDLL_wcslen(path);
-	if (len && path[len-1]!=(WCHAR)'\\') 
-	{ path[len]  = (WCHAR)'\\';
-	  path[len+1]= 0x00;
-	  return path+len+1;
+	TRACE("%s\n",debugstr_w(lpszPath));
+
+	while (*lpszPath) 
+	{
+	  if ((*lpszPath==' ') && !qflag)
+	    return (LPWSTR)lpszPath+1;
+	  if (*lpszPath=='"')
+	    qflag=!qflag;
+	  lpszPath++;
 	}
-	return path+len;
+	return (LPWSTR)lpszPath;
 }
 
 /*************************************************************************
- * PathAddBackslash [SHELL32.32]
+ * PathGetArgsAW	[SHELL32.52]
+ */
+LPVOID WINAPI PathGetArgsAW(LPVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathGetArgsW(lpszPath);
+	return PathGetArgsA(lpszPath);
+}
+
+/*************************************************************************
+ * PathGetDriveNumberA	[SHLWAPI.@]
+ */
+int WINAPI PathGetDriveNumberA(LPCSTR lpszPath)
+{
+	int chr = tolower(lpszPath[0]);
+	
+	TRACE ("%s\n",debugstr_a(lpszPath));
+
+	if (!lpszPath || lpszPath[1]!=':' || chr < 'a' || chr > 'z') return -1;
+	return tolower(lpszPath[0]) - 'a' ;
+}
+
+/*************************************************************************
+ * PathGetDriveNumberW	[SHLWAPI.@]
+ */
+int WINAPI PathGetDriveNumberW(LPCWSTR lpszPath)
+{
+	int chr = towlower(lpszPath[0]);
+	
+	TRACE ("%s\n",debugstr_w(lpszPath));
+
+	if (!lpszPath || lpszPath[1]!=':' || chr < 'a' || chr > 'z') return -1;
+	return tolower(lpszPath[0]) - 'a' ;
+}
+
+/*************************************************************************
+ * PathGetDriveNumber	[SHELL32.57]
+ */
+int WINAPI PathGetDriveNumberAW(LPVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathGetDriveNumberW(lpszPath);
+	return PathGetDriveNumberA(lpszPath);
+}
+
+/*************************************************************************
+ * PathRemoveFileSpecA	[SHLWAPI.@]
  * 
  * NOTES
- *     append \ if there is none
+ *     truncates passed argument to a valid path
+ *     returns if the string was modified or not.
+ *     "\foo\xx\foo"-> "\foo\xx"
+ *     "\" -> "\"
+ *     "a:\foo"	-> "a:\"
  */
-LPVOID WINAPI PathAddBackslashAW(LPVOID path)
-{	if(VERSION_OsIsUnicode())
-	  return PathAddBackslashW(path);
-	return PathAddBackslashA(path);
+BOOL WINAPI PathRemoveFileSpecA(LPSTR lpszPath)
+{
+	LPSTR cutplace;
+
+	TRACE("%s\n",lpszPath);
+
+	if (!lpszPath[0]) return 0;
+
+	cutplace = PathFindFileNameA(lpszPath);
+	if (cutplace)
+	{
+	  *cutplace='\0';
+	  if (PathIsRootA(lpszPath))
+	  {
+	    PathAddBackslashA(lpszPath);
+	  }
+	  else
+	  {
+	    PathRemoveBackslashA(lpszPath);
+	  }
+	  return TRUE;
+	}
+	return FALSE;
 }
 
 /*************************************************************************
- * PathRemoveBlanksA
+ * PathRemoveFileSpecW	[SHLWAPI.@]
+ */
+BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
+{
+	LPWSTR cutplace;
+
+	TRACE("%s\n",debugstr_w(lpszPath));
+
+	if (!lpszPath[0]) return 0;
+	cutplace = PathFindFileNameW(lpszPath);
+	if (cutplace)
+	{
+	  *cutplace='\0';
+	  if (PathIsRootW(lpszPath))
+	  {
+	    PathAddBackslashW(lpszPath);
+	  }
+	  else
+	  {
+	    PathRemoveBackslashW(lpszPath);
+	  }
+	  return TRUE;
+	}
+	return FALSE;
+}
+
+/*************************************************************************
+ * PathRemoveFileSpec [SHELL32.35]
+ */
+BOOL WINAPI PathRemoveFileSpecAW(LPVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathRemoveFileSpecW(lpszPath);
+	return PathRemoveFileSpecA(lpszPath);
+}
+
+/*************************************************************************
+ * PathStripPathA	[SHELLWAPI.@]
+ * 
+ * NOTES
+ *  removes the path from the beginning of a filename
+ */
+void WINAPI PathStripPathA(LPSTR lpszPath)
+{
+	LPSTR lpszFileName = PathFindFileNameA(lpszPath);
+
+	TRACE("%s\n", lpszPath);
+
+	if(lpszFileName)
+	  RtlMoveMemory(lpszPath, lpszFileName, strlen(lpszFileName)); 
+}
+
+/*************************************************************************
+ * PathStripPathW	[SHELLWAPI.@]
+ */
+void WINAPI PathStripPathW(LPWSTR lpszPath)
+{
+	LPWSTR lpszFileName = PathFindFileNameW(lpszPath);
+
+	TRACE("%s\n", debugstr_w(lpszPath));
+	if(lpszFileName)
+	  RtlMoveMemory(lpszPath, lpszFileName, lstrlenW(lpszFileName)*sizeof(WCHAR)); 
+}
+
+/*************************************************************************
+ * PathStripPathAW	[SHELL32.38]
+ */
+void WINAPI PathStripPathAW(LPVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathStripPathW(lpszPath);
+	return PathStripPathA(lpszPath);
+}
+
+/*************************************************************************
+ * PathStripToRootA	[SHLWAPI.@]
+ */
+BOOL WINAPI PathStripToRootA(LPSTR lpszPath)
+{
+	TRACE("%s\n", lpszPath);
+
+	/* X:\ */
+	if (lpszPath[1]==':' && lpszPath[2]=='\\')
+	{
+	  lpszPath[3]='\0';
+	  return TRUE;
+	}
+
+	/* "\" */
+	if (lpszPath[0]=='\\')
+	{
+	  lpszPath[1]='\0';
+	  return TRUE;
+	}
+
+	/* UNC "\\<computer>\<share>" */
+	if (lpszPath[0]=='\\' && lpszPath[1]=='\\')		
+	{
+	  int foundbackslash = 0;
+	  lpszPath += 2;
+	  while (*lpszPath)
+	  {
+	    if (*lpszPath=='\\') foundbackslash++;
+	    if (foundbackslash==2)
+	    {
+	      *lpszPath = '\0';
+	      return TRUE;
+	    }
+	    lpszPath++;
+	  }
+	}
+
+	return FALSE;
+}
+
+/*************************************************************************
+ * PathStripToRootW	[SHLWAPI.@]
+ */
+BOOL WINAPI PathStripToRootW(LPWSTR lpszPath)
+{
+	TRACE("%s\n", debugstr_w(lpszPath));
+
+	/* X:\ */
+	if (lpszPath[1]==':' && lpszPath[2]=='\\')
+	{
+	  lpszPath[3]='\0';
+	  return TRUE;
+	}
+
+	/* "\" */
+	if (lpszPath[0]=='\\')
+	{
+	  lpszPath[1]='\0';
+	  return TRUE;
+	}
+
+	/* UNC "\\<computer>\<share>" */
+	if (lpszPath[0]=='\\' && lpszPath[1]=='\\')		
+	{
+	  int foundbackslash = 0;
+	  lpszPath += 2;
+	  while (*lpszPath)
+	  {
+	    if (*lpszPath=='\\') foundbackslash++;
+	    if (foundbackslash==2)
+	    {
+	      *lpszPath = '\0';
+	      return TRUE;
+	    }
+	    lpszPath++;
+	  }
+	}
+
+	return FALSE;
+}
+
+/*************************************************************************
+ * PathStripToRootAW	[SHELL32.50]
+ */
+BOOL WINAPI PathStripToRootAW(LPVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathStripToRootW(lpszPath);
+	return PathStripToRootA(lpszPath);
+}
+
+/*************************************************************************
+ * PathRemoveArgsA	[SHLWAPI.@]
+ */
+void WINAPI PathRemoveArgsA(LPSTR lpszPath)
+{
+	LPSTR lpszArgs = PathGetArgsA(lpszPath);
+
+	TRACE("%s\n", lpszPath);
+
+	if (lpszArgs) *(--lpszArgs)='\0';
+}
+
+/*************************************************************************
+ * PathRemoveArgsW	[SHLWAPI.@]
+ */
+void WINAPI PathRemoveArgsW(LPWSTR lpszPath)
+{
+	LPWSTR lpszArgs = PathGetArgsW(lpszPath);
+
+	TRACE("%s\n", debugstr_w(lpszPath));
+
+	if (lpszArgs) *(--lpszArgs)='\0';
+}
+
+/*************************************************************************
+ * PathRemoveArgsAW	[SHELL32.251]
+ */
+void WINAPI PathRemoveArgsAW(LPVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathRemoveArgsW(lpszPath);
+	return PathRemoveArgsA(lpszPath);
+}
+
+/*************************************************************************
+ * PathRemoveExtensionA		[SHLWAPI.@]
+ */
+void WINAPI PathRemoveExtensionA(LPSTR lpszPath)
+{
+	LPSTR lpszExtension = PathFindExtensionA(lpszPath);
+
+	TRACE("%s\n", lpszPath);
+
+	if (lpszExtension) *lpszExtension='\0';
+}
+
+/*************************************************************************
+ * PathRemoveExtensionW		[SHLWAPI.@]
+ */
+void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
+{
+	LPWSTR lpszExtension = PathFindExtensionW(lpszPath);
+
+	TRACE("%s\n", debugstr_w(lpszPath));
+
+	if (lpszExtension) *lpszExtension='\0';
+}
+
+/*************************************************************************
+ * PathRemoveExtensionAW	[SHELL32.250]
+ */
+void WINAPI PathRemoveExtensionAW(LPVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathRemoveExtensionW(lpszPath);
+	return PathRemoveExtensionA(lpszPath);
+}
+
+/*************************************************************************
+ * PathRemoveBackslashA	[SHLWAPI.@]
+ *
+ * If the path ends in a backslash it is replaced by a NULL
+ * and the address of the NULL is returned
+ * Otherwise 
+ * the address of the last character is returned.
+ *
+ */
+LPSTR WINAPI PathRemoveBackslashA( LPSTR lpszPath )
+{
+	LPSTR p = lpszPath;
+	
+	while (*lpszPath) p = lpszPath++;
+	if ( *p == (CHAR)'\\') *p = (CHAR)'\0';
+	return p;
+}
+
+/*************************************************************************
+ * PathRemoveBackslashW	[SHLWAPI.@]
+ */
+LPWSTR WINAPI PathRemoveBackslashW( LPWSTR lpszPath )
+{
+	LPWSTR p = lpszPath;
+	
+	while (*lpszPath); p = lpszPath++;
+	if ( *p == (WCHAR)'\\') *p = (WCHAR)'\0';
+	return p;
+}
+
+/*
+	Path Manipulations
+*/
+
+/*************************************************************************
+ * PathGetShortPathA [internal]
+ */
+LPSTR WINAPI PathGetShortPathA(LPSTR lpszPath)
+{
+	FIXME("%s stub\n", lpszPath);
+	return NULL;
+}
+
+/*************************************************************************
+ * PathGetShortPathW [internal]
+ */
+LPWSTR WINAPI PathGetShortPathW(LPWSTR lpszPath)
+{
+	FIXME("%s stub\n", debugstr_w(lpszPath));
+	return NULL;
+}
+
+/*************************************************************************
+ * PathGetShortPathAW [SHELL32.92]
+ */
+LPVOID WINAPI PathGetShortPathAW(LPVOID lpszPath)
+{
+	if(VERSION_OsIsUnicode())
+	  return PathGetShortPathW(lpszPath);
+	return PathGetShortPathA(lpszPath);
+}
+
+/*************************************************************************
+ * PathRemoveBlanksA [SHLWAPI.@]
  * 
  * NOTES
  *     remove spaces from beginning and end of passed string
  */
 LPSTR WINAPI PathRemoveBlanksA(LPSTR str)
-{	LPSTR x = str;
+{
+	LPSTR x = str;
+
 	TRACE("%s\n",str);
+
 	while (*x==' ') x++;
 	if (x!=str)
 	  strcpy(str,x);
@@ -211,14 +832,14 @@
 }
 
 /*************************************************************************
- * PathRemoveBlanksW
- * 
- * NOTES
- *     remove spaces from beginning and end of passed string
+ * PathRemoveBlanksW [SHLWAPI.@]
  */
 LPWSTR WINAPI PathRemoveBlanksW(LPWSTR str)
-{	LPWSTR x = str;
+{
+	LPWSTR x = str;
+
 	TRACE("%s\n",debugstr_w(str));
+
 	while (*x==' ') x++;
 	if (x!=str)
 	  CRTDLL_wcscpy(str,x);
@@ -233,586 +854,57 @@
 }
 
 /*************************************************************************
- * PathRemoveBlanks [SHELL32.33]
- * 
- * NOTES
- *     remove spaces from beginning and end of passed string
+ * PathRemoveBlanksAW [SHELL32.33]
  */
 LPVOID WINAPI PathRemoveBlanksAW(LPVOID str)
-{	if(VERSION_OsIsUnicode())
+{
+	if(VERSION_OsIsUnicode())
 	  return PathRemoveBlanksW(str);
 	return PathRemoveBlanksA(str);
 }
 
 /*************************************************************************
- * PathFindFilenameA
+ * PathQuoteSpacesA [SHLWAPI.@]
  * 
  * NOTES
- *     basename(char *fn);
  */
-LPCSTR WINAPI PathFindFilenameA(LPCSTR aptr)
-{	LPCSTR aslash;
-	aslash = aptr;
-
-	TRACE("%s\n",aslash);
-	while (aptr[0]) 
-	{ if (((aptr[0]=='\\') || (aptr[0]==':')) && aptr[1] && aptr[1]!='\\')
-	      aslash = aptr+1;
-	  aptr++;
-	}
-	return aslash;
-
-}
-
-/*************************************************************************
- * PathFindFilenameW
- * 
- * NOTES
- *     basename(char *fn);
- */
-LPCWSTR WINAPI PathFindFilenameW(LPCWSTR wptr)
-{	LPCWSTR wslash;
-	wslash = wptr;
-
-	TRACE("%s\n",debugstr_w(wslash));
-	while (wptr[0]) 
-	{ if (((wptr[0]=='\\') || (wptr[0]==':')) && wptr[1] && wptr[1]!='\\')
-	    wslash = wptr+1;
-	  wptr++;
-	}
-	return wslash;	
-}
-
-/*************************************************************************
- * PathFindFilename [SHELL32.34]
- * 
- * NOTES
- *     basename(char *fn);
- */
-LPCVOID WINAPI PathFindFilenameAW(LPCVOID fn)
+LPSTR WINAPI PathQuoteSpacesA(LPCSTR lpszPath)
 {
-	if(VERSION_OsIsUnicode())
-	  return PathFindFilenameW(fn);
-	return PathFindFilenameA(fn);
-}
-
-/*************************************************************************
- * PathRemoveFileSpecA [SHELL32.35]
- * 
- * NOTES
- *     bool getpath(char *pathname); truncates passed argument to a valid path
- *     returns if the string was modified or not.
- *     "\foo\xx\foo"-> "\foo\xx"
- *     "\" -> "\"
- *     "a:\foo"	-> "a:\"
- */
-DWORD WINAPI PathRemoveFileSpecA(LPSTR fn) {
-	LPSTR	x,cutplace;
-  TRACE("%s\n",fn);
-	if (!fn[0])
-		return 0;
-	x=fn;
-	cutplace = fn;
-	while (*x) {
-		if (*x=='\\') {
-			cutplace=x++;
-			continue;
-		}
-		if (*x==':') {
-			x++;
-			if (*x=='\\')
-				cutplace=++x;
-			continue; /* already x++ed */
-		}
-		x++;
-	}
-	if (!*cutplace)
-		return 0;
-	if (cutplace==fn) {
-		if (fn[0]=='\\') {
-			if (!fn[1])
-				return 0;
-			fn[0]='\0';
-			return 1;
-		}
-	}
-	*cutplace='\0';
-	return 1;
-}
-
-/*************************************************************************
- * PathAppendA [SHELL32.36]
- * 
- * NOTES
- *     concat_paths(char*target,const char*add);
- *     concats "target\\add" and writes them to target
- */
-LPSTR WINAPI PathAppendA(LPSTR x1,LPSTR x2) {
-  TRACE("%s %s\n",x1,x2);
-  while (x2[0]=='\\') x2++;
-  return PathCombineA(x1,x1,x2);
-}
-
-/*************************************************************************
- * PathCombineA
- * 
- * NOTES
- *  if lpszFile='.' skip it
- *  szDest can be equal to lpszFile. Thats why we use sTemp
- */
-LPSTR WINAPI PathCombineA(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile) 
-{	char sTemp[MAX_PATH];
-	TRACE("%p %p->%s %p->%s\n",szDest, lpszDir, lpszDir, lpszFile, lpszFile);
-	
-	
-	if (!lpszFile || !lpszFile[0] || (lpszFile[0]=='.' && !lpszFile[1]) ) 
-	{ strcpy(szDest,lpszDir);
-	  return szDest;
-	}
-
-	/*  if lpszFile is a complete path don't care about lpszDir */
-	if (PathIsRootA(lpszFile))
-	{ strcpy(szDest,lpszFile);
-	}
-	else
-	{ strcpy(sTemp,lpszDir);
-	  PathAddBackslashA(sTemp);
-	  strcat(sTemp,lpszFile);
-	  strcpy(szDest,sTemp);
-	}
-	return szDest;
-}
-
-/*************************************************************************
- * PathCombineW
- * 
- * NOTES
- *  if lpszFile='.' skip it
- *  szDest can be equal to lpszFile. Thats why we use sTemp
- */
-LPWSTR WINAPI PathCombineW(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile) 
-{	WCHAR sTemp[MAX_PATH];
-	TRACE("%p %p->%s %p->%s\n",szDest, lpszDir, debugstr_w(lpszDir),
-			 lpszFile, debugstr_w(lpszFile));
-	
-	
-	if (!lpszFile || !lpszFile[0] || (lpszFile[0]==(WCHAR)'.' && !lpszFile[1]) ) 
-	{ CRTDLL_wcscpy(szDest,lpszDir);
-	  return szDest;
-	}
-
-	/*  if lpszFile is a complete path don't care about lpszDir */
-	if (PathIsRootW(lpszFile))
-	{ CRTDLL_wcscpy(szDest,lpszFile);
-	}
-	else
-	{ CRTDLL_wcscpy(sTemp,lpszDir);
-	  PathAddBackslashW(sTemp);
-	  CRTDLL_wcscat(sTemp,lpszFile);
-	  CRTDLL_wcscpy(szDest,sTemp);
-	}
-	return szDest;
-}
-
-/*************************************************************************
- * PathCombine [SHELL32.37]
- * 
- * NOTES
- *  if lpszFile='.' skip it
- *  szDest can be equal to lpszFile. Thats why we use sTemp
- */
-LPVOID WINAPI PathCombineAW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile) 
-{	if (VERSION_OsIsUnicode())
-	  return PathCombineW( szDest, lpszDir, lpszFile );
-	return PathCombineA( szDest, lpszDir, lpszFile );
-}
-
-/*************************************************************************
- * PathIsUNCA
- * 
- * NOTES
- *     PathIsUNC(char*path);
- */
-BOOL WINAPI PathIsUNCA(LPCSTR path) 
-{	TRACE("%s\n",path);
-
-	if ((path[0]=='\\') && (path[1]=='\\'))
-	  return TRUE;
-	return FALSE;
-}
-
-/*************************************************************************
- * PathIsUNCW
- * 
- * NOTES
- *     PathIsUNC(char*path);
- */
-BOOL WINAPI PathIsUNCW(LPCWSTR path) 
-{	TRACE("%s\n",debugstr_w(path));
-
-	if ((path[0]=='\\') && (path[1]=='\\'))
-	  return TRUE;
-	return FALSE;
-}
-
-/*************************************************************************
- * PathIsUNC [SHELL32.39]
- * 
- * NOTES
- *     PathIsUNC(char*path);
- */
-BOOL WINAPI PathIsUNCAW (LPCVOID path)
-{	if (VERSION_OsIsUnicode())
-	  return PathIsUNCW( path );
-	return PathIsUNCA( path );  
-}
-
-/*************************************************************************
- *  PathIsRelativeA
- * 
- */
-BOOL WINAPI PathIsRelativeA (LPCSTR path)
-{	TRACE("path=%s\n",path);
-
-	if (path && (path[0]!='\\' && path[1]==':'))
-	  return TRUE;
-	return FALSE;    
-}
-
-/*************************************************************************
- *  PathIsRelativeW
- * 
- */
-BOOL WINAPI PathIsRelativeW (LPCWSTR path)
-{	TRACE("path=%s\n",debugstr_w(path));
-
-	if (path && (path[0]!='\\' && path[1]==':'))
-	  return TRUE;
-	return FALSE;    
-}
-
-/*************************************************************************
- *  PathIsRelative [SHELL32.40]
- * 
- */
-BOOL WINAPI PathIsRelativeAW (LPCVOID path)
-{	if (VERSION_OsIsUnicode())
-	  return PathIsRelativeW( path );
-	return PathIsRelativeA( path );  
-}
-
-/*************************************************************************
- *  PathIsExeA
- * 
- */
-BOOL WINAPI PathIsExeA (LPCSTR path)
-{	FIXME("path=%s\n",path);
-	return FALSE;
-}
-
-/*************************************************************************
- *  PathIsExeW
- * 
- */
-BOOL WINAPI PathIsExeW (LPCWSTR path)
-{	FIXME("path=%s\n",debugstr_w(path));
-	return FALSE;
-}
-
-/*************************************************************************
- *  PathIsExe [SHELL32.43]
- * 
- */
-BOOL WINAPI PathIsExeAW (LPCVOID path)
-{	if (VERSION_OsIsUnicode())
-	  return PathIsExeW (path);
-	return PathIsExeA(path);
-}
-
-/*************************************************************************
- * PathFileExistsA [SHELL32.45]
- * 
- * NOTES
- *     file_exists(char *fn);
- */
-BOOL WINAPI PathFileExistsA(LPSTR fn) {
-  TRACE("%s\n",fn);
-   if (GetFileAttributesA(fn)==-1)
-    	return FALSE;
-    else
-    	return TRUE;
-}
-/*************************************************************************
- * PathMatchSingleMask
- * 
- * NOTES
- *     internal (used by PathMatchSpec)
- */
-static BOOL PathMatchSingleMaskA(LPCSTR name, LPCSTR mask)
-{
-  while (*name && *mask && *mask!=';') {
-    if (*mask=='*') {
-      do {
-	if (PathMatchSingleMaskA(name,mask+1)) return 1;  /* try substrings */
-      } while (*name++);
-      return 0;
-    }
-    if (toupper(*mask)!=toupper(*name) && *mask!='?') return 0;
-    name++;
-    mask++;
-  }
-  if (!*name) {
-    while (*mask=='*') mask++;
-    if (!*mask || *mask==';') return 1;
-  }
-  return 0;
-}
-static BOOL PathMatchSingleMaskW(LPCWSTR name, LPCWSTR mask)
-{
-  while (*name && *mask && *mask!=';') {
-    if (*mask=='*') {
-      do {
-	if (PathMatchSingleMaskW(name,mask+1)) return 1;  /* try substrings */
-      } while (*name++);
-      return 0;
-    }
-    if (towupper(*mask)!=towupper(*name) && *mask!='?') return 0;
-    name++;
-    mask++;
-  }
-  if (!*name) {
-    while (*mask=='*') mask++;
-    if (!*mask || *mask==';') return 1;
-  }
-  return 0;
-}
-
-/*************************************************************************
- * PathMatchSpecA
- * 
- * NOTES
- *     used from COMDLG32
- */
-BOOL WINAPI PathMatchSpecA(LPCSTR name, LPCSTR mask) 
-{
-  TRACE("%s %s\n",name,mask);
-
-  if (!lstrcmpA( mask, "*.*" )) return 1;   /* we don't require a period */
-
-  while (*mask) {
-    if (PathMatchSingleMaskA(name,mask)) return 1;    /* helper function */
-    while (*mask && *mask!=';') mask++;
-    if (*mask==';') {
-      mask++;
-      while (*mask==' ') mask++;      /*  masks may be separated by "; " */
-	  }
-	}
-  return 0;
-}
-
-/*************************************************************************
- * PathMatchSpecW
- * 
- * NOTES
- *     used from COMDLG32
- */
-BOOL WINAPI PathMatchSpecW(LPCWSTR name, LPCWSTR mask) 
-{
-  WCHAR stemp[4];
-  TRACE("%s %s\n",debugstr_w(name),debugstr_w(mask));
-
-	lstrcpyAtoW(stemp,"*.*");	
-  if (!lstrcmpW( mask, stemp )) return 1;   /* we don't require a period */
-
-  while (*mask) {
-    if (PathMatchSingleMaskW(name,mask)) return 1;    /* helper function */
-    while (*mask && *mask!=';') mask++;
-    if (*mask==';') {
-      mask++;
-      while (*mask==' ') mask++;       /* masks may be separated by "; " */
-	  }
-	}
-  return 0;
-}
-
-/*************************************************************************
- * PathMatchSpec [SHELL32.46]
- * 
- * NOTES
- *     used from COMDLG32
- */
-BOOL WINAPI PathMatchSpecAW(LPVOID name, LPVOID mask) 
-{	if (VERSION_OsIsUnicode())
-	  return PathMatchSpecW( name, mask );
-	return PathMatchSpecA( name, mask );
-}
-/*************************************************************************
- * PathSetDlgItemPathA
- * NOTES
- *  use PathCompactPath to make sure, the path fits into the control
- */
-BOOL WINAPI PathSetDlgItemPathA(HWND hDlg, int id, LPCSTR pszPath) 
-{	TRACE("%x %x %s\n",hDlg, id, pszPath);
-	return SetDlgItemTextA(hDlg, id, pszPath);
-}
-
-/*************************************************************************
- * PathSetDlgItemPathW
- * NOTES
- *  use PathCompactPath to make sure, the path fits into the control
- */
-BOOL WINAPI PathSetDlgItemPathW(HWND hDlg, int id, LPCWSTR pszPath) 
-{	TRACE("%x %x %s\n",hDlg, id, debugstr_w(pszPath));
-	return SetDlgItemTextW(hDlg, id, pszPath);
-}
-
-/*************************************************************************
- * PathSetDlgItemPath [SHELL32.48]
- * NOTES
- *  use PathCompactPath to make sure, the path fits into the control
- */
-BOOL WINAPI PathSetDlgItemPathAW(HWND hDlg, int id, LPCVOID pszPath) 
-{	if (VERSION_OsIsUnicode())
-	  return PathSetDlgItemPathW(hDlg, id, pszPath);
-	return PathSetDlgItemPathA(hDlg, id, pszPath);
-}
-
-/*************************************************************************
- * PathQualifyA
- */
-BOOL WINAPI PathQualifyA(LPCSTR pszPath) 
-{	FIXME("%s\n",pszPath);
+	FIXME("%s\n",lpszPath);
 	return 0;
 }
 
 /*************************************************************************
- * PathQualifyW
+ * PathQuoteSpacesW [SHLWAPI.@]
  */
-BOOL WINAPI PathQualifyW(LPCWSTR pszPath) 
-{	FIXME("%s\n",debugstr_w(pszPath));
-	return 0;
-}
-
-/*************************************************************************
- * PathQualify [SHELL32.49]
- */
-BOOL WINAPI PathQualifyAW(LPCVOID pszPath) 
-{	if (VERSION_OsIsUnicode())
-	  return PathQualifyW(pszPath);
-	return PathQualifyA(pszPath);
-}
-
-/*************************************************************************
- * PathResolve [SHELL32.51]
- */
-DWORD WINAPI PathResolve(LPCSTR s,DWORD x2,DWORD x3) {
-	FIXME("(%s,0x%08lx,0x%08lx),stub!\n",s,x2,x3);
-	return 0;
-}
-
-/*************************************************************************
- * PathGetArgsA
- *
- * NOTES
- *     look for next arg in string. handle "quoted" strings
- *     returns pointer to argument *AFTER* the space. Or to the \0.
- */
-LPCSTR WINAPI PathGetArgsA(LPCSTR cmdline) 
-{	BOOL	qflag = FALSE;
-
-	TRACE("%s\n",cmdline);
-
-	while (*cmdline) 
-	{ if ((*cmdline==' ') && !qflag)
-	    return cmdline+1;
-	  if (*cmdline=='"')
-	    qflag=!qflag;
-	  cmdline++;
-	}
-	return cmdline;
-
-}
-
-/*************************************************************************
- * PathGetArgsW
- *
- * NOTES
- *     look for next arg in string. handle "quoted" strings
- *     returns pointer to argument *AFTER* the space. Or to the \0.
- */
-LPCWSTR WINAPI PathGetArgsW(LPCWSTR cmdline) 
-{	BOOL	qflag = FALSE;
-
-	TRACE("%s\n",debugstr_w(cmdline));
-
-	while (*cmdline) 
-	{ if ((*cmdline==' ') && !qflag)
-	    return cmdline+1;
-	  if (*cmdline=='"')
-	    qflag=!qflag;
-	  cmdline++;
-	}
-	return cmdline;
-}
-
-/*************************************************************************
- * PathGetArgs [SHELL32.52]
- *
- * NOTES
- *     look for next arg in string. handle "quoted" strings
- *     returns pointer to argument *AFTER* the space. Or to the \0.
- */
-LPCVOID WINAPI PathGetArgsAW(LPVOID cmdline) 
-{	if (VERSION_OsIsUnicode())
-	  return PathGetArgsW(cmdline);
-	return PathGetArgsA(cmdline);
-}
-
-/*************************************************************************
- * PathQuoteSpacesA
- * 
- * NOTES
- *     basename(char *fn);
- */
-LPSTR WINAPI PathQuoteSpacesA(LPCSTR aptr)
-{	FIXME("%s\n",aptr);
-	return 0;
-
-}
-
-/*************************************************************************
- * PathQuoteSpacesW
- * 
- * NOTES
- *     basename(char *fn);
- */
-LPWSTR WINAPI PathQuoteSpacesW(LPCWSTR wptr)
-{	FIXME("%s\n",debugstr_w(wptr));
+LPWSTR WINAPI PathQuoteSpacesW(LPCWSTR lpszPath)
+{
+	FIXME("%s\n",debugstr_w(lpszPath));
 	return 0;	
 }
 
 /*************************************************************************
- * PathQuoteSpaces [SHELL32.55]
- * 
- * NOTES
- *     basename(char *fn);
+ * PathQuoteSpacesAW [SHELL32.55]
  */
-LPVOID WINAPI PathQuoteSpacesAW (LPCVOID fn)
-{	if(VERSION_OsIsUnicode())
-	  return PathQuoteSpacesW(fn);
-	return PathQuoteSpacesA(fn);
+LPVOID WINAPI PathQuoteSpacesAW (LPCVOID lpszPath)
+{
+	if(VERSION_OsIsUnicode())
+	  return PathQuoteSpacesW(lpszPath);
+	return PathQuoteSpacesA(lpszPath);
 }
 
-
 /*************************************************************************
- * PathUnquoteSpacesA
+ * PathUnquoteSpacesA [SHLWAPI.@]
  * 
  * NOTES
  *     unquote string (remove ")
  */
 VOID WINAPI PathUnquoteSpacesA(LPSTR str) 
-{	DWORD      len = lstrlenA(str);
+{
+	DWORD len = lstrlenA(str);
+
 	TRACE("%s\n",str);
+
 	if (*str!='"')
 	  return;
 	if (str[len-1]!='"')
@@ -823,13 +915,11 @@
 }
 
 /*************************************************************************
- * PathUnquoteSpacesW
- * 
- * NOTES
- *     unquote string (remove ")
+ * PathUnquoteSpacesW [SHLWAPI.@]
  */
 VOID WINAPI PathUnquoteSpacesW(LPWSTR str) 
-{	DWORD len = CRTDLL_wcslen(str);
+{
+	DWORD len = CRTDLL_wcslen(str);
 
 	TRACE("%s\n",debugstr_w(str));
 
@@ -843,10 +933,7 @@
 }
 
 /*************************************************************************
- * PathUnquoteSpaces [SHELL32.56]
- * 
- * NOTES
- *     unquote string (remove ")
+ * PathUnquoteSpacesAW [SHELL32.56]
  */
 VOID WINAPI PathUnquoteSpacesAW(LPVOID str) 
 {
@@ -857,32 +944,631 @@
 }
 
 /*************************************************************************
- * PathGetDriveNumberA [SHLWAPI.@]
- *
+ * PathParseIconLocationA	[SHLWAPI.@]
  */
-HRESULT WINAPI PathGetDriveNumberA(LPSTR u)
-{	FIXME("%s stub\n",debugstr_a(u));
+int WINAPI PathParseIconLocationA(LPSTR lpszPath)
+{
+	LPSTR lpstrComma = strchr(lpszPath, ',');
+	
+	FIXME("%s stub\n", debugstr_a(lpszPath));
+
+	if (lpstrComma && lpstrComma[1])
+	{
+	  lpstrComma[0]='\0';
+/*	  return atoi(&lpstrComma[1]);	FIXME */
+	}
 	return 0;
 }
 
 /*************************************************************************
- * PathGetDriveNumberW [SHLWAPI.@]
- *
+ * PathParseIconLocationW	[SHLWAPI.@]
  */
-HRESULT WINAPI PathGetDriveNumberW(LPWSTR u)
-{	FIXME("%s stub\n",debugstr_w(u));
+int WINAPI PathParseIconLocationW(LPWSTR lpszPath)
+{
+	LPWSTR lpstrComma = CRTDLL_wcschr(lpszPath, ',');
+	
+	FIXME("%s stub\n", debugstr_w(lpszPath));
+
+	if (lpstrComma && lpstrComma[1])
+	{
+	  lpstrComma[0]='\0';
+/*	  return _wtoi(&lpstrComma[1]);	FIXME */
+	}
 	return 0;
 }
 
 /*************************************************************************
- * PathGetDriveNumber [SHELL32.57]
- *
+ * PathParseIconLocationAW	[SHELL32.249]
  */
-HRESULT WINAPI PathGetDriveNumberAW(LPVOID str)
+int WINAPI PathParseIconLocationAW (LPVOID lpszPath)
 {
 	if(VERSION_OsIsUnicode())
-	  return PathGetDriveNumberW(str);
-	return PathGetDriveNumberA(str);
+	  return PathParseIconLocationW(lpszPath);
+	return PathParseIconLocationA(lpszPath);
+}
+
+/*
+	Path Testing
+*/
+/*************************************************************************
+ * PathIsUNCA		[SHLWAPI.@]
+ * 
+ * NOTES
+ *     PathIsUNC(char*path);
+ */
+BOOL WINAPI PathIsUNCA(LPCSTR lpszPath) 
+{
+	TRACE("%s\n",lpszPath);
+
+	return (lpszPath && (lpszPath[0]=='\\') && (lpszPath[1]=='\\'));
+}
+
+/*************************************************************************
+ * PathIsUNCW		[SHLWAPI.@]
+ */
+BOOL WINAPI PathIsUNCW(LPCWSTR lpszPath) 
+{
+	TRACE("%s\n",debugstr_w(lpszPath));
+
+	return (lpszPath && (lpszPath[0]=='\\') && (lpszPath[1]=='\\'));
+}
+
+/*************************************************************************
+ * PathIsUNCAW		[SHELL32.39]
+ */
+BOOL WINAPI PathIsUNCAW (LPCVOID lpszPath)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathIsUNCW( lpszPath );
+	return PathIsUNCA( lpszPath );  
+}
+
+/*************************************************************************
+ *  PathIsRelativeA	[SHLWAPI.@]
+ */
+BOOL WINAPI PathIsRelativeA (LPCSTR lpszPath)
+{
+	TRACE("lpszPath=%s\n",lpszPath);
+
+	return (lpszPath && (lpszPath[0]!='\\' && lpszPath[1]!=':'));
+}
+
+/*************************************************************************
+ *  PathIsRelativeW	[SHLWAPI.@]
+ */
+BOOL WINAPI PathIsRelativeW (LPCWSTR lpszPath)
+{
+	TRACE("lpszPath=%s\n",debugstr_w(lpszPath));
+
+	return (lpszPath && (lpszPath[0]!='\\' && lpszPath[1]!=':'));
+}
+
+/*************************************************************************
+ *  PathIsRelativeAW	[SHELL32.40]
+ */
+BOOL WINAPI PathIsRelativeAW (LPCVOID lpszPath)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathIsRelativeW( lpszPath );
+	return PathIsRelativeA( lpszPath );  
+}
+
+/*************************************************************************
+ * PathIsRootA		[SHLWAPI.@]
+ *
+ * notes
+ *  TRUE if the path points to a root directory
+ */
+BOOL WINAPI PathIsRootA(LPCSTR lpszPath)
+{
+	TRACE("%s\n",lpszPath);
+
+	/* X:\ */
+	if (lpszPath[1]==':' && lpszPath[2]=='\\' && lpszPath[3]=='\0')
+	  return TRUE;
+
+	/* "\" */
+	if (lpszPath[0]=='\\' && lpszPath[1]=='\0')
+	  return TRUE;
+
+	/* UNC "\\<computer>\<share>" */
+	if (lpszPath[0]=='\\' && lpszPath[1]=='\\')		
+	{
+	  int foundbackslash = 0;
+	  lpszPath += 2;
+	  while (*lpszPath)
+	  {
+	    if (*(lpszPath++)=='\\') foundbackslash++;
+	  }
+	  if (foundbackslash==1)
+	    return TRUE;
+	}
+	return FALSE;
+}
+
+/*************************************************************************
+ * PathIsRootW		[SHLWAPI.@]
+ */
+BOOL WINAPI PathIsRootW(LPCWSTR lpszPath) 
+{
+	TRACE("%s\n",debugstr_w(lpszPath));
+
+	/* X:\ */
+	if (lpszPath[1]==':' && lpszPath[2]=='\\' && lpszPath[3]=='\0')
+	  return TRUE;
+
+	/* "\" */
+	if (lpszPath[0]=='\\' && lpszPath[1]=='\0')
+	  return TRUE;
+
+	/* UNC "\\<computer>\<share>" */
+	if (lpszPath[0]=='\\' && lpszPath[1]=='\\')		
+	{
+	  int foundbackslash = 0;
+	  lpszPath += 2;
+	  while (*lpszPath)
+	  {
+	    if (*(lpszPath++)=='\\') foundbackslash++;
+	  }
+	  if (foundbackslash==1)
+	    return TRUE;
+	}
+	return FALSE;
+
+}
+
+/*************************************************************************
+ * PathIsRootAW		[SHELL32.29]
+ */
+BOOL WINAPI PathIsRootAW(LPCVOID lpszPath) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathIsRootW(lpszPath);
+	return PathIsRootA(lpszPath);
+}
+
+/*************************************************************************
+ *  PathIsExeA		[internal]
+ */
+BOOL WINAPI PathIsExeA (LPCSTR lpszPath)
+{
+	LPCSTR lpszExtension = PathGetExtensionA(lpszPath);
+	int i = 0;
+	static char * lpszExtensions[6] = {"exe", "com", "pid", "cmd", "bat", NULL };
+	
+	TRACE("path=%s\n",lpszPath);
+
+	for(i=0; lpszExtensions[i]; i++)
+	  if (!strcasecmp(lpszExtension,lpszExtensions[i])) return TRUE;
+	  
+	return FALSE;
+}
+
+/*************************************************************************
+ *  PathIsExeW		[internal]
+ */
+BOOL WINAPI PathIsExeW (LPCWSTR lpszPath)
+{
+	LPCWSTR lpszExtension = PathGetExtensionW(lpszPath);
+	int i = 0;
+	static WCHAR lpszExtensions[6][4] =
+	  {{'e','x','e','\0'}, {'c','o','m','\0'}, {'p','i','d','\0'},
+	   {'c','m','d','\0'}, {'b','a','t','\0'}, {'\0'} };
+	
+	TRACE("path=%s\n",debugstr_w(lpszPath));
+
+	for(i=0; lpszExtensions[i]; i++)
+	  if (!CRTDLL__wcsicmp(lpszExtension,lpszExtensions[i])) return TRUE;
+	  
+	return FALSE;
+}
+
+/*************************************************************************
+ *  PathIsExeAW		[SHELL32.43]
+ */
+BOOL WINAPI PathIsExeAW (LPCVOID path)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathIsExeW (path);
+	return PathIsExeA(path);
+}
+
+/*************************************************************************
+ * PathIsDirectoryA	[SHLWAPI.@]
+ */
+BOOL WINAPI PathIsDirectoryA(LPCSTR lpszPath)
+{
+	HANDLE hFile;
+	WIN32_FIND_DATAA stffile;
+	
+	TRACE("%s\n", debugstr_a(lpszPath));
+
+	hFile = FindFirstFileA(lpszPath, &stffile);
+
+	if ( hFile != INVALID_HANDLE_VALUE )
+	{
+	  FindClose (hFile);
+          return (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+	}
+
+	return FALSE;	
+}
+
+/*************************************************************************
+ * PathIsDirectoryW	[SHLWAPI.@]
+ */
+BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
+{
+	HANDLE hFile;
+	WIN32_FIND_DATAW stffile;
+	
+	TRACE("%s\n", debugstr_w(lpszPath));
+
+	hFile = FindFirstFileW(lpszPath, &stffile);
+
+	if ( hFile != INVALID_HANDLE_VALUE )
+	{
+	  FindClose (hFile);
+          return (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+	}
+
+	return FALSE;	
+}
+
+/*************************************************************************
+ * PathIsDirectoryAW	[SHELL32.159]
+ */
+BOOL WINAPI PathIsDirectoryAW (LPCVOID lpszPath)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathIsDirectoryW (lpszPath);
+	return PathIsDirectoryA (lpszPath);
+}
+
+/*************************************************************************
+ * PathFileExistsA	[SHLWAPI.@]
+ * 
+ * NOTES
+ *     file_exists(char *fn);
+ */
+BOOL WINAPI PathFileExistsA(LPCSTR lpszPath) 
+{
+	TRACE("%s\n",lpszPath);
+	return  (GetFileAttributesA(lpszPath)!=-1);
+}
+
+/*************************************************************************
+ * PathFileExistsW	[SHLWAPI.@]
+ */
+BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath) 
+{
+	TRACE("%s\n",debugstr_w(lpszPath));
+	return  (GetFileAttributesW(lpszPath)!=-1);
+}
+
+/*************************************************************************
+ * PathFileExistsAW	[SHELL32.45]
+ */ 
+BOOL WINAPI PathFileExistsAW (LPCVOID lpszPath)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathFileExistsW (lpszPath);
+	return PathFileExistsA (lpszPath);
+}
+
+/*************************************************************************
+ * PathMatchSingleMaskA	[internal]
+ * 
+ * NOTES
+ *     internal (used by PathMatchSpec)
+ */
+static BOOL PathMatchSingleMaskA(LPCSTR name, LPCSTR mask)
+{
+	while (*name && *mask && *mask!=';') 
+	{
+	  if (*mask=='*') 
+	  {
+	    do 
+	    {
+	      if (PathMatchSingleMaskA(name,mask+1)) return 1;  /* try substrings */
+	    } while (*name++);
+	    return 0;
+	  }
+	  if (toupper(*mask)!=toupper(*name) && *mask!='?') return 0;
+	  name++;
+	  mask++;
+	}
+	if (!*name) 
+	{
+	  while (*mask=='*') mask++;
+	  if (!*mask || *mask==';') return 1;
+	}
+	return 0;
+}
+
+/*************************************************************************
+ * PathMatchSingleMaskW	[internal]
+ */
+static BOOL PathMatchSingleMaskW(LPCWSTR name, LPCWSTR mask)
+{
+	while (*name && *mask && *mask!=';') 
+	{
+	  if (*mask=='*') 
+	  {
+	    do 
+	    {
+	      if (PathMatchSingleMaskW(name,mask+1)) return 1;  /* try substrings */
+	    } while (*name++);
+	    return 0;
+	  }
+	  if (towupper(*mask)!=towupper(*name) && *mask!='?') return 0;
+	  name++;
+	  mask++;
+	}
+	if (!*name) 
+	{
+	  while (*mask=='*') mask++;
+	  if (!*mask || *mask==';') return 1;
+	}
+	return 0;
+}
+/*************************************************************************
+ * PathMatchSpecA	[SHLWAPI.@]
+ * 
+ * NOTES
+ *     used from COMDLG32
+ */
+BOOL WINAPI PathMatchSpecA(LPCSTR name, LPCSTR mask) 
+{
+	TRACE("%s %s\n",name,mask);
+
+	if (!lstrcmpA( mask, "*.*" )) return 1;   /* we don't require a period */
+
+	while (*mask) 
+	{
+	  if (PathMatchSingleMaskA(name,mask)) return 1;    /* helper function */
+	  while (*mask && *mask!=';') mask++;
+	  if (*mask==';') 
+	  {
+	    mask++;
+	    while (*mask==' ') mask++;      /*  masks may be separated by "; " */
+	  }
+	}
+	return 0;
+}
+
+/*************************************************************************
+ * PathMatchSpecW	[SHLWAPI.@]
+ */
+BOOL WINAPI PathMatchSpecW(LPCWSTR name, LPCWSTR mask) 
+{
+	WCHAR stemp[4];
+	TRACE("%s %s\n",debugstr_w(name),debugstr_w(mask));
+
+	lstrcpyAtoW(stemp,"*.*");	
+	if (!lstrcmpW( mask, stemp )) return 1;   /* we don't require a period */
+
+	while (*mask) 
+	{
+	  if (PathMatchSingleMaskW(name,mask)) return 1;    /* helper function */
+	  while (*mask && *mask!=';') mask++;
+	  if (*mask==';') 
+	  {
+	    mask++;
+	    while (*mask==' ') mask++;       /* masks may be separated by "; " */
+	  }
+	}
+	return 0;
+}
+
+/*************************************************************************
+ * PathMatchSpecAW	[SHELL32.46]
+ */
+BOOL WINAPI PathMatchSpecAW(LPVOID name, LPVOID mask) 
+{
+	if (VERSION_OsIsUnicode())
+	  return PathMatchSpecW( name, mask );
+	return PathMatchSpecA( name, mask );
+}
+
+/*************************************************************************
+ * PathIsSameRootA	[SHLWAPI.@]
+ *
+ * FIXME
+ *  what to do with "\path" ??
+ */
+BOOL WINAPI PathIsSameRootA(LPCSTR lpszPath1, LPCSTR lpszPath2)
+{
+	TRACE("%s %s\n", lpszPath1, lpszPath2);
+	
+	if (PathIsRelativeA(lpszPath1) || PathIsRelativeA(lpszPath2)) return FALSE;
+
+	/* usual path */
+	if ( toupper(lpszPath1[0])==toupper(lpszPath2[0]) &&
+	     lpszPath1[1]==':' && lpszPath2[1]==':' &&
+	     lpszPath1[2]=='\\' && lpszPath2[2]=='\\')
+	  return TRUE;
+
+	/* UNC */
+	if (lpszPath1[0]=='\\' && lpszPath2[0]=='\\' &&
+	    lpszPath1[1]=='\\' && lpszPath2[1]=='\\')
+	{
+	  int pos=2, bsfound=0;
+	  while (lpszPath1[pos] && lpszPath2[pos] &&
+	        (lpszPath1[pos] == lpszPath2[pos]))
+	  {
+	    if (lpszPath1[pos]=='\\') bsfound++;
+	    if (bsfound == 2) return TRUE;
+	    pos++;
+	  }
+	  return (lpszPath1[pos] == lpszPath2[pos]);
+	}
+	return FALSE;
+}
+
+/*************************************************************************
+ * PathIsSameRootW	[SHLWAPI.@]
+ */
+BOOL WINAPI PathIsSameRootW(LPCWSTR lpszPath1, LPCWSTR lpszPath2)
+{
+	TRACE("%s %s\n", debugstr_w(lpszPath1), debugstr_w(lpszPath2));
+	
+	if (PathIsRelativeW(lpszPath1) || PathIsRelativeW(lpszPath2)) return FALSE;
+
+	/* usual path */
+	if ( towupper(lpszPath1[0])==towupper(lpszPath2[0]) &&
+	     lpszPath1[1]==':' && lpszPath2[1]==':' &&
+	     lpszPath1[2]=='\\' && lpszPath2[2]=='\\')
+	  return TRUE;
+
+	/* UNC */
+	if (lpszPath1[0]=='\\' && lpszPath2[0]=='\\' &&
+	    lpszPath1[1]=='\\' && lpszPath2[1]=='\\')
+	{
+	  int pos=2, bsfound=0;
+	  while (lpszPath1[pos] && lpszPath2[pos] &&
+	        (lpszPath1[pos] == lpszPath2[pos]))
+	  {
+	    if (lpszPath1[pos]=='\\') bsfound++;
+	    if (bsfound == 2) return TRUE;
+	    pos++;
+	  }
+	  return (lpszPath1[pos] == lpszPath2[pos]);
+	}
+	return FALSE;
+}
+
+/*************************************************************************
+ * PathIsSameRootAW	[SHELL32.650]
+ */
+BOOL WINAPI PathIsSameRootAW(LPCVOID lpszPath1, LPCVOID lpszPath2)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathIsSameRootW(lpszPath1, lpszPath2);
+	return PathIsSameRootA(lpszPath1, lpszPath2);
+}
+
+/*************************************************************************
+ * PathIsURLA
+ */
+BOOL WINAPI PathIsURLA(LPCSTR lpstrPath)
+{
+	LPSTR lpstrRes;
+	int iSize, i=0;
+	static LPSTR SupportedProtocol[] = 
+	  {"http","https","ftp","gopher","file","mailto",NULL};
+
+	if(!lpstrPath) return FALSE;
+
+	/* get protocol        */
+	lpstrRes = strchr(lpstrPath,':');
+	if(!lpstrRes) return FALSE;
+	iSize = lpstrRes - lpstrPath;
+
+	while(SupportedProtocol[i])
+	{
+	  if (iSize == strlen(SupportedProtocol[i]))
+	    if(!strncasecmp(lpstrPath, SupportedProtocol[i], iSize));
+	      return TRUE;
+	  i++;
+	}
+
+	return FALSE;
+}  
+
+/*************************************************************************
+ * PathIsURLW
+ */
+BOOL WINAPI PathIsURLW(LPCWSTR lpstrPath)
+{
+	LPWSTR lpstrRes;
+	int iSize, i=0;
+	static WCHAR SupportedProtocol[7][7] = 
+	  {{'h','t','t','p','\0'},{'h','t','t','p','s','\0'},{'f','t','p','\0'},
+	  {'g','o','p','h','e','r','\0'},{'f','i','l','e','\0'},
+	  {'m','a','i','l','t','o','\0'},{0}};
+
+	if(!lpstrPath) return FALSE;
+
+	/* get protocol        */
+	lpstrRes = CRTDLL_wcschr(lpstrPath,':');
+	if(!lpstrRes) return FALSE;
+	iSize = lpstrRes - lpstrPath;
+
+	while(SupportedProtocol[i])
+	{
+	  if (iSize == CRTDLL_wcslen(SupportedProtocol[i]))
+	    if(!CRTDLL__wcsnicmp(lpstrPath, SupportedProtocol[i], iSize));
+	      return TRUE;
+	  i++;
+	}
+
+	return FALSE;
+}  
+
+/*************************************************************************
+ * IsLFNDriveA		[SHELL32.119]
+ * 
+ * NOTES
+ *     exported by ordinal Name
+ */
+BOOL WINAPI IsLFNDriveA(LPCSTR lpszPath) 
+{
+    DWORD	fnlen;
+
+    if (!GetVolumeInformationA(lpszPath,NULL,0,NULL,&fnlen,NULL,NULL,0))
+	return FALSE;
+    return fnlen>12;
+}
+
+/*
+	Creating Something Unique
+*/
+/*************************************************************************
+ * PathMakeUniqueNameA	[internal]
+ */
+BOOL WINAPI PathMakeUniqueNameA(
+	LPSTR lpszBuffer,
+	DWORD dwBuffSize, 
+	LPCSTR lpszShortName,
+	LPCSTR lpszLongName,
+	LPCSTR lpszPathName)
+{
+	FIXME("%p %lu %s %s %s stub\n",
+	 lpszBuffer, dwBuffSize, debugstr_a(lpszShortName),
+	 debugstr_a(lpszLongName), debugstr_a(lpszPathName));
+	return TRUE;
+}
+
+/*************************************************************************
+ * PathMakeUniqueNameW	[internal]
+ */
+BOOL WINAPI PathMakeUniqueNameW(
+	LPWSTR lpszBuffer,
+	DWORD dwBuffSize, 
+	LPCWSTR lpszShortName,
+	LPCWSTR lpszLongName,
+	LPCWSTR lpszPathName)
+{
+	FIXME("%p %lu %s %s %s stub\n",
+	 lpszBuffer, dwBuffSize, debugstr_w(lpszShortName),
+	 debugstr_w(lpszLongName), debugstr_w(lpszPathName));
+	return TRUE;
+}
+
+/*************************************************************************
+ * PathMakeUniqueNameAW	[SHELL32.47]
+ */
+BOOL WINAPI PathMakeUniqueNameAW(
+	LPVOID lpszBuffer,
+	DWORD dwBuffSize, 
+	LPCVOID lpszShortName,
+	LPCVOID lpszLongName,
+	LPCVOID lpszPathName)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathMakeUniqueNameW(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName);
+	return PathMakeUniqueNameA(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName);
 }
 
 /*************************************************************************
@@ -891,75 +1577,52 @@
  * NOTES
  *     exported by ordinal
  */
-BOOL WINAPI PathYetAnotherMakeUniqueNameA(LPDWORD x,LPDWORD y) {
-    FIXME("(%p,%p):stub.\n",x,y);
+BOOL WINAPI PathYetAnotherMakeUniqueNameA(
+	LPSTR lpszBuffer,
+	LPCSTR lpszPathName,
+	LPCSTR lpszShortName,
+	LPCSTR lpszLongName)
+{
+    FIXME("(%p,%p, %p ,%p):stub.\n",
+     lpszBuffer, lpszPathName, lpszShortName, lpszLongName);
     return TRUE;
 }
 
-/*************************************************************************
- * IsLFNDriveA [SHELL32.119]
- * 
- * NOTES
- *     exported by ordinal Name
+
+/*
+	cleaning and resolving paths 
  */
-BOOL WINAPI IsLFNDriveA(LPCSTR path) {
-    DWORD	fnlen;
-
-    if (!GetVolumeInformationA(path,NULL,0,NULL,&fnlen,NULL,NULL,0))
-	return FALSE;
-    return fnlen>12;
-}
 
 /*************************************************************************
- * PathFindOnPathA
+ * PathFindOnPathA	[SHELL32.145]
  */
 BOOL WINAPI PathFindOnPathA(LPSTR sFile, LPCSTR sOtherDirs)
-{	FIXME("%s %s\n",sFile, sOtherDirs);
+{
+	FIXME("%s %s\n",sFile, sOtherDirs);
 	return FALSE;
 }
 
 /*************************************************************************
- * PathFindOnPathW
+ * PathFindOnPathW	[SHELL32]
  */
 BOOL WINAPI PathFindOnPathW(LPWSTR sFile, LPCWSTR sOtherDirs)
-{	FIXME("%s %s\n",debugstr_w(sFile), debugstr_w(sOtherDirs));
+{
+	FIXME("%s %s\n",debugstr_w(sFile), debugstr_w(sOtherDirs));
 	return FALSE;
 }
 
 /*************************************************************************
- * PathFindOnPath [SHELL32.145]
+ * PathFindOnPathAW	[SHELL32]
  */
 BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs)
-{	if (VERSION_OsIsUnicode())
+{
+	if (VERSION_OsIsUnicode())
 	  return PathFindOnPathW(sFile, sOtherDirs);
 	return PathFindOnPathA(sFile, sOtherDirs);
 }
 
 /*************************************************************************
- * PathGetExtension [SHELL32.158]
- *
- * NOTES
- *     exported by ordinal
- */
-LPCSTR WINAPI PathGetExtensionA(LPCSTR path,DWORD y,DWORD z)
-{	TRACE("(%s,%08lx,%08lx)\n",path,y,z);
-	path = PathFindExtensionA(path);
-	return *path?(path+1):path;
-}
-LPCWSTR WINAPI PathGetExtensionW(LPCWSTR path,DWORD y,DWORD z)
-{	TRACE("(%s, %08lx, %08lx)\n",debugstr_w(path),y,z);
-	path = PathFindExtensionW(path);
-	return *path?(path+1):path;
-}
-LPCVOID WINAPI PathGetExtensionAW(LPCVOID path,DWORD y,DWORD z) 
-{	if (VERSION_OsIsUnicode())
-	  return PathGetExtensionW(path,y,z);
-	return PathGetExtensionA(path,y,z);
-}
-
-/*************************************************************************
- * PathCleanupSpec				[SHELL32.171]
- *
+ * PathCleanupSpecA	[SHELL32.171]
  */
 DWORD WINAPI PathCleanupSpecA(LPSTR x, LPSTR y)
 {
@@ -967,12 +1630,18 @@
 	return TRUE;
 }
 
+/*************************************************************************
+ * PathCleanupSpecA	[SHELL32]
+ */
 DWORD WINAPI PathCleanupSpecW(LPWSTR x, LPWSTR y)
 {
 	FIXME("(%p %s, %p %s) stub\n",x,debugstr_w(x),y,debugstr_w(y));
 	return TRUE;
 }
 
+/*************************************************************************
+ * PathCleanupSpecAW	[SHELL32]
+ */
 DWORD WINAPI PathCleanupSpecAW (LPVOID x, LPVOID y)
 {
 	if (VERSION_OsIsUnicode())
@@ -981,56 +1650,158 @@
 }
 
 /*************************************************************************
- * SheGetDirW [SHELL32.281]
- *
+ * PathQualifyA		[SHELL32]
  */
-HRESULT WINAPI SheGetDirW(LPWSTR u, LPWSTR v)
-{	FIXME("%p %p stub\n",u,v);
+BOOL WINAPI PathQualifyA(LPCSTR pszPath) 
+{
+	FIXME("%s\n",pszPath);
 	return 0;
 }
 
 /*************************************************************************
- * SheChangeDirW [SHELL32.274]
- *
+ * PathQualifyW		[SHELL32]
  */
-HRESULT WINAPI SheChangeDirW(LPWSTR u)
-{	FIXME("(%s),stub\n",debugstr_w(u));
+BOOL WINAPI PathQualifyW(LPCWSTR pszPath) 
+{
+	FIXME("%s\n",debugstr_w(pszPath));
 	return 0;
 }
 
 /*************************************************************************
-*	PathProcessCommand	[SHELL32.653]
-*/
-HRESULT WINAPI PathProcessCommandA (LPSTR lpCommand, LPSTR v, DWORD w, DWORD x)
-{
-	FIXME("%p(%s) %p 0x%04lx 0x%04lx stub\n",
-	lpCommand, lpCommand, v, w,x );
-	lstrcpyA(v, lpCommand);
-	return 0;
-}
-
-HRESULT WINAPI PathProcessCommandW (LPWSTR lpCommand, LPSTR v, DWORD w, DWORD x)
-{
-	FIXME("(%p %s, %p, 0x%04lx, 0x%04lx) stub\n",
-	lpCommand, debugstr_w(lpCommand), v, w,x );
-	return 0;
-}
-
-HRESULT WINAPI PathProcessCommandAW (LPVOID lpCommand, LPSTR v, DWORD w, DWORD x)
+ * PathQualifyAW	[SHELL32]
+ */
+BOOL WINAPI PathQualifyAW(LPCVOID pszPath) 
 {
 	if (VERSION_OsIsUnicode())
-	  return PathProcessCommandW(lpCommand, v, w, x);
-	return PathProcessCommandA(lpCommand, v, w, x);
+	  return PathQualifyW(pszPath);
+	return PathQualifyA(pszPath);
 }
 
 /*************************************************************************
- * SHGetSpecialFolderPathA
+ * PathResolveA [SHELL32.51]
+ */
+BOOL WINAPI PathResolveA(
+	LPSTR lpszPath,
+	LPCSTR *alpszPaths, 
+	DWORD dwFlags)
+{
+	FIXME("(%s,%p,0x%08lx),stub!\n",
+	  lpszPath, *alpszPaths, dwFlags);
+	return 0;
+}
+
+/*************************************************************************
+ * PathResolveW [SHELL32]
+ */
+BOOL WINAPI PathResolveW(
+	LPWSTR lpszPath,
+	LPCWSTR *alpszPaths, 
+	DWORD dwFlags)
+{
+	FIXME("(%s,%p,0x%08lx),stub!\n",
+	  debugstr_w(lpszPath), debugstr_w(*alpszPaths), dwFlags);
+	return 0;
+}
+
+/*************************************************************************
+ * PathResolveAW [SHELL32]
+ */
+BOOL WINAPI PathResolveAW(
+	LPVOID lpszPath,
+	LPCVOID *alpszPaths, 
+	DWORD dwFlags)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathResolveW(lpszPath, (LPCWSTR*)alpszPaths, dwFlags);
+	return PathResolveA(lpszPath, (LPCSTR*)alpszPaths, dwFlags);
+}
+
+/*************************************************************************
+*	PathProcessCommandA	[SHELL32.653]
+*/
+HRESULT WINAPI PathProcessCommandA (
+	LPCSTR lpszPath,
+	LPSTR lpszBuff,
+	DWORD dwBuffSize,
+	DWORD dwFlags)
+{
+	FIXME("%s %p 0x%04lx 0x%04lx stub\n",
+	lpszPath, lpszBuff, dwBuffSize, dwFlags);
+	lstrcpyA(lpszBuff, lpszPath);
+	return 0;
+}
+
+/*************************************************************************
+*	PathProcessCommandW
+*/
+HRESULT WINAPI PathProcessCommandW (
+	LPCWSTR lpszPath,
+	LPWSTR lpszBuff,
+	DWORD dwBuffSize,
+	DWORD dwFlags)
+{
+	FIXME("(%s, %p, 0x%04lx, 0x%04lx) stub\n",
+	debugstr_w(lpszPath), lpszBuff, dwBuffSize, dwFlags);
+	lstrcpyW(lpszBuff, lpszPath);
+	return 0;
+}
+
+/*************************************************************************
+*	PathProcessCommandAW
+*/
+HRESULT WINAPI PathProcessCommandAW (
+	LPCVOID lpszPath,
+	LPVOID lpszBuff,
+	DWORD dwBuffSize,
+	DWORD dwFlags)
+{
+	if (VERSION_OsIsUnicode())
+	  return PathProcessCommandW(lpszPath, lpszBuff, dwBuffSize, dwFlags);
+	return PathProcessCommandA(lpszPath, lpszBuff, dwBuffSize, dwFlags);
+}
+
+/*
+	special
+*/
+
+/*************************************************************************
+ * PathSetDlgItemPathA
+ *
+ * NOTES
+ *  use PathCompactPath to make sure, the path fits into the control
+ */
+BOOL WINAPI PathSetDlgItemPathA(HWND hDlg, int id, LPCSTR pszPath) 
+{	TRACE("%x %x %s\n",hDlg, id, pszPath);
+	return SetDlgItemTextA(hDlg, id, pszPath);
+}
+
+/*************************************************************************
+ * PathSetDlgItemPathW
+ */
+BOOL WINAPI PathSetDlgItemPathW(HWND hDlg, int id, LPCWSTR pszPath) 
+{	TRACE("%x %x %s\n",hDlg, id, debugstr_w(pszPath));
+	return SetDlgItemTextW(hDlg, id, pszPath);
+}
+
+/*************************************************************************
+ * PathSetDlgItemPathAW
+ */
+BOOL WINAPI PathSetDlgItemPathAW(HWND hDlg, int id, LPCVOID pszPath) 
+{	if (VERSION_OsIsUnicode())
+	  return PathSetDlgItemPathW(hDlg, id, pszPath);
+	return PathSetDlgItemPathA(hDlg, id, pszPath);
+}
+
+
+/*************************************************************************
+ * SHGetSpecialFolderPathA [SHELL32.175]
  * 
  * converts csidl to path
  * 
  */
  
 static char * szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
+static char * szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
 
 BOOL WINAPI SHGetSpecialFolderPathA (
 	HWND hwndOwner,
@@ -1174,40 +1945,46 @@
 	    return FALSE;
 	}
 
-	if (RegCreateKeyExA(hRootKey,szSHFolders,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwDisp))
-	{
-	  return FALSE;
-	}
+	/* user shell folders */
+	if (RegCreateKeyExA(hRootKey,szSHUserFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
 
 	if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
 	{
-	  /* value not existing */
-	  if (bRelative)
+	  RegCloseKey(hKey);
+
+	  /* shell folders */
+	  if (RegCreateKeyExA(hRootKey,szSHFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
+
+	  if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
 	  {
-	    GetWindowsDirectoryA(szPath, MAX_PATH);
-	    PathAddBackslashA(szPath);
-	    strcat(szPath, szDefaultPath);
+
+	    /* value not existing */
+	    if (bRelative)
+	    {
+	      GetWindowsDirectoryA(szPath, MAX_PATH);
+	      PathAddBackslashA(szPath);
+	      strcat(szPath, szDefaultPath);
+	    }
+	    else
+	    {
+	      strcpy(szPath, "C:\\");	/* fixme ??? */
+	      strcat(szPath, szDefaultPath);
+	    }
+	    RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
 	  }
-	  else
-	  {
-	    strcpy(szPath, szDefaultPath);
-	  }
-	  if (bCreate)
-	  {
-	    CreateDirectoryA(szPath,NULL);
-	  }
-	  RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
 	}
 	RegCloseKey(hKey);
 
+	if (bCreate && CreateDirectoryA(szPath,NULL))
+	{
+	    MESSAGE("Created not existing system directory '%s'\n", szPath);
+	}
+
 	return TRUE;
 }
 
 /*************************************************************************
  * SHGetSpecialFolderPathW
- * 
- * converts csidl to path
- * 
  */
 BOOL WINAPI SHGetSpecialFolderPathW (
 	HWND hwndOwner,
@@ -1228,10 +2005,7 @@
 }
 
 /*************************************************************************
- * SHGetSpecialFolderPath [SHELL32.175]
- * 
- * converts csidl to path
- * 
+ * SHGetSpecialFolderPathAW
  */
 BOOL WINAPI SHGetSpecialFolderPathAW (
 	HWND hwndOwner,
@@ -1246,97 +2020,171 @@
 }
 
 /*************************************************************************
- * PathRemoveBackslashA
+ * PathCanonicalizeA
  *
- * If the path ends in a backslash it is replaced by a NULL
- * and the address of the NULL is returned
- * Otherwise 
- * the address of the last character is returned.
- *
+ *  FIXME
+ *   returnvalue
  */
-LPSTR WINAPI PathRemoveBackslashA( LPSTR lpPath )
+ 
+BOOL WINAPI PathCanonicalizeA(LPSTR pszBuf, LPCSTR pszPath)
 {
-	LPSTR p = lpPath;
+	int OffsetMin = 0, OffsetSrc = 0, OffsetDst = 0, LenSrc = strlen(pszPath);
+	BOOL bModifyed = FALSE;
+
+	TRACE("%p %s\n", pszBuf, pszPath);
 	
-	while (*lpPath) p = lpPath++;
-	if ( *p == (CHAR)'\\') *p = (CHAR)'\0';
-	return p;
-}
+	pszBuf[OffsetDst]='\0';
 
-/*************************************************************************
- * PathRemoveBackslashW
- *
- */
-LPWSTR WINAPI PathRemoveBackslashW( LPWSTR lpPath )
-{
-	LPWSTR p = lpPath;
+	/* keep the root of the path */
+	if( LenSrc && (pszPath[OffsetSrc]=='\\'))
+	{
+	  pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; OffsetMin++; LenSrc--;
+	}
+	else if ( (LenSrc >= 2) && (pszPath[OffsetSrc+1] == ':'))
+	{
+	  pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; OffsetMin++; LenSrc--;
+	  pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; OffsetMin++; LenSrc--;
+	  if (LenSrc && (pszPath[OffsetSrc] == '\\'))
+	  {
+	    pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; OffsetMin++; LenSrc--;
+	    if (LenSrc == 1 && pszPath[OffsetSrc]=='.')
+	    {
+	      /* C:\. */
+	      OffsetSrc++; LenSrc--; bModifyed = TRUE;
+	    } 
+	    else if (LenSrc == 2 && pszPath[OffsetSrc]=='.' && pszPath[OffsetSrc+1]=='.')
+	    {
+	      /* C:\.. */
+	      OffsetSrc+=2; LenSrc-=2; bModifyed = TRUE;
+	    } 
+          }
+	}
 	
-	while (*lpPath); p = lpPath++;
-	if ( *p == (WCHAR)'\\') *p = (WCHAR)'\0';
-	return p;
+	/* ".\" at the beginning of the path */
+	if (LenSrc >= 2 && pszPath[OffsetSrc]=='.' && pszPath[OffsetSrc+1]=='\\')
+	{
+	  OffsetSrc+=2; LenSrc-=2; bModifyed = TRUE;
+	} 
+	
+	while ( LenSrc )
+	{
+	  if((LenSrc>=3) && (pszPath[OffsetSrc]=='\\') && (pszPath[OffsetSrc+1]=='.') && (pszPath[OffsetSrc+2]=='.'))
+	  {
+	    /* "\.." found, go one deeper */
+	    while((OffsetDst > OffsetMin) && (pszBuf[OffsetDst]!='\\')) OffsetDst--;
+	    OffsetSrc += 3; LenSrc -= 3; bModifyed = TRUE;
+	    if(OffsetDst == OffsetMin && pszPath[OffsetSrc]=='\\') OffsetSrc++;
+	    pszBuf[OffsetDst] = '\0';			/* important for \..\.. */
+	  }
+	  else if(LenSrc>=2 && pszPath[OffsetSrc]=='\\' && pszPath[OffsetSrc+1]=='.' )
+	  {
+	    /* "\." found, skip it */
+	    OffsetSrc += 2; LenSrc-=2; bModifyed = TRUE;
+	  }
+	  else
+	  {
+	    pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; LenSrc--;
+	  }
+	}
+	pszBuf[OffsetDst] = '\0';
+	TRACE("-- %s %u\n", pszBuf, bModifyed);
+	return bModifyed;
+}
+
+
+/*************************************************************************
+ * PathCanonicalizeW
+ *
+ *  FIXME
+ *   returnvalue
+ */
+BOOL WINAPI PathCanonicalizeW(LPWSTR pszBuf, LPCWSTR pszPath)
+{
+	int OffsetMin = 0, OffsetSrc = 0, OffsetDst = 0, LenSrc = lstrlenW(pszPath);
+	BOOL bModifyed = FALSE;
+
+	TRACE("%p %s\n", pszBuf, debugstr_w(pszPath));
+	
+	pszBuf[OffsetDst]='\0';
+
+	/* keep the root of the path */
+	if( LenSrc && (pszPath[OffsetSrc]=='\\'))
+	{
+	  pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; OffsetMin++; LenSrc--;
+	}
+	else if ( (LenSrc >= 2) && (pszPath[OffsetSrc+1] == ':'))
+	{
+	  pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; OffsetMin++; LenSrc--;
+	  pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; OffsetMin++; LenSrc--;
+	  if (LenSrc && (pszPath[OffsetSrc] == '\\'))
+	  {
+	    pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; OffsetMin++; LenSrc--;
+	    if (LenSrc == 1 && pszPath[OffsetSrc]=='.')
+	    {
+	      /* C:\. */
+	      OffsetSrc++; LenSrc--; bModifyed = TRUE;
+	    } 
+	    else if (LenSrc == 2 && pszPath[OffsetSrc]=='.' && pszPath[OffsetSrc+1]=='.')
+	    {
+	      /* C:\.. */
+	      OffsetSrc+=2; LenSrc-=2; bModifyed = TRUE;
+	    } 
+          }
+	}
+	
+	/* ".\" at the beginning of the path */
+	if (LenSrc >= 2 && pszPath[OffsetSrc]=='.' && pszPath[OffsetSrc+1]=='\\')
+	{
+	  OffsetSrc+=2; LenSrc-=2; bModifyed = TRUE;
+	} 
+	
+	while ( LenSrc )
+	{
+	  if((LenSrc>=3) && (pszPath[OffsetSrc]=='\\') && (pszPath[OffsetSrc+1]=='.') && (pszPath[OffsetSrc+2]=='.'))
+	  {
+	    /* "\.." found, go one deeper */
+	    while((OffsetDst > OffsetMin) && (pszBuf[OffsetDst]!='\\')) OffsetDst--;
+	    OffsetSrc += 3; LenSrc -= 3; bModifyed = TRUE;
+	    if(OffsetDst == OffsetMin && pszPath[OffsetSrc]=='\\') OffsetSrc++;
+	    pszBuf[OffsetDst] = '\0';			/* important for \..\.. */
+	  }
+	  else if(LenSrc>=2 && pszPath[OffsetSrc]=='\\' && pszPath[OffsetSrc+1]=='.' )
+	  {
+	    /* "\." found, skip it */
+	    OffsetSrc += 2; LenSrc-=2; bModifyed = TRUE;
+	  }
+	  else
+	  {
+	    pszBuf[OffsetDst++] = pszPath[OffsetSrc++]; LenSrc--;
+	  }
+	}
+	pszBuf[OffsetDst] = '\0';
+	TRACE("-- %s %u\n", debugstr_w(pszBuf), bModifyed);
+	return bModifyed;
 }
 
 /*************************************************************************
- * PathIsURLA
- *
+ * PathFindNextComponentA
  */
-BOOL WINAPI PathIsURLA(LPCSTR lpstrPath)
+LPSTR WINAPI PathFindNextComponentA(LPCSTR pszPath)
 {
-  LPSTR lpstrRes;
-  char lpstrFileType[10] = "";
-  int iSize;
-  int i = 0;
-  /* sanity check */
-  if(!lpstrPath)
-    return FALSE;
-
-  /* get protocol        */
-  /* protocol://location */
-  if(!(lpstrRes = strchr(lpstrPath,':')))
-  {
-    return FALSE;
-  }
-  iSize = lpstrRes - lpstrPath;
-  if(iSize > sizeof(lpstrFileType))
-    return FALSE;
-
-  strncpy(lpstrFileType,lpstrPath,iSize);
-
-  while(strlen(SupportedProtocol[i]))
-  {
-    if(!_stricmp(lpstrFileType,SupportedProtocol[i++]))
-      return TRUE;
-  }
-
-  return FALSE;
-}  
-
-/*************************************************************************
- * PathIsDirectoryA
- *
- */
-BOOL WINAPI PathIsDirectoryA(LPCSTR pszPath)
-{
-	FIXME("%s\n", debugstr_a(pszPath));
-	return TRUE;
+	while( *pszPath )
+	{
+	  if(*pszPath++=='\\')
+	    return (LPSTR)((*pszPath)? pszPath : NULL);
+	}
+	return NULL;
 }
 
 /*************************************************************************
- * PathIsDirectoryW
- *
+ * PathFindNextComponentW
  */
-BOOL WINAPI PathIsDirectoryW(LPCWSTR pszPath)
+LPWSTR WINAPI PathFindNextComponentW(LPCWSTR pszPath)
 {
-	FIXME("%s\n", debugstr_w(pszPath));
-	return TRUE;
-}
-/*************************************************************************
- * PathIsDirectory
- *
- */
-BOOL WINAPI PathIsDirectoryAW (LPCVOID pszPath)
-{
-	if (VERSION_OsIsUnicode())
-	  return PathIsDirectoryW (pszPath);
-	return PathIsDirectoryA (pszPath);
+	while( *pszPath )
+	{
+	  if(*pszPath++=='\\')
+	    return (LPWSTR)((*pszPath)? pszPath : NULL);
+	}
+	return NULL;
 }
diff --git a/dlls/shell32/shlfileop.c b/dlls/shell32/shlfileop.c
index f3954ce..c73fb53 100644
--- a/dlls/shell32/shlfileop.c
+++ b/dlls/shell32/shlfileop.c
@@ -8,16 +8,33 @@
 #include "winversion.h"
 
 #include "shlobj.h"
+#include "shresdef.h"
+#include "wine/undocshell.h"
 
 DEFAULT_DEBUG_CHANNEL(shell);
 
+#define ASK_DELETE_FILE 1
+#define ASK_DELETE_FOLDER 2
+#define ASK_DELETE_MULTIPLE_FILE 3
+
+static BOOL SHELL_WarnFolderDelete (int nKindOfDialog, LPCSTR szDir)
+{
+	char szCaption[255], szText[255], szBuffer[256];
+
+	LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_TEXT, szText, sizeof(szText));
+	LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_CAPTION, szCaption, sizeof(szCaption));
+	FormatMessageA(FORMAT_MESSAGE_FROM_STRING, szText, 0,0, szBuffer, sizeof(szBuffer), (DWORD*)&szDir);
+
+	return (IDOK == MessageBoxA(GetActiveWindow(),szText, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION));
+}
+
 /**************************************************************************
  *	SHELL_DeleteDirectoryA()
  *
  * like rm -r
  */
 
-BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir)
+BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir, BOOL bShowUI)
 {
 	BOOL		ret = FALSE;
 	HANDLE		hFind;
@@ -28,6 +45,8 @@
 	PathAddBackslashA(szTemp);
 	strcat(szTemp, "*.*");
 	
+	if (bShowUI && !SHELL_WarnFolderDelete(ASK_DELETE_FOLDER, pszDir)) return FALSE;
+	
 	if(INVALID_HANDLE_VALUE != (hFind = FindFirstFileA(szTemp, &wfd)))
 	{
 	  do
@@ -39,7 +58,7 @@
 	      strcat(szTemp, wfd.cFileName);
 	
 	      if(FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes)
-	        SHELL_DeleteDirectoryA(szTemp);
+	        SHELL_DeleteDirectoryA(szTemp, FALSE);
 	      else
 	        DeleteFileA(szTemp);
 	    }
@@ -124,3 +143,22 @@
 	  return SHFileOperationW(lpFileOp);
 	return SHFileOperationA(lpFileOp);
 }
+
+/*************************************************************************
+ * SheGetDirW [SHELL32.281]
+ *
+ */
+HRESULT WINAPI SheGetDirW(LPWSTR u, LPWSTR v)
+{	FIXME("%p %p stub\n",u,v);
+	return 0;
+}
+
+/*************************************************************************
+ * SheChangeDirW [SHELL32.274]
+ *
+ */
+HRESULT WINAPI SheChangeDirW(LPWSTR u)
+{	FIXME("(%s),stub\n",debugstr_w(u));
+	return 0;
+}
+
diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c
index 5512f71..641e300 100644
--- a/dlls/shell32/shlfolder.c
+++ b/dlls/shell32/shlfolder.c
@@ -209,6 +209,70 @@
 }
 
 /***********************************************************************
+ *  SHELL32_GetItemAttributes
+ *
+ * NOTES
+ * observerd values:
+ *  folder:	0xE0000177	FILESYSTEM | HASSUBFOLDER | FOLDER
+ *  file:	0x40000177	FILESYSTEM
+ *  drive:	0xf0000144	FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR
+ *  mycomputer:	0xb0000154	HASSUBFOLDER | FOLDER | FILESYSANCESTOR
+ *  (seems to be default for shell extensions if no registry entry exists)
+ *
+ * This functions does not set flags!! It only resets flags when nessesary.
+ */
+static HRESULT SHELL32_GetItemAttributes(
+	IShellFolder * psf,
+	LPITEMIDLIST pidl,
+	LPDWORD pdwAttributes)
+{
+        GUID const * clsid;
+	DWORD dwAttributes;
+	
+	TRACE("0x%08lx\n", *pdwAttributes);
+
+	if (*pdwAttributes & (0xcff3fe88))
+	  WARN("attribute 0x%08lx not implemented\n", *pdwAttributes);
+	*pdwAttributes &= ~SFGAO_LINK; /* FIXME: for native filedialogs */
+
+	if (_ILIsDrive(pidl))
+	{
+	  *pdwAttributes &= 0xf0000144;
+	}
+	else if ((clsid=_ILGetGUIDPointer(pidl)))
+	{
+	  if (HCR_GetFolderAttributes(clsid, &dwAttributes))
+	  {
+	    *pdwAttributes &= dwAttributes;
+	  }
+	  else
+	  {
+	    *pdwAttributes &= 0xb0000154;
+	  }	  
+	}
+	else if (_ILGetDataPointer(pidl))
+	{
+	  dwAttributes = _ILGetFileAttributes(pidl, NULL, 0);
+	  *pdwAttributes &= ~SFGAO_FILESYSANCESTOR;
+
+	  if(( SFGAO_FOLDER & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
+	      *pdwAttributes &= ~(SFGAO_FOLDER|SFGAO_HASSUBFOLDER);
+
+	  if(( SFGAO_HIDDEN & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_HIDDEN))
+	      *pdwAttributes &= ~SFGAO_HIDDEN;
+
+	  if(( SFGAO_READONLY & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_READONLY))
+	      *pdwAttributes &= ~SFGAO_READONLY;
+	}
+	else
+	{
+	  *pdwAttributes &= 0xb0000154;
+	}
+	TRACE("-- 0x%08lx\n", *pdwAttributes);
+	return S_OK;
+}
+
+/***********************************************************************
 *   IShellFolder implementation
 */
 
@@ -604,6 +668,17 @@
 	    }
 	    else
 	    {
+	       if (pdwAttributes && *pdwAttributes)
+	       {
+	         SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
+/*	         WIN32_FIND_DATAA fd;
+	         SHGetDataFromIDListA(_IShellFolder_(This), pidlTemp, SHGDFIL_FINDDATA, &fd, sizeof(fd));
+		 if (!(FILE_ATTRIBUTE_DIRECTORY & fd.dwFileAttributes))
+		   *pdwAttributes &= ~SFGAO_FOLDER;
+		 if (FILE_ATTRIBUTE_READONLY  & fd.dwFileAttributes)
+		   *pdwAttributes &= ~(SFGAO_CANDELETE|SFGAO_CANMOVE|SFGAO_CANRENAME );
+*/
+	       }
 	       hr = S_OK;
 	    }
 	  }
@@ -682,12 +757,17 @@
 	      return E_FAIL;
 	    }
 	}
-	else
+	else if(_ILIsFolder(pidl))
 	{
 	  LPITEMIDLIST pidltemp = ILCloneFirst(pidl);
 	  pShellFolder = IShellFolder_Constructor(iface, pidltemp);
 	  ILFree(pidltemp);
 	}
+	else
+	{
+	  ERR("can't bind to a file\n");
+	  return E_FAIL;
+	}
 	
 	if (_ILIsPidlSimple(pidl))
 	{
@@ -901,19 +981,8 @@
 	while (cidl > 0 && *apidl)
 	{
 	  pdump (*apidl);
-	  if (_ILIsFolder( *apidl))
-	  {
-	    *rgfInOut &= 0xe0000177;
-	    goto next;
-	  }
-	  else if (_ILIsValue( *apidl))
-	  {
-	    *rgfInOut &= 0x40000177;
-	    goto next;
-	  }
-	  hr = E_INVALIDARG;
-
-next:	  apidl++;
+	  SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut);
+	  apidl++;
 	  cidl--;
 	} 
 
@@ -1436,7 +1505,7 @@
 	    LPITEMIDLIST pidl;
 
 	    MESSAGE("delete %s\n", szPath);
-	    if (! RemoveDirectoryA(szPath)) return E_FAIL;
+	    if (! SHELL_DeleteDirectoryA(szPath, TRUE)) return E_FAIL;
 	    pidl = ILCombine(This->absPidl, apidl[i]);
 	    SHChangeNotifyA(SHCNE_RMDIR, SHCNF_IDLIST, pidl, NULL);
 	    SHFree(pidl); 
@@ -1625,6 +1694,11 @@
 	else
 	{
 	  hr = S_OK;
+
+	  if (pdwAttributes && *pdwAttributes)
+	  {
+	    SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
+	  }
 	}
 
 	*ppidl = pidlTemp;
@@ -1769,12 +1843,14 @@
 /**************************************************************************
 *  ISF_Desktop_fnGetAttributesOf
 */
-static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf(IShellFolder2 * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut)
+static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf(
+	IShellFolder2 * iface,
+	UINT cidl,
+	LPCITEMIDLIST *apidl,
+	DWORD *rgfInOut)
 {
 	_ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
 
-	GUID		const * clsid;
-	DWORD		attributes;
 	HRESULT		hr = S_OK;
 
 	TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl, *rgfInOut);
@@ -1785,37 +1861,8 @@
 	while (cidl > 0 && *apidl)
 	{
 	  pdump (*apidl);
-
-	  if ((clsid=_ILGetGUIDPointer(*apidl)))
-	  {
-	    if (IsEqualIID(clsid, &CLSID_MyComputer))
-	    {
-	      *rgfInOut &= 0xb0000154;
-	      goto next;
-	    }
-	    else if (HCR_GetFolderAttributes(clsid, &attributes))
-	    {
-	      *rgfInOut &= attributes;
-	      goto next;
-	    }
-	    else
-	    { /* some shell-extension */
-	      *rgfInOut &= 0xb0000154;
-	    }
-	  }
-	  else if (_ILIsFolder( *apidl))
-	  {
-	    *rgfInOut &= 0xe0000177;
-	    goto next;
-	  }
-	  else if (_ILIsValue( *apidl))
-	  {
-	    *rgfInOut &= 0x40000177;
-	    goto next;
-	  }
-	  hr = E_INVALIDARG;
-
-next:	  apidl++;
+	  SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut);
+	  apidl++;
 	  cidl--;
 	}
 
@@ -2086,6 +2133,10 @@
 	  }
 	  else
 	  {
+	    if (pdwAttributes && *pdwAttributes)
+	    {
+	      SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
+	    }
 	    hr = S_OK;
 	  }
 	  *ppidl = pidlTemp;
@@ -2213,12 +2264,14 @@
 /**************************************************************************
 *  ISF_MyComputer_fnGetAttributesOf
 */
-static HRESULT WINAPI ISF_MyComputer_fnGetAttributesOf(IShellFolder2 * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut)
+static HRESULT WINAPI ISF_MyComputer_fnGetAttributesOf(
+	IShellFolder2 * iface,
+	UINT cidl,
+	LPCITEMIDLIST *apidl,
+	DWORD *rgfInOut)
 {
 	_ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
 
-	GUID		const * clsid;
-	DWORD		attributes;
 	HRESULT		hr = S_OK;
 
 	TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut);
@@ -2226,28 +2279,11 @@
 	if ( (!cidl) || (!apidl) || (!rgfInOut))
 	  return E_INVALIDARG;
 
-	*rgfInOut = 0xffffffff;
-
 	while (cidl > 0 && *apidl)
 	{
 	  pdump (*apidl);
-
-	  if (_ILIsDrive(*apidl))
-	  {
-	    *rgfInOut &= 0xf0000144;
-	    goto next;
-	  }
-	  else if ((clsid=_ILGetGUIDPointer(*apidl)))
-	  {
-	    if (HCR_GetFolderAttributes(clsid, &attributes))
-	    {
-	      *rgfInOut &= attributes;
-	      goto next;
-	    }
-	  }
-	  hr = E_INVALIDARG;
-
-next:	  apidl++;
+	  SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut);
+	  apidl++;
 	  cidl--;
 	}
 
diff --git a/dlls/shell32/shlmenu.c b/dlls/shell32/shlmenu.c
index dea173e..5b41ccc 100644
--- a/dlls/shell32/shlmenu.c
+++ b/dlls/shell32/shlmenu.c
@@ -444,7 +444,7 @@
 /*************************************************************************
  * FileMenu_AppendFilesForPidl			[SHELL32.124]
  */
-HMENU WINAPI FileMenu_AppendFilesForPidl(
+int WINAPI FileMenu_AppendFilesForPidl(
 	HMENU	hmenu,
 	LPCITEMIDLIST	pidl,
 	BOOL	bAddSeperator)
@@ -490,7 +490,7 @@
 /*************************************************************************
  * FileMenu_TrackPopupMenuEx			[SHELL32.116]
  */
-HRESULT WINAPI FileMenu_TrackPopupMenuEx (
+BOOL WINAPI FileMenu_TrackPopupMenuEx (
 	HMENU hMenu,
 	UINT uFlags,
 	int x,
diff --git a/dlls/shell32/shlwapi.spec b/dlls/shell32/shlwapi.spec
index c12c65d..13e5be7 100644
--- a/dlls/shell32/shlwapi.spec
+++ b/dlls/shell32/shlwapi.spec
@@ -176,11 +176,11 @@
 @ stub    PathAddExtensionA
 @ stub    PathAddExtensionW
 @ stdcall PathAppendA (str str) PathAppendA
-@ stub    PathAppendW
+@ stdcall PathAppendW (str str) PathAppendW
 @ stdcall PathBuildRootA (ptr long) PathBuildRootA
-@ stub    PathBuildRootW
-@ stub    PathCanonicalizeA
-@ stub    PathCanonicalizeW
+@ stdcall PathBuildRootW (ptr long) PathBuildRootW
+@ stdcall PathCanonicalizeA (ptr str) PathCanonicalizeA
+@ stdcall PathCanonicalizeW (ptr wstr) PathCanonicalizeW
 @ stdcall PathCombineA (ptr ptr ptr) PathCombineA
 @ stdcall PathCombineW (ptr ptr ptr) PathCombineW
 @ stub    PathCommonPrefixA
@@ -192,21 +192,21 @@
 @ stub    PathCreateFromUrlA
 @ stub    PathCreateFromUrlW
 @ stdcall PathFileExistsA (str) PathFileExistsA
-@ stub    PathFileExistsW
-@ stdcall PathFindExtensionA (ptr) PathFindExtensionA
-@ stdcall PathFindExtensionW (ptr) PathFindExtensionW
-@ stdcall PathFindFileNameA (ptr) PathFindFilenameA
-@ stdcall PathFindFileNameW (ptr) PathFindFilenameW
-@ stub    PathFindNextComponentA
-@ stub    PathFindNextComponentW
-@ stdcall PathFindOnPathA (ptr ptr) PathFindOnPathA
-@ stdcall PathFindOnPathW (ptr ptr) PathFindOnPathW
+@ stdcall PathFileExistsW (wstr) PathFileExistsW
+@ stdcall PathFindExtensionA (str) PathFindExtensionA
+@ stdcall PathFindExtensionW (wstr) PathFindExtensionW
+@ stdcall PathFindFileNameA (str) PathFindFileNameA
+@ stdcall PathFindFileNameW (wstr) PathFindFileNameW
+@ stdcall PathFindNextComponentA (str) PathFindNextComponentA
+@ stdcall PathFindNextComponentW (wstr) PathFindNextComponentW
+@ stdcall PathFindOnPathA (str ptr) PathFindOnPathA
+@ stdcall PathFindOnPathW (wstr ptr) PathFindOnPathW
 @ stdcall PathGetArgsA (str) PathGetArgsA
-@ stdcall PathGetArgsW (str) PathGetArgsW
+@ stdcall PathGetArgsW (wstr) PathGetArgsW
 @ stub    PathGetCharTypeA
 @ stub    PathGetCharTypeW
-@ stdcall PathGetDriveNumberA(str) PathGetDriveNumberA
-@ stdcall PathGetDriveNumberW(str) PathGetDriveNumberW
+@ stdcall PathGetDriveNumberA (str) PathGetDriveNumberA
+@ stdcall PathGetDriveNumberW (wstr) PathGetDriveNumberW
 @ stub    PathIsContentTypeA
 @ stub    PathIsContentTypeW
 @ stdcall PathIsDirectoryA(str) PathIsDirectoryA
@@ -215,44 +215,44 @@
 @ stub    PathIsFileSpecW
 @ stub    PathIsPrefixA
 @ stub    PathIsPrefixW
-@ stdcall PathIsRelativeA (ptr) PathIsRelativeA
-@ stdcall PathIsRelativeW (ptr) PathIsRelativeW
+@ stdcall PathIsRelativeA (str) PathIsRelativeA
+@ stdcall PathIsRelativeW (wstr) PathIsRelativeW
 @ stdcall PathIsRootA(str) PathIsRootA
 @ stdcall PathIsRootW(wstr) PathIsRootW
-@ stub    PathIsSameRootA
-@ stub    PathIsSameRootW
+@ stdcall PathIsSameRootA(str str) PathIsSameRootA
+@ stdcall PathIsSameRootW(wstr wstr) PathIsSameRootW
 @ stub    PathIsSystemFolderA
 @ stub    PathIsSystemFolderW
-@ stdcall PathIsUNCA (ptr) PathIsUNCA
+@ stdcall PathIsUNCA (str) PathIsUNCA
 @ stub    PathIsUNCServerA
 @ stub    PathIsUNCServerShareA
 @ stub    PathIsUNCServerShareW
 @ stub    PathIsUNCServerW
 @ stdcall PathIsUNCW(wstr) PathIsUNCW
 @ stdcall PathIsURLA(str) PathIsURLA
-@ stub    PathIsURLW
+@ stdcall PathIsURLW(wstr) PathIsURLW
 @ stub    PathMakePrettyA
 @ stub    PathMakePrettyW
 @ stub    PathMakeSystemFolderA
 @ stub    PathMakeSystemFolderW
 @ stdcall PathMatchSpecA  (str str) PathMatchSpecA
 @ stdcall PathMatchSpecW  (str str) PathMatchSpecW
-@ stub    PathParseIconLocationA
-@ stub    PathParseIconLocationW
+@ stdcall PathParseIconLocationA (str) PathParseIconLocationA
+@ stdcall PathParseIconLocationW (wstr) PathParseIconLocationW
 @ stdcall PathQuoteSpacesA (ptr) PathQuoteSpacesA
 @ stdcall PathQuoteSpacesW (ptr) PathQuoteSpacesW
 @ stub    PathRelativePathToA
 @ stub    PathRelativePathToW
-@ stub    PathRemoveArgsA
-@ stub    PathRemoveArgsW
-@ stdcall PathRemoveBackslashA (ptr) PathRemoveBackslashA
-@ stdcall PathRemoveBackslashW (ptr) PathRemoveBackslashW
+@ stdcall PathRemoveArgsA(str)PathRemoveArgsA
+@ stdcall PathRemoveArgsW(wstr)PathRemoveArgsW
+@ stdcall PathRemoveBackslashA (str) PathRemoveBackslashA
+@ stdcall PathRemoveBackslashW (wstr) PathRemoveBackslashW
 @ stdcall PathRemoveBlanksA(str) PathRemoveBlanksA
 @ stdcall PathRemoveBlanksW(wstr) PathRemoveBlanksW
-@ stub    PathRemoveExtensionA
-@ stub    PathRemoveExtensionW
+@ stdcall PathRemoveExtensionA(str)PathRemoveExtensionA
+@ stdcall PathRemoveExtensionW(wstr)PathRemoveExtensionW
 @ stdcall PathRemoveFileSpecA (str) PathRemoveFileSpecA
-@ stub    PathRemoveFileSpecW
+@ stdcall PathRemoveFileSpecW (wstr) PathRemoveFileSpecW
 @ stub    PathRenameExtensionA
 @ stub    PathRenameExtensionW
 @ stub    PathSearchAndQualifyA
@@ -261,19 +261,19 @@
 @ stdcall PathSetDlgItemPathW (long long ptr) PathSetDlgItemPathW
 @ stub    PathSkipRootA
 @ stub    PathSkipRootW
-@ stub    PathStripPathA
-@ stub    PathStripPathW
-@ stub    PathStripToRootA
-@ stub    PathStripToRootW
+@ stdcall PathStripPathA(str)PathStripPathA
+@ stdcall PathStripPathW(wstr)PathStripPathW
+@ stdcall PathStripToRootA(str)PathStripToRootA
+@ stdcall PathStripToRootW(wstr)PathStripToRootW
 @ stub    PathUnmakeSystemFolderA
 @ stub    PathUnmakeSystemFolderW
 @ stdcall PathUnquoteSpacesA (str) PathUnquoteSpacesA
-@ stdcall PathUnquoteSpacesW (str) PathUnquoteSpacesW
+@ stdcall PathUnquoteSpacesW (wstr) PathUnquoteSpacesW
 @ stub    SHCreateShellPalette
 @ stub    SHDeleteEmptyKeyA
 @ stub    SHDeleteEmptyKeyW
 @ stdcall SHDeleteKeyA(long str)SHRegDeleteKeyA
-@ stdcall SHDeleteKeyW(long str)SHRegDeleteKeyW
+@ stdcall SHDeleteKeyW(long wstr)SHRegDeleteKeyW
 @ stub    SHDeleteOrphanKeyA
 @ stub    SHDeleteOrphanKeyW
 @ stub    SHDeleteValueA
diff --git a/dlls/shell32/shres.rc b/dlls/shell32/shres.rc
index 0316641..d5ea411 100644
--- a/dlls/shell32/shres.rc
+++ b/dlls/shell32/shres.rc
@@ -129,6 +129,8 @@
 {
 	IDS_CREATEFOLDER_DENIED "Can not create new Folder: Permission denied."
 	IDS_CREATEFOLDER_CAPTION "Error during creating a new folder"
+	IDS_DELETEFOLDER_TEXT "Are you sure you want to delete %1 and all it's subfolders?"
+	IDS_DELETEFOLDER_CAPTION "Confirm file delete"
 }
 
 shv_accel ACCELERATORS
diff --git a/dlls/shell32/shresdef.h b/dlls/shell32/shresdef.h
index dfd2fae..7ac2d72 100644
--- a/dlls/shell32/shresdef.h
+++ b/dlls/shell32/shresdef.h
@@ -24,5 +24,6 @@
 
 #define IDS_CREATEFOLDER_DENIED 30
 #define IDS_CREATEFOLDER_CAPTION 31
-
+#define IDS_DELETEFOLDER_TEXT	32
+#define IDS_DELETEFOLDER_CAPTION 33
 #endif
diff --git a/dlls/shell32/shv_bg_cmenu.c b/dlls/shell32/shv_bg_cmenu.c
index b9b1b73..402fd62 100644
--- a/dlls/shell32/shv_bg_cmenu.c
+++ b/dlls/shell32/shv_bg_cmenu.c
@@ -16,6 +16,7 @@
 #include "shell32_main.h"
 #include "shellfolder.h"
 #include "shell.h" /* DROPFILESTRUCT */
+#include "wine/undocshell.h"
 
 DEFAULT_DEBUG_CHANNEL(shell)
 
diff --git a/include/shell.h b/include/shell.h
index 8a5e5c6..bd43f45 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -65,6 +65,7 @@
 { WORD	cb;	/* nr of bytes in this item */
   BYTE	abID[1];/* first byte in this item */
 } SHITEMID,*LPSHITEMID;
+typedef LPSHITEMID const LPCSHITEMID;
 
 typedef struct 
 { SHITEMID mkid; /* first itemid in list */
@@ -87,94 +88,11 @@
 * SHGetSpecialFolderLocation API
 */
 HRESULT WINAPI SHGetSpecialFolderLocation(HWND, INT, LPITEMIDLIST *);
-/****************************************************************************
-*  string and path functions
-*/
-BOOL WINAPI PathIsRootA(LPCSTR x);
-BOOL WINAPI PathIsRootW(LPCWSTR x);
-#define  PathIsRoot WINELIB_NAME_AW(PathIsRoot)
-BOOL WINAPI PathIsRootAW(LPCVOID x);
-
-LPSTR  WINAPI PathAddBackslashA(LPSTR path);	
-LPWSTR WINAPI PathAddBackslashW(LPWSTR path);	
-#define  PathAddBackslash WINELIB_NAME_AW(PathAddBackslash)
-LPVOID  WINAPI PathAddBackslashAW(LPVOID path);	
-
-BOOL  WINAPI PathQualifyA(LPCSTR path);	
-BOOL WINAPI PathQualifyW(LPCWSTR path);	
-#define  PathQualify WINELIB_NAME_AW(PathQualify)
-BOOL  WINAPI PathQualifyAW(LPCVOID path);	
-
-LPSTR  WINAPI PathQuoteSpacesA(LPCSTR path);	
-LPWSTR WINAPI PathQuoteSpacesW(LPCWSTR path);	
-#define  PathQuoteSpaces WINELIB_NAME_AW(PathQuoteSpaces)
-LPVOID  WINAPI PathQuoteSpacesAW(LPCVOID path);	
-
-LPSTR  WINAPI PathCombineA(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile);
-LPWSTR WINAPI PathCombineW(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile);
-#define  PathCombine WINELIB_NAME_AW(PathCombine)
-LPVOID WINAPI PathCombineAW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile);
-
-LPCSTR WINAPI PathFindExtensionA(LPCSTR path);
-LPCWSTR WINAPI PathFindExtensionW(LPCWSTR path);
-#define  PathFindExtension WINELIB_NAME_AW(PathFindExtension)
-LPCVOID WINAPI PathFindExtensionAW(LPCVOID path); 
-
-LPCSTR WINAPI PathGetExtensionA(LPCSTR path, DWORD y, DWORD x);
-LPCWSTR WINAPI PathGetExtensionW(LPCWSTR path, DWORD y, DWORD x);
-#define  PathGetExtension WINELIB_NAME_AW(PathGetExtension)
-LPCVOID WINAPI PathGetExtensionAW(LPCVOID path, DWORD y, DWORD x); 
-
-LPCSTR WINAPI PathFindFilenameA(LPCSTR path);
-LPCWSTR WINAPI PathFindFilenameW(LPCWSTR path);
-#define  PathFindFilename WINELIB_NAME_AW(PathFindFilename)
-LPCVOID WINAPI PathFindFilenameAW(LPCVOID path); 
-
-BOOL WINAPI PathMatchSpecA(LPCSTR x, LPCSTR y);
-BOOL WINAPI PathMatchSpecW(LPCWSTR x, LPCWSTR y);
-#define  PathMatchSpec WINELIB_NAME_AW(PathMatchSpec)
-BOOL WINAPI PathMatchSpecAW(LPVOID x, LPVOID y);
-
-LPSTR WINAPI PathRemoveBlanksA(LPSTR str);
-LPWSTR WINAPI PathRemoveBlanksW(LPWSTR str);
-#define  PathRemoveBlanks WINELIB_NAME_AW(PathRemoveBlanks)
-LPVOID WINAPI PathRemoveBlanksAW(LPVOID str);
-
-BOOL WINAPI PathIsRelativeA(LPCSTR str);
-BOOL WINAPI PathIsRelativeW(LPCWSTR str);
-#define  PathIsRelative WINELIB_NAME_AW(PathIsRelative)
-BOOL WINAPI PathIsRelativeAW(LPCVOID str);
-
-BOOL WINAPI PathIsUNCA(LPCSTR str);
-BOOL WINAPI PathIsUNCW(LPCWSTR str);
-#define  PathIsUNC WINELIB_NAME_AW(PathIsUNC)
-BOOL WINAPI PathIsUNCAW(LPCVOID str);
-
-BOOL WINAPI PathIsURLA(LPCSTR str);
-BOOL WINAPI PathIsURLW(LPCWSTR str);
-#define  PathIsURL WINELIB_NAME_AW(PathIsURL)
-BOOL WINAPI PathIsURLAW(LPCVOID str);
-
-BOOL WINAPI PathFindOnPathA(LPSTR sFile, LPCSTR sOtherDirs);
-BOOL WINAPI PathFindOnPathW(LPWSTR sFile, LPCWSTR sOtherDirs);
-#define PathFindOnPath WINELIB_NAME_AW(PathFindOnPath)
-BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs);
-
-LPSTR WINAPI StrFormatByteSizeA ( DWORD dw, LPSTR pszBuf, UINT cchBuf );
-LPWSTR WINAPI StrFormatByteSizeW ( DWORD dw, LPWSTR pszBuf, UINT cchBuf );
-#define  StrFormatByteSize WINELIB_NAME_AW(StrFormatByteSize)
-
-DWORD WINAPI PathCleanupSpecA(LPSTR x, LPSTR y);
-DWORD WINAPI PathCleanupSpecW(LPWSTR x, LPWSTR y);
-#define  PathCleanupSpec WINELIB_NAME_AW(PathCleanupSpec)
 
 /****************************************************************************
 *  other functions
 */
 
-LPVOID WINAPI SHAlloc(DWORD len);
-DWORD WINAPI SHFree(LPVOID x);
-
 #define	CSIDL_DESKTOP		0x0000
 #define	CSIDL_PROGRAMS		0x0002
 #define	CSIDL_CONTROLS		0x0003
diff --git a/include/shlobj.h b/include/shlobj.h
index f245399..a1ac588 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -72,13 +72,9 @@
 * IShellView interface
 */
 
-
-
 typedef GUID SHELLVIEWID;
 #define SV_CLASS_NAME   ("SHELLDLL_DefView")
 
-UINT WINAPI SHMapPIDLToSystemImageListIndex(LPSHELLFOLDER sh, LPITEMIDLIST pidl, UINT * pIndex);
-
 /****************************************************************************
  * IShellIcon interface
  */
@@ -341,29 +337,6 @@
 
 DWORD WINAPI SHGetMalloc(LPMALLOC *lpmal) ;
 
-/****************************************************************************
- *	Shell File Menu API
- */
-/* FileMenu_Create nSelHeight */
-#define	FM_FULL_SELHEIGHT	-1;
-#define	FM_DEFAULT_SELHEIGHT	0
-
-/* FileMenu_Create uFlags */
-#define	FMF_SMALL_ICONS		0x00
-#define	FMF_LARGE_ICONS		0x08
-#define	FMF_NO_COLUMN_BREAK	0x10
-
-/* FileMenu_InsertUsingPidl uFlags */
-#define	FMF_NO_EMPTY_ITEM	0x01
-#define	FMF_NO_PROGRAM_GROUPS	0x04
-
-typedef void (CALLBACK * LPFNFMCALLBACK)(LPCITEMIDLIST pidlFolder, LPCITEMIDLIST pidlFile);
-
-/* FileMenu_AppendItem lpszText */
-#define	FM_SEPARATOR		(LPCSTR)1
-#define	FM_BLANK_ICON		-1
-#define	FM_DEFAULT_HEIGHT	0
-
 /**********************************************************************
  * SHGetSettings ()
  */
diff --git a/include/shlwapi.h b/include/shlwapi.h
new file mode 100644
index 0000000..36ffdf6
--- /dev/null
+++ b/include/shlwapi.h
@@ -0,0 +1,36 @@
+#ifndef __WINE_SHLWAPI_H
+#define __WINE_SHLWAPI_H
+
+#include "windef.h"
+#include "wine/obj_queryassociations.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+LPSTR WINAPI PathFindFileNameA(LPCSTR pPath);
+LPWSTR WINAPI PathFindFileNameW(LPCWSTR pPath);
+#define PathFindFileName WINELIB_NAME_AW(PathFindFileName)
+LPVOID WINAPI PathFindFileNameAW(LPCVOID path); 
+
+int WINAPI PathGetDriveNumberA(LPCSTR lpszPath);
+int WINAPI PathGetDriveNumberW(LPCWSTR lpszPath);
+#define PathGetDriveNumber WINELIB_NAME_AW(PathGetDriveNumber)
+
+BOOL WINAPI PathCanonicalizeA(LPSTR lpszDst, LPCSTR lpszSrc);
+BOOL WINAPI PathCanonicalizeW(LPWSTR lpszDst, LPCWSTR lpszSrc);
+#define PathCanonicalize WINELIB_NAME_AW(PathCanonicalize)
+
+LPSTR WINAPI PathFindNextComponentA(LPCSTR pszPath);
+LPWSTR WINAPI PathFindNextComponentW(LPCWSTR pszPath);
+#define PathFindNextComponent WINELIB_NAME_AW(PathFindNextComponent)
+
+BOOL WINAPI PathIsURLA(LPCSTR pszPath);
+BOOL WINAPI PathIsURLW(LPCWSTR pszPath);
+#define PathIsURL WINELIB_NAME_AW(PathIsURL)
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* defined(__cplusplus) */
+
+#endif /* __WINE_SHLWAPI_H */
diff --git a/include/wine/obj_shellbrowser.h b/include/wine/obj_shellbrowser.h
index 6b1a9ae..368cf50 100644
--- a/include/wine/obj_shellbrowser.h
+++ b/include/wine/obj_shellbrowser.h
@@ -58,14 +58,6 @@
 #define FCT_CONFIGABLE  0x0002
 #define FCT_ADDTOEND    0x0004
 
-/* undocumented, found in the web posted by Chris Becke */ 
-#define CWM_SETPATH	(WM_USER+2)
-#define CWM_WANTIDLE	(WM_USER+3)
-#define CWM_GETSETCURRENTINFO	(WM_USER+4)
-#define CWM_SELECTITEM	(WM_USER+5)
-#define CWM_STOPWAITING	(WM_USER+6)
-#define CWM_GETISHELLBROWSER (WM_USER+7)
-
 #define ICOM_INTERFACE IShellBrowser
 #define IShellBrowser_METHODS \
 	ICOM_METHOD2(HRESULT, InsertMenusSB, HMENU, hmenuShared, LPOLEMENUGROUPWIDTHS, lpMenuWidths) \
diff --git a/include/wine/undocshell.h b/include/wine/undocshell.h
index 1bdd039..5ae92a5 100644
--- a/include/wine/undocshell.h
+++ b/include/wine/undocshell.h
@@ -2,8 +2,11 @@
 #define __WINE_UNDOCSHELL_H
 
 #include "windef.h"
-#include "shell.h"
-#include "wine/obj_shellfolder.h"	/* strret */
+//#include "shell.h"
+#include "commctrl.h"
+#include "wine/obj_shellfolder.h"
+#include "wine/obj_shellview.h"
+#include "wine/obj_dragdrop.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -14,46 +17,113 @@
  */
 LPITEMIDLIST WINAPI ILClone (LPCITEMIDLIST pidl);
 LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl);
-LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST iil1,LPCITEMIDLIST iil2);
+
+LPITEMIDLIST WINAPI ILCombine(
+	LPCITEMIDLIST iil1,
+	LPCITEMIDLIST iil2);
 
 DWORD WINAPI ILGetSize(LPITEMIDLIST pidl);
 
 LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl);
 LPITEMIDLIST WINAPI ILFindLastID(LPITEMIDLIST pidl);
 BOOL WINAPI ILRemoveLastID(LPCITEMIDLIST pidl);
-LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2);
 
-BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
+LPITEMIDLIST WINAPI ILFindChild(
+	LPCITEMIDLIST pidl1,
+	LPCITEMIDLIST pidl2);
 
-BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl,LPSTR path);
+LPITEMIDLIST WINAPI ILAppendID(
+	LPITEMIDLIST pidl,
+	LPCSHITEMID lpItemID,
+	BOOL bAddToEnd);
+
+BOOL WINAPI ILIsEqual(
+	LPCITEMIDLIST pidl1,
+	LPCITEMIDLIST pidl2);
+
+BOOL WINAPI ILIsParent(
+	LPCITEMIDLIST pidlParent,
+	LPCITEMIDLIST pidlChild,
+	BOOL bImmediate);
+
+BOOL WINAPI ILGetDisplayName(
+	LPCITEMIDLIST pidl,
+	LPSTR path);
 
 DWORD WINAPI ILFree(LPITEMIDLIST pidl);
 
+HRESULT WINAPI ILSaveToStream(
+	LPSTREAM pstrm,
+	LPCITEMIDLIST pidl);
+
+HRESULT WINAPI ILLoadFromStream(
+	LPSTREAM pstrm,
+	LPITEMIDLIST *ppidl);
+
+LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl);
+void WINAPI ILGlobalFree(LPCITEMIDLIST pidl);
+
 LPITEMIDLIST WINAPI SHSimpleIDListFromPathA (LPCSTR lpszPath);
 LPITEMIDLIST WINAPI SHSimpleIDListFromPathW (LPCWSTR lpszPath);
 LPITEMIDLIST WINAPI SHSimpleIDListFromPathAW (LPCVOID lpszPath);
 
-HRESULT WINAPI SHILCreateFromPathA (LPCSTR path, LPITEMIDLIST * ppidl, DWORD *attributes);
-HRESULT WINAPI SHILCreateFromPathW (LPCWSTR path, LPITEMIDLIST * ppidl, DWORD *attributes);
-HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD *attributes);
+HRESULT WINAPI SHILCreateFromPathA (
+	LPCSTR path,
+	LPITEMIDLIST * ppidl,
+	DWORD *attributes);
+
+HRESULT WINAPI SHILCreateFromPathW (
+	LPCWSTR path,
+	LPITEMIDLIST * ppidl,
+	DWORD *attributes);
+
+HRESULT WINAPI SHILCreateFromPathAW (
+	LPCVOID path,
+	LPITEMIDLIST * ppidl,
+	DWORD *attributes);
 
 LPITEMIDLIST WINAPI ILCreateFromPathA(LPCSTR path);
 LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path);
 LPITEMIDLIST WINAPI ILCreateFromPathAW(LPCVOID path);
 
+HRESULT WINAPI SHBindToParent(
+	LPCITEMIDLIST pidl,
+	REFIID riid,
+	LPVOID *ppv,
+	LPCITEMIDLIST *ppidlLast);
+
 /*
 	string functions
 */
-HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast);
+HRESULT WINAPI StrRetToStrNA (
+	LPVOID dest,
+	DWORD len,
+	LPSTRRET src,
+	LPITEMIDLIST pidl);
 
-HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl);
-HRESULT WINAPI StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl);
-HRESULT WINAPI StrRetToStrNAW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl);
+HRESULT WINAPI StrRetToStrNW (
+	LPVOID dest,
+	DWORD len,
+	LPSTRRET src,
+	LPITEMIDLIST pidl);
 
-HRESULT WINAPI StrRetToBufA (LPSTRRET src, LPITEMIDLIST pidl, LPSTR dest, DWORD len);
-HRESULT WINAPI StrRetToBufW (LPSTRRET src, LPITEMIDLIST pidl, LPWSTR dest, DWORD len);
+HRESULT WINAPI StrRetToStrNAW (
+	LPVOID dest,
+	DWORD len,
+	LPSTRRET src,
+	LPITEMIDLIST pidl);
 
+HRESULT WINAPI StrRetToBufA (
+	LPSTRRET src,
+	LPITEMIDLIST pidl,
+	LPSTR dest,
+	DWORD len);
 
+HRESULT WINAPI StrRetToBufW (
+	LPSTRRET src,
+	LPITEMIDLIST pidl,
+	LPWSTR dest,
+	DWORD len);
 
 /****************************************************************************
 * SHChangeNotifyRegister API
@@ -78,16 +148,822 @@
 } DWORDITEMID;
 
 HANDLE WINAPI SHChangeNotifyRegister(
-    HWND hwnd,
-    LONG dwFlags,
-    LONG wEventMask,
-    DWORD uMsg,
-    int cItems,
-    LPCNOTIFYREGISTER lpItems);
+	HWND hwnd,
+	LONG dwFlags,
+	LONG wEventMask,
+	DWORD uMsg,
+	int cItems,
+	LPCNOTIFYREGISTER lpItems);
 
-BOOL WINAPI SHChangeNotifyDeregister( HANDLE hNotify);
+BOOL WINAPI SHChangeNotifyDeregister(HANDLE hNotify);
+
+HANDLE WINAPI SHChangeNotification_Lock(
+	HANDLE hMemoryMap,
+	DWORD dwProcessId,
+	LPCITEMIDLIST **lppidls,
+	LPLONG lpwEventId);
+
+BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock);
+
+/****************************************************************************
+ * Shell Common Dialogs
+ */
+
+BOOL WINAPI PickIconDlg(
+	HWND hwndOwner,
+	LPSTR lpstrFile,
+	DWORD nMaxFile,
+	LPDWORD lpdwIconIndex);
+
+/* RunFileDlg flags */
+#define RFF_NOBROWSE       0x01 
+#define RFF_NODEFAULT      0x02
+#define RFF_CALCDIRECTORY  0x04
+#define RFF_NOLABEL        0x08
+#define RFF_NOSEPARATEMEM  0x20  /* NT only */
+
+/* RunFileFlg notification structure */
+typedef struct
+{
+  NMHDR   hdr;
+  LPCSTR  lpFile;
+  LPCSTR  lpDirectory; 
+  int     nShow;
+} NM_RUNFILEDLG, * LPNM_RUNFILEDLG;
+
+/* RunFileDlg notification return values */
+#define RF_OK      0x00
+#define RF_CANCEL  0x01
+#define RF_RETRY   0x02
+
+void WINAPI RunFileDlg(
+	HWND hwndOwner,
+	HICON hIcon,
+	LPCSTR lpstrDirectory,
+	LPCSTR lpstrTitle,
+	LPCSTR lpstrDescription,
+	UINT uFlags);
+
+void WINAPI ExitWindowsDialog(HWND hwndOwner);
+
+int  WINAPI RestartDialog(
+	HWND hwndOwner,
+	LPCSTR lpstrReason,
+	UINT uFlags); 
+
+BOOL WINAPI GetFileNameFromBrowse(
+	HWND hwndOwner,
+	LPSTR lpstrFile,
+	DWORD nMaxFile,
+	LPCSTR lpstrInitialDir,
+	LPCSTR lpstrDefExt,
+	LPCSTR lpstrFilter,
+	LPCSTR lpstrTitle);
+
+BOOL WINAPI SHFindFiles(
+	LPCITEMIDLIST pidlRoot,
+	LPCITEMIDLIST pidlSavedSearch);
+
+BOOL WINAPI SHFindComputer(
+	LPCITEMIDLIST pidlRoot,
+	LPCITEMIDLIST pidlSavedSearch);
+ 
+/* SHObjectProperties flags */
+#define OPF_PRINTERNAME  0x01
+#define OPF_PATHNAME     0x02
+
+BOOL WINAPI SHObjectProperties(
+	HWND hwndOwner,
+	UINT uFlags,
+	LPCSTR lpstrName,
+	LPCSTR lpstrParameters);
+
+void WINAPI SHHandleDiskFull(HWND hwndOwner,
+	UINT uDrive);
+
+int  WINAPI SHOutOfMemoryMessageBox(
+	HWND hwndOwner,
+	LPCSTR lpCaption,
+	UINT uType);
+
+DWORD WINAPI SHNetConnectionDialog(
+	HWND hwndOwner,
+	LPCSTR lpstrRemoteName,
+	DWORD dwType);
+
+int WINAPIV ShellMessageBoxA(
+	HINSTANCE hInstance,
+	HWND hWnd,
+	LPCSTR lpText,
+	LPCSTR lpCaption,
+	UINT uType,
+	...);
+
+int WINAPIV ShellMessageBoxW(
+	HINSTANCE hInstance,
+	HWND hWnd,
+	LPCWSTR lpText,
+	LPCWSTR lpCaption,
+	UINT uType,
+	...);
+
+#define ShellMessageBox WINELIB_NAME_AW(ShellMessageBox)
+
+/****************************************************************************
+ * Memory Routines
+ */
+
+LPVOID WINAPI SHAlloc(ULONG cb);
+void WINAPI SHFree(LPVOID pv);
+
+HANDLE WINAPI SHAllocShared(
+	LPVOID pv,
+	ULONG cb,
+	DWORD pid);
+
+BOOL WINAPI SHFreeShared(
+	HANDLE hMem,
+	DWORD pid);
+
+LPVOID WINAPI SHLockShared(
+	HANDLE hMem,
+	DWORD pid);
+
+BOOL WINAPI SHUnlockShared(LPVOID pv);
+
+/****************************************************************************
+ * Cabinet Window Messages
+ */
+
+#define CWM_SETPATH           (WM_USER + 2)
+#define CWM_WANTIDLE	      (WM_USER + 3)
+#define CWM_GETSETCURRENTINFO (WM_USER + 4)
+#define CWM_SELECTITEM        (WM_USER + 5)
+#define CWM_SELECTITEMSTR     (WM_USER + 6)
+#define CWM_GETISHELLBROWSER  (WM_USER + 7)
+#define CWM_TESTPATH          (WM_USER + 9)
+#define CWM_STATECHANGE       (WM_USER + 10)
+#define CWM_GETPATH           (WM_USER + 12)
+
+/* CWM_TESTPATH types */
+#define CWTP_ISEQUAL  0 
+#define CWTP_ISCHILD  1 
+
+/* CWM_TESTPATH structure */
+typedef struct 
+{
+	DWORD dwType;
+	ITEMIDLIST idl;
+} CWTESTPATHSTRUCT,* LPCWTESTPATHSTRUCT;
+
+/****************************************************************************
+ * System Imagelist Routines
+ */
+
+int WINAPI Shell_GetCachedImageIndex(
+	LPCSTR lpszFileName,
+	UINT nIconIndex,
+	BOOL bSimulateDoc);
+
+BOOL WINAPI Shell_GetImageLists(
+	HIMAGELIST *lphimlLarge,
+	HIMAGELIST *lphimlSmall);
+
+HICON WINAPI SHGetFileIcon(
+	DWORD dwReserved,
+	LPCSTR lpszPath,
+	DWORD dwFileAttributes,
+	UINT uFlags);
+
+int WINAPI SHMapPIDLToSystemImageListIndex(
+	LPSHELLFOLDER psf,
+	LPCITEMIDLIST pidl,
+	UINT * pOpenIndex);
+
+BOOL WINAPI FileIconInit(BOOL bFullInit);
+
+/****************************************************************************
+ * File Menu Routines
+ */
+/* FileMenu_Create nSelHeight constants */
+#define FM_DEFAULT_SELHEIGHT  -1
+#define FM_FULL_SELHEIGHT     0
+
+/* FileMenu_Create flags */
+#define FMF_SMALL_ICONS      0x00
+#define FMF_LARGE_ICONS      0x08
+#define FMF_NO_COLUMN_BREAK  0x10
+
+HMENU WINAPI FileMenu_Create(
+	COLORREF crBorderColor,
+	int nBorderWidth,
+	HBITMAP hBorderBmp,
+	int nSelHeight,
+	UINT uFlags);
+
+void WINAPI FileMenu_Destroy(HMENU hMenu);
+
+/* FileMenu_AppendItem constants */
+#define FM_SEPARATOR       (LPCSTR)1
+#define FM_BLANK_ICON      -1
+#define FM_DEFAULT_HEIGHT  0
+
+BOOL WINAPI FileMenu_AppendItem(
+	HMENU hMenu,
+	LPCSTR lpszText,
+	UINT uID,
+	int iIcon,
+	HMENU hMenuPopup,
+	int nItemHeight);
+
+/* FileMenu_InsertUsingPidl flags */
+#define FMF_NO_EMPTY_ITEM      0x01
+#define FMF_NO_PROGRAM_GROUPS  0x04
+
+/* FileMenu_InsertUsingPidl callback function */
+typedef void (CALLBACK *LPFNFMCALLBACK)(LPCITEMIDLIST pidlFolder, LPCITEMIDLIST pidlFile);
+
+int WINAPI FileMenu_InsertUsingPidl(
+	HMENU hMenu,
+	UINT uID,
+	LPCITEMIDLIST pidl,
+	UINT uFlags,
+	UINT uEnumFlags,
+	LPFNFMCALLBACK lpfnCallback);
+
+int WINAPI FileMenu_ReplaceUsingPidl(
+	HMENU hMenu,
+	UINT uID,
+	LPCITEMIDLIST pidl,
+	UINT uEnumFlags,
+	LPFNFMCALLBACK lpfnCallback);
+
+void WINAPI FileMenu_Invalidate(HMENU hMenu);
+
+HMENU WINAPI FileMenu_FindSubMenuByPidl(
+	HMENU hMenu,
+	LPCITEMIDLIST pidl);
+
+BOOL WINAPI FileMenu_TrackPopupMenuEx(
+	HMENU hMenu,
+	UINT uFlags,
+	int x,
+	int y,
+	HWND hWnd,
+	LPTPMPARAMS lptpm);
+
+BOOL WINAPI FileMenu_GetLastSelectedItemPidls(
+	UINT uReserved,
+	LPITEMIDLIST *ppidlFolder,
+	LPITEMIDLIST *ppidlItem);
+
+LRESULT WINAPI FileMenu_MeasureItem(
+	HWND hWnd,
+	LPMEASUREITEMSTRUCT lpmis);
+
+LRESULT WINAPI FileMenu_DrawItem(
+	HWND hWnd,
+	LPDRAWITEMSTRUCT lpdis);
+
+BOOL WINAPI FileMenu_InitMenuPopup(HMENU hMenu);
+
+void WINAPI FileMenu_AbortInitMenu(void);
+
+LRESULT WINAPI FileMenu_HandleMenuChar(
+	HMENU hMenu,
+	WPARAM wParam);
+
+BOOL WINAPI FileMenu_DeleteAllItems(HMENU hMenu);
+
+BOOL WINAPI FileMenu_DeleteItemByCmd(
+	HMENU hMenu,
+	UINT uID);
+
+BOOL WINAPI FileMenu_DeleteItemByIndex(
+	HMENU hMenu,
+	UINT uPos);
+
+BOOL WINAPI FileMenu_DeleteMenuItemByFirstID(
+	HMENU hMenu,
+	UINT uID);
+
+BOOL WINAPI FileMenu_DeleteSeparator(HMENU hMenu);
+
+BOOL WINAPI FileMenu_EnableItemByCmd(
+	HMENU hMenu,
+	UINT uID,
+	BOOL bEnable);
+
+DWORD WINAPI FileMenu_GetItemExtent(
+	HMENU hMenu,
+	UINT uPos);
+
+int WINAPI FileMenu_AppendFilesForPidl(
+	HMENU hMenu,
+	LPCITEMIDLIST pidl,
+	BOOL bAddSeparator);
+
+int WINAPI FileMenu_AddFilesForPidl(
+	HMENU hMenu,
+	UINT uReserved,
+	UINT uID,
+	LPCITEMIDLIST pidl,
+	UINT uFlags,
+	UINT uEnumFlags,
+	LPFNFMCALLBACK lpfnCallback);
+
+/****************************************************************************
+ * Drag And Drop Routines
+ */
+HRESULT WINAPI SHLoadOLE(DWORD dwFlags);
+
+HRESULT WINAPI SHRegisterDragDrop(
+	HWND hWnd,
+	LPDROPTARGET lpDropTarget);
+
+HRESULT WINAPI SHRevokeDragDrop(HWND hWnd);
+
+HRESULT WINAPI SHDoDragDrop(
+	HWND hWnd,
+	LPDATAOBJECT lpDataObject,
+	LPDROPSOURCE lpDropSource,
+	DWORD dwOKEffect,
+	LPDWORD pdwEffect);
+
+BOOL WINAPI DAD_DragEnter(HWND hWnd);
+
+BOOL WINAPI DAD_DragEnterEx(
+	HWND hWnd,
+	POINT pt);
+
+BOOL WINAPI DAD_DragMove(POINT pt);
+
+/* DAD_AutoScroll return values */
+#define DAD_SCROLL_UP    1
+#define DAD_SCROLL_DOWN  2
+#define DAD_SCROLL_LEFT  4
+#define DAD_SCROLL_RIGHT 8
+
+/* DAD_AutoScroll sample structure */
+typedef struct 
+{
+	DWORD  dwCount;
+	DWORD  dwLastTime;
+	BOOL   bWrapped;
+	POINT  aptPositions[3];
+	DWORD  adwTimes[3];
+} SCROLLSAMPLES, *LPSCROLLSAMPLES;
+
+DWORD WINAPI DAD_AutoScroll(HWND hWnd,
+	LPSCROLLSAMPLES lpSamples,
+	LPPOINT lppt);
+
+BOOL WINAPI DAD_DragLeave();
+
+BOOL WINAPI DAD_SetDragImageFromListView(
+	HWND hWnd,
+	POINT pt);
+
+BOOL WINAPI DAD_SetDragImage(
+	HIMAGELIST himlTrack,
+	LPPOINT lppt);
+
+BOOL WINAPI DAD_ShowDragImage(BOOL bShow);
+
+HRESULT WINAPI SHCreateStdEnumFmtEtc(
+	DWORD cFormats,
+	const FORMATETC *lpFormats,
+	LPENUMFORMATETC *ppenumFormatetc);
+
+HRESULT WINAPI CIDLData_CreateFromIDArray(
+	LPCITEMIDLIST pidlFolder,
+	DWORD cpidlFiles,
+	LPCITEMIDLIST *lppidlFiles,
+	LPDATAOBJECT *ppdataObject);
+
+/****************************************************************************
+ * Path Manipulation Routines
+ */
+
+LPSTR WINAPI PathAppend(
+	LPSTR lpszPath1,
+	LPCSTR lpszPath2);
+
+LPSTR  WINAPI PathCombineA(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile);
+LPWSTR WINAPI PathCombineW(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile);
+#define  PathCombine WINELIB_NAME_AW(PathCombine)
+LPVOID WINAPI PathCombineAW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile);
+
+LPSTR  WINAPI PathAddBackslashA(LPSTR path);	
+LPWSTR WINAPI PathAddBackslashW(LPWSTR path);	
+#define  PathAddBackslash WINELIB_NAME_AW(PathAddBackslash)
+LPVOID  WINAPI PathAddBackslashAW(LPVOID path);	
+
+LPSTR WINAPI PathRemoveBackslashA(LPSTR lpszPath);
+LPWSTR WINAPI PathRemoveBackslashW(LPWSTR lpszPath);
+#define  PathRemoveBackslash WINELIB_NAME_AW(PathRemoveBackslash)
+
+LPSTR WINAPI PathBuildRoot(
+	LPSTR lpszPath,
+	int drive);
+
+LPSTR WINAPI PathFindExtensionA(LPCSTR path);
+LPWSTR WINAPI PathFindExtensionW(LPCWSTR path);
+#define  PathFindExtension WINELIB_NAME_AW(PathFindExtension)
+LPVOID WINAPI PathFindExtensionAW(LPCVOID path); 
+
+LPSTR WINAPI PathGetExtensionA(LPCSTR lpszPath);
+LPWSTR WINAPI PathGetExtensionW(LPCWSTR lpszPath);
+#define  PathGetExtension WINELIB_NAME_AW(PathGetExtension)
+LPVOID WINAPI PathGetExtensionAW(LPCVOID lpszPath); 
+
+LPSTR WINAPI PathGetArgs(LPCSTR lpszPath);
+
+BOOL WINAPI PathRemoveFileSpec(LPSTR lpszPath);
+
+LPSTR WINAPI PathGetShortPath(LPSTR lpszPath);
+
+LPSTR WINAPI PathRemoveBlanksA(LPSTR lpszPath);
+LPWSTR WINAPI PathRemoveBlanksW(LPWSTR lpszPath);
+#define  PathRemoveBlanks WINELIB_NAME_AW(PathRemoveBlanks)
+LPVOID WINAPI PathRemoveBlanksAW(LPVOID lpszPath);
+
+LPSTR  WINAPI PathQuoteSpacesA(LPCSTR path);	
+LPWSTR WINAPI PathQuoteSpacesW(LPCWSTR path);	
+#define  PathQuoteSpaces WINELIB_NAME_AW(PathQuoteSpaces)
+LPVOID  WINAPI PathQuoteSpacesAW(LPCVOID path);	
+
+void WINAPI PathUnquoteSpaces(LPSTR lpszPath);
+
+BOOL WINAPI PathIsUNCA(LPCSTR lpszPath);
+BOOL WINAPI PathIsUNCW(LPCWSTR lpszPath);
+#define  PathIsUNC WINELIB_NAME_AW(PathIsUNC)
+BOOL WINAPI PathIsUNCAW(LPCVOID lpszPath);
+
+BOOL WINAPI PathIsRelativeA(LPCSTR lpszPath);
+BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath);
+#define  PathIsRelative WINELIB_NAME_AW(PathIsRelative)
+BOOL WINAPI PathIsRelativeAW(LPCVOID lpszPath);
+
+BOOL WINAPI PathIsRootA(LPCSTR x);
+BOOL WINAPI PathIsRootW(LPCWSTR x);
+#define  PathIsRoot WINELIB_NAME_AW(PathIsRoot)
+BOOL WINAPI PathIsRootAW(LPCVOID x);
+
+BOOL WINAPI PathIsExe(LPCSTR lpszPath);
+
+BOOL WINAPI PathIsDirectory(LPCSTR lpszPath);
+
+BOOL WINAPI PathFileExists(LPCSTR lpszPath);
+
+BOOL WINAPI PathMatchSpecA(
+	LPCSTR lpszPath,
+	LPCSTR lpszSpec);
+BOOL WINAPI PathMatchSpecW(
+	LPCWSTR lpszPath,
+	LPCWSTR lpszSpec);
+#define  PathMatchSpec WINELIB_NAME_AW(PathMatchSpec)
+BOOL WINAPI PathMatchSpecAW(LPVOID lpszPath, LPVOID lpszSpec);
+
+BOOL WINAPI PathMakeUniqueName(
+	LPSTR lpszBuffer, 
+	DWORD dwBuffSize,
+	LPCSTR lpszShortName,
+	LPCSTR lpszLongName, 
+	LPCSTR lpszPathName);
+
+BOOL WINAPI PathYetAnotherMakeUniqueName(
+	LPSTR lpszBuffer,
+	LPCSTR lpszPathName,
+	LPCSTR lpszShortName,
+	LPCSTR lpszLongName);
+
+BOOL WINAPI PathFindOnPath(
+	LPSTR lpszFile, 
+	LPCSTR *alpszPaths);
+
+/* PathCleanupSpec return values */
+#define PCS_REPLACEDCHARS  0x00000001
+#define PCS_REMOVEDCHARS   0x00000002
+#define PCS_SHORTENED      0x00000004
+#define PCS_PATHTOOLONG    0x80000008
+
+DWORD WINAPI PathCleanupSpec(
+	LPCSTR lpszPath, 
+	LPSTR lpszFile);
+
+BOOL  WINAPI PathQualifyA(LPCSTR path);	
+BOOL WINAPI PathQualifyW(LPCWSTR path);	
+#define  PathQualify WINELIB_NAME_AW(PathQualify)
+BOOL  WINAPI PathQualifyAW(LPCVOID path);	
 
 
+/* PathResolve flags */
+#define PRF_CHECKEXISTANCE  0x01
+#define PRF_EXECUTABLE      0x02
+#define PRF_QUALIFYONPATH   0x04
+#define PRF_WINDOWS31       0x08
+
+BOOL WINAPI PathResolve(
+	LPSTR lpszPath,
+	LPCSTR *alpszPaths, 
+	DWORD dwFlags);
+
+BOOL WINAPI PathSetDlgItemPath(
+	HWND hDlg,
+	int nIDDlgItem, 
+	LPCSTR lpszPath);
+
+/* PathProcessCommand flags */
+#define PPCF_QUOTEPATH        0x01 /* implies PPCF_INCLUDEARGS */
+#define PPCF_INCLUDEARGS      0x02
+#define PPCF_NODIRECTORIES    0x10
+#define PPCF_DONTRESOLVE      0x20
+#define PPCF_PATHISRELATIVE   0x40
+
+int WINAPI PathProcessCommand(
+	LPCWSTR lpszPath,
+	LPWSTR lpszBuff, 
+	DWORD dwBuffSize,
+	DWORD dwFlags);
+
+void WINAPI PathStripPath(LPWSTR lpszPath);
+
+BOOL WINAPI PathStripToRoot(LPWSTR lpszPath);
+
+void WINAPI PathRemoveArgs(LPWSTR lpszPath);
+
+void WINAPI PathRemoveExtension(LPWSTR lpszPath);
+
+int WINAPI PathParseIconLocation(LPWSTR lpszPath);
+
+BOOL WINAPI PathIsSameRoot(
+	LPCWSTR lpszPath1,
+	LPCWSTR lpszPath2);
+
+BOOL WINAPI PathFindOnPathA(LPSTR sFile, LPCSTR sOtherDirs);
+BOOL WINAPI PathFindOnPathW(LPWSTR sFile, LPCWSTR sOtherDirs);
+#define PathFindOnPath WINELIB_NAME_AW(PathFindOnPath)
+BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs);
+
+LPSTR WINAPI StrFormatByteSizeA ( DWORD dw, LPSTR pszBuf, UINT cchBuf );
+LPWSTR WINAPI StrFormatByteSizeW ( DWORD dw, LPWSTR pszBuf, UINT cchBuf );
+#define  StrFormatByteSize WINELIB_NAME_AW(StrFormatByteSize)
+
+DWORD WINAPI PathCleanupSpecA(LPSTR x, LPSTR y);
+DWORD WINAPI PathCleanupSpecW(LPWSTR x, LPWSTR y);
+#define  PathCleanupSpec WINELIB_NAME_AW(PathCleanupSpec)
+
+/****************************************************************************
+ * Shell Namespace Routines
+ */
+
+/* SHCreateShellFolderViewEx callback function */
+typedef HRESULT (CALLBACK* LPFNSFVCALLBACK)(
+	DWORD dwUser,
+	LPSHELLFOLDER pshf,
+	HWND hWnd,
+	UINT uMsg,
+	WPARAM wParam,
+	LPARAM lParam);
+
+/* SHCreateShellFolderViewEx structure */
+typedef struct 
+{
+  DWORD            dwSize;
+  LPSHELLFOLDER    pshf;
+  DWORD            dwUser;
+  LPCITEMIDLIST    pidlFolder;
+  DWORD            dwEventId;
+  LPFNSFVCALLBACK  lpfnCallback;
+  UINT             uViewMode;
+} SHELLFOLDERVIEWINFO, * LPSHELLFOLDERVIEWINFO;
+typedef const SHELLFOLDERVIEWINFO * LPCSHELLFOLDERVIEWINFO;
+
+HRESULT WINAPI SHCreateShellFolderViewEx(
+	LPCSHELLFOLDERVIEWINFO pshfvi,
+	LPSHELLVIEW *ppshv);
+
+/* SHCreateShellFolderViewEx callback messages */
+#define SFVCB_ADDTOMENU           0x0001
+#define SFVCB_INVOKECOMMAND       0x0002
+#define SFVCB_GETMENUHELP         0x0003
+#define SFVCB_GETTOOLBARTIP       0x0004
+#define SFVCB_GETTOOLBARINFO      0x0005
+#define SFVCB_ADDTOOLBARITEMS     0x0006
+#define SFVCB_INITMENUPOPUP       0x0007
+#define SFVCB_SELECTIONCHANGED    0x0008
+#define SFVCB_DRAWMENUITEM        0x0009
+#define SFVCB_MEASUREMENUITEM     0x000A
+#define SFVCB_EXITMENULOOP        0x000B
+#define SFVCB_VIEWRELEASE         0x000C
+#define SFVCB_GETNAMELENGTH       0x000D
+#define SFVCB_CHANGENOTIFY        0x000E
+#define SFVCB_WINDOWCREATED       0x000F
+#define SFVCB_WINDOWCLOSING       0x0010
+#define SFVCB_LISTREFRESHED       0x0011
+#define SFVCB_WINDOWFOCUSED       0x0012
+#define SFVCB_REGISTERCOPYHOOK    0x0014
+#define SFVCB_COPYHOOKCALLBACK    0x0015
+#define SFVCB_GETDETAILSOF        0x0017
+#define SFVCB_COLUMNCLICK         0x0018
+#define SFVCB_GETCHANGENOTIFYPIDL 0x0019
+#define SFVCB_GETESTIMATEDCOUNT   0x001A
+#define SFVCB_ADJUSTVIEWMODE      0x001B
+#define SFVCB_REMOVEFROMMENU      0x001C
+#define SFVCB_ADDINGOBJECT        0x001D
+#define SFVCB_REMOVINGOBJECT      0x001E
+#define SFVCB_UPDATESTATUSBAR     0x001F
+#define SFVCB_ISSLOWREFRESH       0x0020
+#define SFVCB_GETCOMMANDDIR       0x0021
+#define SFVCB_GETCOLUMNSTREAM     0x0022
+#define SFVCB_CANSELECTALL        0x0023
+#define SFVCB_DRAGSUCCEEDED       0x0024
+#define SFVCB_ISSTRICTREFRESH     0x0025
+#define SFVCB_ISCHILDOBJECT       0x0026
+
+/* Generic structure used by several messages */
+typedef struct 
+{
+  DWORD          dwReserved;
+  DWORD          dwReserved2;
+  LPCITEMIDLIST  pidl;
+  LPDWORD        lpdwUser;
+} SFVCBINFO, * LPSFVCBINFO;
+typedef const SFVCBINFO * LPCSFVCBINFO;
+
+/* SFVCB_ADDTOMENU structure */
+typedef struct  
+{
+  HMENU  hMenu;
+  UINT   indexMenu;
+  UINT   idCmdFirst;
+  UINT   idCmdLast;
+} SFVMENUINFO, * LPSFVMENUINFO;
+
+/* SFVCB_GETTOOLBARINFO structure */
+typedef struct 
+{
+  UINT  nButtons;
+  UINT  uFlags;
+} SFVTOOLBARINFO, * LPSFVTOOLBARINFO;
+
+/* SFVTOOLBARINFO flags */
+typedef enum 
+{
+  SFVTI_ADDTOEND   = 0,
+  SFVTI_ADDTOFRONT = 1,
+  SFVTI_OVERWRITE  = 2
+} SFVTIF; 
+
+/* SFVCB_SELECTIONCHANGED structure */
+typedef struct 
+{
+  UINT           uOldState;
+  UINT           uNewState;
+  LPCITEMIDLIST  pidl;
+  LPDWORD        lpdwUser;
+} SFVSELECTSTATE, * LPSFVSELECTSTATE;
+typedef const SFVSELECTSTATE * LPCSFVSELECTSTATE;
+
+/* SFVCB_COPYHOOKCALLBACK structure */
+typedef struct 
+{
+  HWND    hwnd;
+  UINT    wFunc;
+  UINT    wFlags;
+  LPCSTR  pszSrcFile;
+  DWORD   dwSrcAttribs;
+  LPCSTR  pszDestFile;
+  DWORD   dwDestAttribs;
+} SFVCOPYHOOKINFO, * LPSFVCOPYHOOKINFO;
+typedef const SFVCOPYHOOKINFO * LPCSFVCOPYHOOKINFO;
+
+/* SFVCB_GETDETAILSOF structure */
+typedef struct 
+{
+  LPCITEMIDLIST  pidl;
+  int            fmt;
+  int            cx;
+  STRRET         lpText;
+} SFVCOLUMNINFO, * LPSFVCOLUMNINFO;
+
+int WINAPI SHShellFolderView_Message(
+	HWND hwndCabinet, 
+	DWORD dwMessage,
+	DWORD dwParam); 
+
+/* SHShellFolderView_Message messages */
+#define SFVM_REARRANGE          0x0001
+#define SFVM_GETARRANGECOLUMN   0x0002
+#define SFVM_ADDOBJECT          0x0003
+#define SFVM_GETITEMCOUNT       0x0004
+#define SFVM_GETITEMPIDL        0x0005
+#define SFVM_REMOVEOBJECT       0x0006
+#define SFVM_UPDATEOBJECT       0x0007
+#define SFVM_SETREDRAW          0x0008
+#define SFVM_GETSELECTEDOBJECTS 0x0009
+#define SFVM_ISDROPONSOURCE     0x000A
+#define SFVM_MOVEICONS          0x000B
+#define SFVM_GETDRAGPOINT       0x000C
+#define SFVM_GETDROPPOINT       0x000D
+#define SFVM_SETOBJECTPOS       0x000E
+#define SFVM_ISDROPONBACKGROUND 0x000F
+#define SFVM_CUTOBJECTS         0x0010
+#define SFVM_TOGGLEAUTOARRANGE  0x0011
+#define SFVM_LINEUPICONS        0x0012
+#define SFVM_GETAUTOARRANGE     0x0013
+#define SFVM_GETSELECTEDCOUNT   0x0014
+#define SFVM_GETITEMSPACING     0x0015
+#define SFVM_REFRESHOBJECT      0x0016
+#define SFVM_SETCLIPBOARDPOINTS 0x0017
+
+/****************************************************************************
+ * Misc Stuff
+ */
+
+/* SHWaitForFileToOpen flags */
+#define SHWFF_ADD     0x01
+#define SHWFF_REMOVE  0x02
+#define SHWFF_WAIT    0x04
+
+BOOL WINAPI SHWaitForFileToOpen(
+	LPCITEMIDLIST pidl, 
+	DWORD dwFlags,
+	DWORD dwTimeout);
+
+WORD WINAPI ArrangeWindows(
+	HWND hwndParent,
+	DWORD dwReserved,
+	LPCRECT lpRect,
+	WORD cKids,
+	CONST HWND * lpKids);
+
+/* RegisterShellHook types */
+#define RSH_DEREGISTER        0
+#define RSH_REGISTER          1
+#define RSH_REGISTER_PROGMAN  2
+#define RSH_REGISTER_TASKMAN  3
+
+BOOL WINAPI RegisterShellHook(
+	HWND hWnd,
+	DWORD dwType);
+
+/* SHCreateDefClassObject callback function */
+typedef HRESULT (CALLBACK *LPFNCDCOCALLBACK)(
+	LPUNKNOWN pUnkOuter,
+	REFIID riidObject,
+	LPVOID *ppvObject);
+
+HRESULT WINAPI SHCreateDefClassObject(
+	REFIID riidFactory, 
+	LPVOID *ppvFactory,
+	LPFNCDCOCALLBACK lpfnCallback,
+	LPDWORD lpdwUsage, 
+	REFIID riidObject);
+
+HRESULT WINAPI SHCoCreateInstance(
+	LPCSTR lpszClsid, 
+	REFCLSID rClsid,
+	LPUNKNOWN pUnkOuter,
+	REFIID riid,
+	LPVOID *ppv);
+
+void WINAPI SHFreeUnusedLibraries();
+
+/* SHCreateLinks flags */
+#define SHCLF_PREFIXNAME       0x01
+#define SHCLF_CREATEONDESKTOP  0x02
+
+HRESULT WINAPI SHCreateLinks(
+	HWND hWnd,
+	LPCSTR lpszDir, 
+	LPDATAOBJECT lpDataObject,
+	UINT uFlags,
+	LPITEMIDLIST *lppidlLinks);
+
+/* SHGetNewLinkInfo flags */
+#define SHGNLI_PIDL        0x01
+#define SHGNLI_PREFIXNAME  0x02
+#define SHGNLI_NOUNIQUE    0x04
+
+BOOL WINAPI SHGetNewLinkInfoA(
+	LPCSTR pszLinkTo,
+	LPCSTR pszDir, 
+	LPSTR pszName,
+	BOOL *pfMustCopy,
+	UINT uFlags);
+
+BOOL WINAPI SHGetNewLinkInfoW(
+	LPCWSTR pszLinkTo,
+	LPCWSTR pszDir, 
+	LPWSTR pszName,
+	BOOL *pfMustCopy,
+	UINT uFlags);
+#define SHGetNewLinkInfo WINELIB_NAME_AW(SHGetNewLinkInfo)
+
+/* policy functions */
+BOOL WINAPI SHInitRestricted(LPSTR, LPSTR);
 
 #ifdef __cplusplus
 } /* extern "C" */