- new dll shfolder.dll
- small fixes

diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in
index c482f20..d695e53 100644
--- a/dlls/shell32/Makefile.in
+++ b/dlls/shell32/Makefile.in
@@ -4,13 +4,14 @@
 VPATH     = @srcdir@
 MODULE    = shell32
 SOVERSION = 1.0
-ALTNAMES  = shell shlwapi
+ALTNAMES  = shell shlwapi shfolder
 IMPORTS   = ole32
 
 SPEC_SRCS = \
 	shell.spec \
 	shell32.spec \
-	shlwapi.spec
+	shlwapi.spec \
+	shfolder.spec
 
 C_SRCS = \
 	brsfolder.c \
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec
index 2661515..976ae6d 100644
--- a/dlls/shell32/shell32.spec
+++ b/dlls/shell32/shell32.spec
@@ -20,13 +20,10 @@
    5 stub SHChangeNotifyUpdateEntryList@16
    6 stub CheckEscapesW@8
    7 stdcall CommandLineToArgvW(wstr ptr) CommandLineToArgvW
-   8 stdcall Control_FillCache_RunDLL (long long long long) Control_FillCache_RunDLL
    9 stub PifMgr_OpenProperties@16
   10 stub PifMgr_GetProperties@20
   11 stub PifMgr_SetProperties@20
-  12 stub Control_FillCache_RunDLLA@16
   13 stub PifMgr_CloseProperties@8
-  14 stub Control_FillCache_RunDLLW@16
   15 stdcall ILGetDisplayName(ptr ptr) ILGetDisplayName
   16 stdcall ILFindLastID(ptr) ILFindLastID
   17 stdcall ILRemoveLastID(ptr) ILRemoveLastID
@@ -34,7 +31,6 @@
   19 stdcall ILCloneFirst (ptr) ILCloneFirst
   20 stdcall ILGlobalClone (ptr) ILGlobalClone
   21 stdcall ILIsEqual (ptr ptr) ILIsEqual
-  22 stdcall Control_RunDLL(long long long long) Control_RunDLL # exported by name
   23 stdcall ILIsParent (long long long) ILIsParent
   24 stdcall ILFindChild (long long) ILFindChild
   25 stdcall ILCombine(ptr ptr) ILCombine
@@ -53,8 +49,6 @@
   38 stdcall PathStripPath(ptr)PathStripPathAW
   39 stdcall PathIsUNC (ptr) PathIsUNCAW
   40 stdcall PathIsRelative (ptr) PathIsRelativeAW
-  41 stub Control_RunDLLA@16
-  42 stub Control_RunDLLW@16
   43 stdcall PathIsExe (ptr) PathIsExeAW
   44 stub DoEnvironmentSubstA@8
   45 stdcall PathFileExists(ptr) PathFileExistsAW
@@ -113,7 +107,6 @@
   98 stdcall SHGetRealIDL (long long long) SHGetRealIDL
   99 stdcall SetAppStartingCursor (long long) SetAppStartingCursor
  100 stdcall SHRestricted(long) SHRestricted
- 101 stub DragQueryFileAorW   # exported by name
  102 stdcall SHCoCreateInstance(ptr ptr long ptr ptr) SHCoCreateInstance
  103 stdcall SignalFileOpen(long) SignalFileOpen
  104 stdcall FileMenu_DeleteAllItems(long)FileMenu_DeleteAllItems
@@ -150,7 +143,6 @@
  135 stdcall DragQueryPoint(long ptr) DragQueryPoint
  136 stdcall DAD_SetDragImage(long long) DAD_SetDragImage
  137 stdcall DAD_ShowDragImage (long) DAD_ShowDragImage
- 138 stub DuplicateIcon   # exported by name
  139 stub Desktop_UpdateBriefcaseOnEvent
  140 stdcall FileMenu_DeleteItemByIndex(long long) FileMenu_DeleteItemByIndex
  141 stdcall FileMenu_DeleteItemByFirstID(long long)FileMenu_DeleteItemByFirstID
@@ -217,48 +209,13 @@
  213 stub Printers_RegisterWindowW
  214 stub Printers_UnregisterWindow
  215 stub SHStartNetConnectionDialog@12
- 216 stub ExtractVersionResource16W   # exported by name
- 217 stub FindExeDlgProc   # exported by name
- 218 stdcall FindExecutableA(ptr ptr ptr) FindExecutableA   # exported by name
- 219 stdcall FindExecutableW(wstr wstr wstr) FindExecutableW   # exported by name
- 220 stdcall FreeIconList(long) FreeIconList   # exported by name
- 221 stub InternalExtractIconListA   # exported by name
- 222 stub InternalExtractIconListW   # exported by name
- 223 stub OpenAs_RunDLL   # exported by name
- 224 stub OpenAs_RunDLLA   # exported by name
- 225 stub OpenAs_RunDLLW   # exported by name
- 226 stub PrintersGetCommand_RunDLL   # exported by name
- 227 stub PrintersGetCommand_RunDLLA   # exported by name
- 228 stub PrintersGetCommand_RunDLLW   # exported by name
- 229 stub RealShellExecuteA   # exported by name
- 230 stub RealShellExecuteExA   # exported by name
- 231 stub RealShellExecuteExW   # exported by name
- 232 stub RealShellExecuteW   # exported by name
- 233 stub RegenerateUserEnvironment   # exported by name
- 234 stdcall SHAddToRecentDocs (long ptr) SHAddToRecentDocs  # exported by name
- 235 stdcall SHAppBarMessage(long ptr) SHAppBarMessage   # exported by name
- 236 stdcall SHBrowseForFolder(ptr) SHBrowseForFolderA   # exported by name
- 237 stdcall SHBrowseForFolderA(ptr) SHBrowseForFolderA   # exported by name
- 238 stub SHBrowseForFolderW@4   # exported by name
- 239 stdcall SHChangeNotify (long long ptr ptr) SHChangeNotifyAW  # exported by name
- 240 stub SHEmptyRecycleBinA@12   # exported by name
- 241 stub SHEmptyRecycleBinW@12   # exported by name
  243 stdcall shell32_243(long long) shell32_243
- 244 stdcall SHInitRestricted(ptr ptr) SHInitRestricted # win98+ only, by ordinal
- 245 stub SHFormatDrive@16   # exported by name
- 246 stub SHFreeNameMappings@4   # exported by name
+ 244 stdcall SHInitRestricted(ptr ptr) SHInitRestricted
  247 stdcall SHGetDataFromIDListA (ptr ptr long ptr long) SHGetDataFromIDListA
  248 stdcall SHGetDataFromIDListW (ptr ptr long ptr long) SHGetDataFromIDListW
  249 stdcall PathParseIconLocation (ptr) PathParseIconLocationAW
  250 stdcall PathRemoveExtension (ptr) PathRemoveExtensionAW
  251 stdcall PathRemoveArgs (ptr) PathRemoveArgsAW
- 264 stdcall SHHelpShortcuts_RunDLL(long long long long) SHHelpShortcuts_RunDLL   # exported by name
- 265 stub SHHelpShortcuts_RunDLLA@16   # exported by name
- 266 stub SHHelpShortcuts_RunDLLW@16   # exported by name
- 267 stdcall SHLoadInProc(long) SHLoadInProc   # exported by name
- 268 stub SHQueryRecycleBinA@8   # exported by name
- 269 stub SHQueryRecycleBinW@8   # exported by name
- 270 stub SHUpdateRecycleBinIcon@0   # exported by name
  271 stub SheChangeDirA
  272 stub SheChangeDirExA
  273 stub SheChangeDirExW
@@ -283,7 +240,6 @@
  292 stdcall ShellExecuteExA (long) ShellExecuteExA
  293 stdcall ShellExecuteExW (long) ShellExecuteExW
  294 stdcall ShellExecuteW (long wstr wstr wstr wstr long) ShellExecuteW
- 295 stub ShellHookProc   # exported by name
  296 stdcall Shell_NotifyIcon(long ptr) Shell_NotifyIcon
  297 stdcall Shell_NotifyIconA(long ptr) Shell_NotifyIconA
  298 stdcall Shell_NotifyIconW(long ptr) Shell_NotifyIconW
@@ -317,7 +273,6 @@
  326 stdcall StrStrIA(str str)StrStrIA
  327 stdcall StrStrIW(wstr wstr)StrStrIW
  328 stdcall StrStrW(wstr wstr)StrStrW
- 329 stub WOWShellExecute # proper ordinal unknown
 
  505 stdcall SHRegCloseKey (long) SHRegCloseKey
  506 stdcall SHRegOpenKeyA (long str long) SHRegOpenKeyA
@@ -348,58 +303,122 @@
  650 stdcall PathIsSameRoot(ptr ptr)PathIsSameRootAW
 
 # nt40/win98
- 651 stdcall ReadCabinetState (long long) ReadCabinetState 
+ 651 stdcall ReadCabinetState (long long) ReadCabinetState # OldReadCabinetState
  652 stdcall WriteCabinetState (long) WriteCabinetState
  653 stdcall PathProcessCommand (long long long long) PathProcessCommandAW
 
 # win98
- 654 stdcall shell32_654 (long long) shell32_654
-
- 660 stdcall FileIconInit (long) FileIconInit
-
- 680 stdcall IsUserAdmin () IsUserAdmin
+ 654 stdcall shell32_654(long long)shell32_654 # ReadCabinetState@8
+ 660 stdcall FileIconInit(long)FileIconInit
+ 680 stdcall IsUserAdmin()IsUserAdmin
 
 # >= NT5
- 714 stdcall SHELL32_714(ptr)SHELL32_714
-@    stdcall SHGetFolderLocation(long long long long ptr)SHGetFolderLocation
+ 714 stdcall SHELL32_714(ptr)SHELL32_714 # PathIsTemporaryW
 
 1217 stub FOOBAR1217   # no joke! This is the real name!!
 
-# later additions ... FIXME: incorrect ordinals
-# win 98 uses 2...330, 505..511, 520..526, 640..654, 660, 680, 700..707, 711
+#
+# version 4.0 (win95)
+# _WIN32_IE >= 0x0200
+#
+@ stdcall Control_FillCache_RunDLL(long long long long)Control_FillCache_RunDLL
+@ stub Control_FillCache_RunDLLA@16
+@ stub Control_FillCache_RunDLLW@16
+@ stdcall Control_RunDLL(long long long long)Control_RunDLL
+@ stub Control_RunDLLA@16
+@ stub Control_RunDLLW@16
+@ stdcall DllInstall(long wstr)SHELL32_DllInstall
+@ stdcall DoEnvironmentSubstA(str str)DoEnvironmentSubstA
+@ stdcall DoEnvironmentSubstW(wstr wstr)DoEnvironmentSubstW
+@ stub DragQueryFileAorW
+@ stub DuplicateIcon
+@ stdcall ExtractAssociatedIconA(long ptr long)ExtractAssociatedIconA 
+@ stub ExtractAssociatedIconExA 
+@ stub ExtractAssociatedIconExW 
+@ stub ExtractAssociatedIconW 
+@ stdcall ExtractIconA(long str long)ExtractIconA 
+@ stdcall ExtractIconEx(ptr long ptr ptr long)ExtractIconExAW
+@ stdcall ExtractIconExA(str long ptr ptr long)ExtractIconExA
+@ stdcall ExtractIconExW(wstr long ptr ptr long)ExtractIconExW
+@ stdcall ExtractIconW(long wstr long)ExtractIconW 
+@ stub ExtractIconResInfoA 
+@ stub ExtractIconResInfoW 
+@ stub ExtractVersionResource16W 
+@ stub FindExeDlgProc 
+@ stdcall FindExecutableA(ptr ptr ptr) FindExecutableA 
+@ stdcall FindExecutableW(wstr wstr wstr) FindExecutableW 
+@ stdcall FreeIconList(long) FreeIconList 
+@ stub InternalExtractIconListA
+@ stub InternalExtractIconListW
+@ stub OpenAs_RunDLL
+@ stub OpenAs_RunDLLA
+@ stub OpenAs_RunDLLW
+@ stub PrintersGetCommand_RunDLL
+@ stub PrintersGetCommand_RunDLLA
+@ stub PrintersGetCommand_RunDLLW
+@ stub RealShellExecuteA 
+@ stub RealShellExecuteExA 
+@ stub RealShellExecuteExW 
+@ stub RealShellExecuteW 
+@ stub RegenerateUserEnvironment 
+@ stdcall SHAddToRecentDocs (long ptr) SHAddToRecentDocs 
+@ stdcall SHAppBarMessage(long ptr) SHAppBarMessage 
+@ stdcall SHBrowseForFolder(ptr) SHBrowseForFolderA 
+@ stdcall SHBrowseForFolderA(ptr) SHBrowseForFolderA 
+@ stub SHBrowseForFolderW@4 
+@ stdcall SHChangeNotify (long long ptr ptr) SHChangeNotifyAW 
+@ stub ShellHookProc
+@ stub SHEmptyRecycleBinA@12 
+@ stub SHEmptyRecycleBinW@12 
+@ stdcall SHFileOperation(ptr)SHFileOperationAW
+@ stdcall SHFileOperationA(ptr)SHFileOperationA
+@ stdcall SHFileOperationW(ptr)SHFileOperationW
+@ stub SHFormatDrive@16 
+@ stub SHFreeNameMappings@4 
+@ stdcall SHGetDesktopFolder(ptr)SHGetDesktopFolder
+@ stdcall SHGetFileInfo(ptr long ptr long long)SHGetFileInfoAW
+@ stdcall SHGetFileInfoA(ptr long ptr long long)SHGetFileInfoA
+@ stdcall SHGetFileInfoW(ptr long ptr long long)SHGetFileInfoW
+@ stdcall SHGetInstanceExplorer(long)SHGetInstanceExplorer
+@ stdcall SHGetMalloc(ptr)SHGetMalloc
+@ stub SHGetNewLinkInfo@20
+@ stdcall SHGetPathFromIDList(ptr ptr)SHGetPathFromIDListAW
+@ stdcall SHGetPathFromIDListA(long long)SHGetPathFromIDListA
+@ stdcall SHGetPathFromIDListW(long long)SHGetPathFromIDListW
+@ stdcall SHGetSpecialFolderLocation(long long ptr)SHGetSpecialFolderLocation 
+@ stdcall SHHelpShortcuts_RunDLL(long long long long) SHHelpShortcuts_RunDLL 
+@ stub SHHelpShortcuts_RunDLLA@16 
+@ stub SHHelpShortcuts_RunDLLW@16 
+@ stdcall SHLoadInProc(long) SHLoadInProc 
+@ stub SHQueryRecycleBinA@8 
+@ stub SHQueryRecycleBinW@8 
+@ stub SHUpdateRecycleBinIcon@0 
+@ stub WOWShellExecute@28
 
+#
+# version 4.70 (IE3.0)
+# _WIN32_IE >= 0x0300
+#
 
-1220 stdcall DllGetVersion (ptr) SHELL32_DllGetVersion	# win98:201
-1221 stdcall SHGetSpecialFolderPathA(long ptr long long) SHGetSpecialFolderPathA	# win98:292
-1222 stdcall DoEnvironmentSubstA (str str) DoEnvironmentSubstA		# win98:293
-1223 stdcall DoEnvironmentSubstW (wstr wstr) DoEnvironmentSubstW	# win98:204
+#
+# version 4.71 (IE4.0)
+# _WIN32_IE >= 0x0400
+#
+@ stub DllCanUnloadNow
+@ stdcall DllGetVersion(ptr)SHELL32_DllGetVersion
+@ stub SHGetFreeDiskSpace
+@ stdcall SHGetSpecialFolderPathA(long ptr long long) SHGetSpecialFolderPathA
 
-# by-name routines
+#
+# version 4.72 (IE4.01)
+# _WIN32_IE >= 0x0401
+# no new exports
+#
 
- @ stdcall DllInstall (long wstr) SHELL32_DllInstall
-
- @ stdcall ExtractAssociatedIconA(long ptr long) ExtractAssociatedIconA   # exported by name
- @ stub ExtractAssociatedIconExA   # exported by name
- @ stub ExtractAssociatedIconExW   # exported by name
- @ stub ExtractAssociatedIconW   # exported by name
- @ stdcall ExtractIconA(long str long) ExtractIconA   # exported by name
- @ stdcall ExtractIconEx(ptr long ptr ptr long) ExtractIconExAW
- @ stdcall ExtractIconExA(str long ptr ptr long) ExtractIconExA
- @ stdcall ExtractIconExW(wstr long ptr ptr long) ExtractIconExW
- @ stdcall ExtractIconW(long wstr long) ExtractIconW   # exported by name
- @ stub ExtractIconResInfoA   # exported by name
- @ stub ExtractIconResInfoW   # exported by name
- @ stdcall SHFileOperation (ptr) SHFileOperationAW
- @ stdcall SHFileOperationA (ptr) SHFileOperationA
- @ stdcall SHFileOperationW (ptr) SHFileOperationW
- @ stdcall SHGetDesktopFolder(ptr) SHGetDesktopFolder
- @ stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfoAW
- @ stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfoA
- @ stdcall SHGetFileInfoW(ptr long ptr long long) SHGetFileInfoW
- @ stdcall SHGetInstanceExplorer (long) SHGetInstanceExplorer
- @ stdcall SHGetMalloc(ptr) SHGetMalloc
- @ stub SHGetNewLinkInfo@20
- @ stdcall SHGetPathFromIDList(ptr ptr) SHGetPathFromIDListAW
- @ stdcall SHGetPathFromIDListA (long long) SHGetPathFromIDListA
- @ stdcall SHGetPathFromIDListW (long long) SHGetPathFromIDListW
- @ stdcall SHGetSpecialFolderLocation(long long ptr) SHGetSpecialFolderLocation   # exported by name
+#
+# version 5.00 (Win2K)
+# _WIN32_IE >= 0x0500
+#
+@ stdcall SHGetFolderPathA(long long long long ptr)SHGetFolderPathA
+@ stdcall SHGetFolderPathW(long long long long ptr)SHGetFolderPathW
+@ stdcall SHGetFolderLocation(long long long long ptr)SHGetFolderLocation
diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c
index 59f17e6..9d01b92 100644
--- a/dlls/shell32/shellord.c
+++ b/dlls/shell32/shellord.c
@@ -1069,9 +1069,12 @@
 
 /*************************************************************************
  *      SHLWAPI_219	[SHLWAPI]
+ *
+ * NOTES
+ *  error codes: E_POINTER, E_NOINTERFACE
  */
 HRESULT WINAPI SHLWAPI_219 (
-	LPVOID w, /* returned by LocalAlloc */
+	LPVOID w, /* returned by LocalAlloc, 0x450 bytes, iface */
 	LPVOID x,
 	LPVOID y,
 	LPWSTR z) /* OUT: path */
@@ -1100,26 +1103,36 @@
  *      SHLWAPI_223	[SHLWAPI]
  *
  * NOTES
- *  function guessed 
-*/
+ *  get the count of the semaphore
+ */
 DWORD WINAPI SHLWAPI_223 (HANDLE handle)
 {
 	DWORD oldCount;
 	
 	FIXME("(0x%08x) stub\n",handle);
 
-	ReleaseSemaphore( handle, 1, &oldCount);
-	WaitForSingleObject( handle, 0 );
-	return 0;
+	ReleaseSemaphore( handle, 1, &oldCount);	/* +1 */
+	WaitForSingleObject( handle, 0 );		/* -1 */
+	return oldCount;
 }
 
 /*************************************************************************
  *      SHLWAPI_237	[SHLWAPI]
+ *
+ * NOTES
+ *  checks if a class is registered, if not it registers it
  */
-DWORD WINAPI SHLWAPI_237 (LPVOID x)
+DWORD WINAPI SHLWAPI_237 (WNDCLASSW * lpWndClass)
 {
-	FIXME("(ptr=%p str=%s wstr=%s)\n",x,debugstr_a(x),debugstr_w(x));
-	return 0xabba1234;
+	WNDCLASSW WndClass;
+	
+	TRACE("(0x%08x %s)\n",lpWndClass->hInstance, debugstr_w(lpWndClass->lpszClassName));
+
+	if (!GetClassInfoW(lpWndClass->hInstance, lpWndClass->lpszClassName, &WndClass))
+	{
+	  return RegisterClassW(lpWndClass);
+	}
+	return TRUE;
 }
 
 /*************************************************************************
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index 114dab9..623fa09 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -417,7 +417,6 @@
 	  lpszPath++;
 	}
 	return (LPSTR)lpszPath;
-
 }
 
 /*************************************************************************
@@ -571,7 +570,7 @@
 	TRACE("%s\n", lpszPath);
 
 	if(lpszFileName)
-	  RtlMoveMemory(lpszPath, lpszFileName, strlen(lpszFileName)); 
+	  RtlMoveMemory(lpszPath, lpszFileName, strlen(lpszFileName)+1); 
 }
 
 /*************************************************************************
@@ -583,7 +582,7 @@
 
 	TRACE("%s\n", debugstr_w(lpszPath));
 	if(lpszFileName)
-	  RtlMoveMemory(lpszPath, lpszFileName, lstrlenW(lpszFileName)*sizeof(WCHAR)); 
+	  RtlMoveMemory(lpszPath, lpszFileName, (lstrlenW(lpszFileName)+1)*sizeof(WCHAR)); 
 }
 
 /*************************************************************************
@@ -604,20 +603,18 @@
 	TRACE("%s\n", lpszPath);
 
 	/* X:\ */
-	if (lpszPath[1]==':' && lpszPath[2]=='\\')
+	if (lpszPath[1]==':' )
 	{
-	  lpszPath[3]='\0';
-	  return TRUE;
+	  if(lpszPath[2]=='\\')
+	  {
+	    lpszPath[3]='\0';
+	    return TRUE;
+	  }
+	  lpszPath[2]='\0';
+	  return FALSE;
 	}
 
-	/* "\" */
-	if (lpszPath[0]=='\\')
-	{
-	  lpszPath[1]='\0';
-	  return TRUE;
-	}
-
-	/* UNC "\\<computer>\<share>" */
+	/* UNC "\\<computer>\<share>" FIXME: not complete*/
 	if (lpszPath[0]=='\\' && lpszPath[1]=='\\')		
 	{
 	  int foundbackslash = 0;
@@ -634,6 +631,14 @@
 	  }
 	}
 
+	/* "\" */
+	if (lpszPath[0]=='\\')
+	{
+	  lpszPath[1]='\0';
+	  return TRUE;
+	}
+
+	lpszPath[0]='\0';
 	return FALSE;
 }
 
@@ -645,18 +650,17 @@
 	TRACE("%s\n", debugstr_w(lpszPath));
 
 	/* X:\ */
-	if (lpszPath[1]==':' && lpszPath[2]=='\\')
+	if (lpszPath[1]==':' )
 	{
-	  lpszPath[3]='\0';
-	  return TRUE;
+	  if(lpszPath[2]=='\\')
+	  {
+	    lpszPath[3]='\0';
+	    return TRUE;
+	  }
+	  lpszPath[2]='\0';
+	  return FALSE;
 	}
 
-	/* "\" */
-	if (lpszPath[0]=='\\')
-	{
-	  lpszPath[1]='\0';
-	  return TRUE;
-	}
 
 	/* UNC "\\<computer>\<share>" */
 	if (lpszPath[0]=='\\' && lpszPath[1]=='\\')		
@@ -675,6 +679,14 @@
 	  }
 	}
 
+	/* "\" */
+	if (lpszPath[0]=='\\')
+	{
+	  lpszPath[1]='\0';
+	  return TRUE;
+	}
+
+	lpszPath[0]=(WCHAR)'\0';
 	return FALSE;
 }
 
@@ -690,32 +702,54 @@
 
 /*************************************************************************
  * PathRemoveArgsA	[SHLWAPI.@]
+ *
+ * NOTES
+ *  returns pointer to last character, not void
  */
-void WINAPI PathRemoveArgsA(LPSTR lpszPath)
+LPSTR WINAPI PathRemoveArgsA(LPSTR lpszPath)
 {
-	LPSTR lpszArgs = PathGetArgsA(lpszPath);
+	BOOL	qflag = FALSE;
+	LPSTR	pPos = lpszPath;
+	
+	TRACE("%s\n",lpszPath);
 
-	TRACE("%s\n", lpszPath);
-
-	if (lpszArgs) *(--lpszArgs)='\0';
+	while (*lpszPath) 
+	{
+	  if (!qflag && *lpszPath==' ') break;
+	  if (*lpszPath=='"') qflag=!qflag;
+	  lpszPath++;
+	  if (*lpszPath) pPos++;
+	};
+	*lpszPath = '\0';
+	return pPos;
 }
 
 /*************************************************************************
  * PathRemoveArgsW	[SHLWAPI.@]
  */
-void WINAPI PathRemoveArgsW(LPWSTR lpszPath)
+LPWSTR WINAPI PathRemoveArgsW(LPWSTR lpszPath)
 {
-	LPWSTR lpszArgs = PathGetArgsW(lpszPath);
+	BOOL	qflag = FALSE;
+	LPWSTR	pPos = lpszPath;
+	
 
 	TRACE("%s\n", debugstr_w(lpszPath));
 
-	if (lpszArgs) *(--lpszArgs)='\0';
+	while (*lpszPath) 
+	{
+	  if (!qflag && *lpszPath==(WCHAR)' ') break;
+	  if (*lpszPath==(WCHAR)'"') qflag=!qflag;
+	  lpszPath++;
+	  if (*lpszPath) pPos++;
+	};
+	*lpszPath = (WCHAR)'\0';
+	return pPos;
 }
 
 /*************************************************************************
  * PathRemoveArgsAW	[SHELL32.251]
  */
-void WINAPI PathRemoveArgsAW(LPVOID lpszPath) 
+LPVOID WINAPI PathRemoveArgsAW(LPVOID lpszPath) 
 {
 	if (VERSION_OsIsUnicode())
 	  return PathRemoveArgsW(lpszPath);
@@ -764,6 +798,8 @@
  * Otherwise 
  * the address of the last character is returned.
  *
+ * FIXME
+ *  "c:\": keep backslash
  */
 LPSTR WINAPI PathRemoveBackslashA( LPSTR lpszPath )
 {
@@ -878,27 +914,48 @@
 /*************************************************************************
  * PathQuoteSpacesA [SHLWAPI.@]
  * 
- * NOTES
  */
-LPSTR WINAPI PathQuoteSpacesA(LPCSTR lpszPath)
+LPSTR WINAPI PathQuoteSpacesA(LPSTR lpszPath)
 {
-	FIXME("%s\n",lpszPath);
+	TRACE("%s\n",lpszPath);
+
+	if(StrChrA(lpszPath,' '))
+	{
+	  int len = strlen(lpszPath);
+	  RtlMoveMemory(lpszPath+1, lpszPath, len);
+	  *(lpszPath++) = '"';
+	  lpszPath += len;
+	  *(lpszPath++) = '"';
+	  *(lpszPath) = '\0';
+	  return --lpszPath;
+	}
 	return 0;
 }
 
 /*************************************************************************
  * PathQuoteSpacesW [SHLWAPI.@]
  */
-LPWSTR WINAPI PathQuoteSpacesW(LPCWSTR lpszPath)
+LPWSTR WINAPI PathQuoteSpacesW(LPWSTR lpszPath)
 {
-	FIXME("%s\n",debugstr_w(lpszPath));
-	return 0;	
+	TRACE("%s\n",debugstr_w(lpszPath));
+
+	if(StrChrW(lpszPath,' '))
+	{
+	  int len = lstrlenW(lpszPath);
+	  RtlMoveMemory(lpszPath+1, lpszPath, len*sizeof(WCHAR));
+	  *(lpszPath++) = '"';
+	  lpszPath += len;
+	  *(lpszPath++) = '"';
+	  *(lpszPath) = '\0';
+	  return --lpszPath;
+	}
+	return 0;
 }
 
 /*************************************************************************
  * PathQuoteSpacesAW [SHELL32.55]
  */
-LPVOID WINAPI PathQuoteSpacesAW (LPCVOID lpszPath)
+LPVOID WINAPI PathQuoteSpacesAW (LPVOID lpszPath)
 {
 	if(VERSION_OsIsUnicode())
 	  return PathQuoteSpacesW(lpszPath);
@@ -969,6 +1026,8 @@
 	  lpstrComma[0]='\0';
 /*	  return atoi(&lpstrComma[1]);	FIXME */
 	}
+	
+	PathUnquoteSpacesA(lpszPath);
 	return 0;
 }
 
@@ -986,6 +1045,7 @@
 	  lpstrComma[0]='\0';
 /*	  return _wtoi(&lpstrComma[1]);	FIXME */
 	}
+	PathUnquoteSpacesW(lpszPath);
 	return 0;
 }
 
@@ -1092,7 +1152,7 @@
 	  {
 	    if (*(lpszPath++)=='\\') foundbackslash++;
 	  }
-	  if (foundbackslash==1)
+	  if (foundbackslash <= 1)
 	    return TRUE;
 	}
 	return FALSE;
@@ -1122,7 +1182,7 @@
 	  {
 	    if (*(lpszPath++)=='\\') foundbackslash++;
 	  }
-	  if (foundbackslash==1)
+	  if (foundbackslash <= 1)
 	    return TRUE;
 	}
 	return FALSE;
@@ -1480,7 +1540,7 @@
 	while(SupportedProtocol[i])
 	{
 	  if (iSize == strlen(SupportedProtocol[i]))
-	    if(!strncasecmp(lpstrPath, SupportedProtocol[i], iSize));
+	    if(!strncasecmp(lpstrPath, SupportedProtocol[i], iSize))
 	      return TRUE;
 	  i++;
 	}
@@ -1510,7 +1570,7 @@
 	while(SupportedProtocol[i])
 	{
 	  if (iSize == strlenW(SupportedProtocol[i]))
-	    if(!strncmpiW(lpstrPath, SupportedProtocol[i], iSize));
+	    if(!strncmpiW(lpstrPath, SupportedProtocol[i], iSize))
 	      return TRUE;
 	  i++;
 	}
@@ -1987,11 +2047,21 @@
 	}
 	RegCloseKey(hKey);
 
-	if (bCreate && CreateDirectoryA(szPath,NULL))
+	/* if we don't care about existing directorys we are ready */
+	if(csidl & CSIDL_FLAG_DONT_VERIFY) return TRUE;
+
+	if (PathFileExistsA(szPath)) return TRUE;
+
+	/* not existing but we not allowed to create it */
+	if (!bCreate) return FALSE;
+	
+	if (!CreateDirectoryA(szPath,NULL))
 	{
-	    MESSAGE("Created not existing system directory '%s'\n", szPath);
+	  ERR("Failed to create directory '%s'.\n", szPath);
+	  return FALSE;
 	}
 
+	MESSAGE("Created not existing system directory '%s'\n", szPath);
 	return TRUE;
 }
 
@@ -2032,6 +2102,40 @@
 }
 
 /*************************************************************************
+ * SHGetFolderPathA			[SHFOLDER.@]
+ */
+HRESULT SHGetFolderPathA(
+	HWND hwndOwner,
+	int nFolder,
+	HANDLE hToken,	/* FIXME: get paths for specific user */
+	DWORD dwFlags,	/* FIXME: SHGFP_TYPE_CURRENT|SHGFP_TYPE_DEFAULT */
+	LPSTR pszPath)
+{
+	return (SHGetSpecialFolderPathA(
+		hwndOwner,
+		pszPath,
+		CSIDL_FOLDER_MASK & nFolder,
+		CSIDL_FLAG_CREATE & nFolder )) ? S_OK : E_FAIL;
+}
+
+/*************************************************************************
+ * SHGetFolderPathW			[SHFOLDER.@]
+ */
+HRESULT SHGetFolderPathW(
+	HWND hwndOwner,
+	int nFolder,
+	HANDLE hToken,
+	DWORD dwFlags,
+	LPWSTR pszPath)
+{
+	return (SHGetSpecialFolderPathW(
+		hwndOwner,
+		pszPath,
+		CSIDL_FOLDER_MASK & nFolder,
+		CSIDL_FLAG_CREATE & nFolder )) ? S_OK : E_FAIL;
+}
+
+/*************************************************************************
  * PathCanonicalizeA
  *
  *  FIXME
@@ -2178,16 +2282,30 @@
 /*************************************************************************
  * PathFindNextComponentA
  *
- * Windows returns a pointer NULL (BO 000605)
- */
+ * NOTES
+ * special cases:
+ *	""              null
+ *	aa              "" (pointer to traling NULL)
+ *	aa\             "" (pointer to traling NULL)
+ *	aa\\            "" (pointer to traling NULL)
+ *	aa\\bb          bb
+ *	aa\\\bb         \bb
+ *	c:\aa\          "aa\"
+ *	\\aa            aa
+ *	\\aa\b          aa\b
+*/
 LPSTR WINAPI PathFindNextComponentA(LPCSTR pszPath)
 {
-	while( *pszPath )
-	{
-	  if(*pszPath++=='\\')
-	    return (LPSTR) pszPath;
-	}
-	return (LPSTR) pszPath;
+	LPSTR pos;
+
+	TRACE("%s\n", pszPath);
+
+	if(!pszPath || !*pszPath) return NULL;
+	if(!(pos = StrChrA(pszPath, '\\')))
+	  return (LPSTR) pszPath + strlen(pszPath);
+	pos++;
+	if(pos[0] == '\\') pos++;
+	return pos;
 }
 
 /*************************************************************************
@@ -2195,12 +2313,16 @@
  */
 LPWSTR WINAPI PathFindNextComponentW(LPCWSTR pszPath)
 {
-	while( *pszPath )
-	{
-	  if(*pszPath++=='\\')
-	    return (LPWSTR) pszPath;
-	}
-	return (LPWSTR) pszPath;
+	LPWSTR pos;
+
+	TRACE("%s\n", debugstr_w(pszPath));
+	
+	if(!pszPath || !*pszPath) return NULL;
+	if (!(pos = StrChrW(pszPath, '\\')))
+	  return (LPWSTR) pszPath + lstrlenW(pszPath);
+	pos++;
+	if(pos[0] == '\\') pos++;
+	return pos;
 }
 
 /*************************************************************************
@@ -2332,4 +2454,29 @@
 {
 	FIXME("%s\n", debugstr_w(lpPath));
 	return TRUE;
+
+}
+
+/*************************************************************************
+ *	PathCommonPrefixA
+ */
+int WINAPI PathCommonPrefixA(
+	LPCSTR pszFile1,
+	LPCSTR pszFile2,
+	LPSTR achPath)
+{
+	FIXME("%s %s %p\n", pszFile1, pszFile2, achPath);
+	return 0;
+}
+
+/*************************************************************************
+ *	PathCommonPrefixW
+ */
+int WINAPI PathCommonPrefixW(
+	LPCWSTR pszFile1,
+	LPCWSTR pszFile2,
+	LPWSTR achPath)
+{
+	FIXME("%s %s %p\n", debugstr_w(pszFile1), debugstr_w(pszFile2),achPath );
+	return 0;
 }
diff --git a/dlls/shell32/shellstring.c b/dlls/shell32/shellstring.c
index 746c93c..69a5314 100644
--- a/dlls/shell32/shellstring.c
+++ b/dlls/shell32/shellstring.c
@@ -126,7 +126,7 @@
  */
 LPSTR WINAPI StrChrA (LPCSTR str, INT c)
 {
-	TRACE("%s %i stub\n", str,c);
+	TRACE("%s %i\n", str,c);
 	return strchr(str, c);
 }
 
diff --git a/dlls/shell32/shfolder.spec b/dlls/shell32/shfolder.spec
new file mode 100644
index 0000000..08a7a8f
--- /dev/null
+++ b/dlls/shell32/shfolder.spec
@@ -0,0 +1,6 @@
+name shfolder
+type win32
+import advapi32
+
+@ stdcall SHGetFolderPathA(long long long long ptr)SHGetFolderPathA
+@ stdcall SHGetFolderPathW(long long long long ptr)SHGetFolderPathW
diff --git a/dlls/shell32/shlwapi.spec b/dlls/shell32/shlwapi.spec
index 18569e7..d72316e 100644
--- a/dlls/shell32/shlwapi.spec
+++ b/dlls/shell32/shlwapi.spec
@@ -465,8 +465,8 @@
 @ stdcall PathCanonicalizeW (ptr wstr) PathCanonicalizeW
 @ stdcall PathCombineA (ptr ptr ptr) PathCombineA
 @ stdcall PathCombineW (ptr ptr ptr) PathCombineW
-@ stub    PathCommonPrefixA
-@ stub    PathCommonPrefixW
+@ stdcall PathCommonPrefixA(str str ptr)PathCommonPrefixA
+@ stdcall PathCommonPrefixW(wstr wstr ptr)PathCommonPrefixW
 @ stub    PathCompactPathA
 @ stub    PathCompactPathExA
 @ stub    PathCompactPathExW