- New (some stubs): SHGetFolderLocation, PathAddExtension,
  PathIsUNCServer, PathIsUNCServerShare, PathMakePretty,
  SHCreateShellPalette, SHOpenRegStream, SHOpenRegStream2
- Many string functions implemented
- Some stubs for exports by ordinal

diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in
index 82b0229..bcfcc8b 100644
--- a/dlls/shell32/Makefile.in
+++ b/dlls/shell32/Makefile.in
@@ -34,6 +34,8 @@
 	shellole.c \
 	shellord.c \
 	shellpath.c \
+	shellstring.c \
+	shellreg.c \
 	shlfileop.c \
 	shlfolder.c \
 	shlview.c \
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index d1b41b5..96ec118 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -850,6 +850,25 @@
 }
 
 /*************************************************************************
+ * SHGetFolderLocation [SHELL32]
+ *
+ * NOTES
+ *  the pidl can be a simple one. since we cant get the path out of the pidl
+ *  we have to take all data from the pidl
+ */
+HRESULT WINAPI SHGetFolderLocation(
+	HWND hwnd,
+	int csidl,
+	HANDLE hToken,
+	DWORD dwFlags,
+	LPITEMIDLIST *ppidl)
+{
+	FIXME("0x%04x 0x%08x 0x%08x 0x%08lx %p\n",
+	 hwnd, csidl, hToken, dwFlags, ppidl);
+	return SHGetSpecialFolderLocation(hwnd, csidl, ppidl);
+}
+
+/*************************************************************************
  * SHGetDataFromIDListA [SHELL32.247]
  *
  * NOTES
diff --git a/dlls/shell32/regstream.c b/dlls/shell32/regstream.c
index abae9b8..90bb6d5 100644
--- a/dlls/shell32/regstream.c
+++ b/dlls/shell32/regstream.c
@@ -18,8 +18,6 @@
 {	ICOM_VFIELD(IStream);
 	DWORD		ref;
 	HKEY		hKey;
-	LPSTR		pszSubKey;
-	LPSTR		pszValue;
 	LPBYTE		pbBuffer;
 	DWORD		dwLength;
 	DWORD		dwPos;
@@ -28,28 +26,31 @@
 static struct ICOM_VTABLE(IStream) rstvt;
 
 /**************************************************************************
-*   IStream_Constructor()
+*   IStream_ConstructorA	[internal]
 */
-IStream *IStream_Constructor(HKEY hKey, LPCSTR pszSubKey, LPCSTR pszValue, DWORD grfMode)
-{	ISHRegStream*	rstr;
+IStream *IStream_ConstructorA(HKEY hKey, LPCSTR pszSubKey, LPCSTR pszValue, DWORD grfMode)
+{
+	ISHRegStream*	rstr;
 	DWORD		dwType;
 	
 	rstr = (ISHRegStream*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ISHRegStream));
+
 	ICOM_VTBL(rstr)=&rstvt;
 	rstr->ref = 1;
 
-	if ( ERROR_SUCCESS == RegOpenKeyExA (hKey, pszSubKey, 0, KEY_READ, &(rstr->hKey)))
-	{ if ( ERROR_SUCCESS == RegQueryValueExA(rstr->hKey, (LPSTR)pszValue,0,0,0,&(rstr->dwLength)))
+	if (!(RegOpenKeyExA (hKey, pszSubKey, 0, KEY_READ, &(rstr->hKey))))
+	{
+	  if (!(RegQueryValueExA(rstr->hKey, pszValue,0,0,0,&(rstr->dwLength))))
 	  { 
 	    /* read the binary data into the buffer */
-	    rstr->pbBuffer = HeapAlloc(GetProcessHeap(),0,rstr->dwLength);
-	    if (rstr->pbBuffer)
-	    { if ( ERROR_SUCCESS == RegQueryValueExA(rstr->hKey, (LPSTR)pszValue,0,&dwType,rstr->pbBuffer,&(rstr->dwLength)))
-	      { if (dwType == REG_BINARY )
-	        { rstr->pszSubKey = HEAP_strdupA (GetProcessHeap(),0, pszSubKey);
-	          rstr->pszValue = HEAP_strdupA (GetProcessHeap(),0, pszValue);		
-	          TRACE("(%p)->0x%08x,%s,%s,0x%08lx\n", rstr, hKey, pszSubKey, pszValue, grfMode);
+	    if((rstr->pbBuffer = HeapAlloc(GetProcessHeap(),0,rstr->dwLength)))
+	    {
+	      if (!(RegQueryValueExA(rstr->hKey, pszValue,0,&dwType,rstr->pbBuffer,&(rstr->dwLength))))
+	      {
+	        if (dwType == REG_BINARY )
+	        {
 	          shell32_ObjCount++;
+	          TRACE ("%p\n", rstr);
 	          return (IStream*)rstr;
 	        }
 	      }
@@ -57,7 +58,44 @@
 	    }
 	  }
 	  RegCloseKey(rstr->hKey);
+	}
+	HeapFree (GetProcessHeap(),0,rstr);
+	return NULL;
+}
 
+/**************************************************************************
+*   IStream_ConstructorW	[internal]
+*/
+IStream *IStream_ConstructorW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD grfMode)
+{
+	ISHRegStream*	rstr;
+	DWORD		dwType;
+	
+	rstr = (ISHRegStream*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ISHRegStream));
+
+	ICOM_VTBL(rstr)=&rstvt;
+	rstr->ref = 1;
+
+	if (!(RegOpenKeyExW (hKey, pszSubKey, 0, KEY_READ, &(rstr->hKey))))
+	{
+	  if (!(RegQueryValueExW(rstr->hKey, pszValue,0,0,0,&(rstr->dwLength))))
+	  { 
+	    /* read the binary data into the buffer */
+	    if((rstr->pbBuffer = HeapAlloc(GetProcessHeap(),0,rstr->dwLength)))
+	    {
+	      if (!(RegQueryValueExW(rstr->hKey, pszValue,0,&dwType,rstr->pbBuffer,&(rstr->dwLength))))
+	      {
+	        if (dwType == REG_BINARY )
+	        {
+	          shell32_ObjCount++;
+	          TRACE ("%p\n", rstr);
+	          return (IStream*)rstr;
+	        }
+	      }
+	      HeapFree (GetProcessHeap(),0,rstr->pbBuffer);
+	    }
+	  }
+	  RegCloseKey(rstr->hKey);
 	}
 	HeapFree (GetProcessHeap(),0,rstr);
 	return NULL;
@@ -118,12 +156,6 @@
 	if (!--(This->ref)) 
 	{ TRACE(" destroying SHReg IStream (%p)\n",This);
 
-	  if (This->pszSubKey)
-	    HeapFree(GetProcessHeap(),0,This->pszSubKey);
-
-	  if (This->pszValue)
-	    HeapFree(GetProcessHeap(),0,This->pszValue);
-
 	  if (This->pbBuffer)
 	    HeapFree(GetProcessHeap(),0,This->pbBuffer);
 
@@ -265,13 +297,31 @@
 };
 
 /*************************************************************************
- * OpenRegStream				[SHELL32.85]
- *
- * NOTES
- *     exported by ordinal
+ * SHOpenRegStreamA				[SHLWAPI.@][SHELL32.85]
  */
-IStream * WINAPI OpenRegStream(HKEY hkey, LPCSTR pszSubkey, LPCSTR pszValue, DWORD grfMode)
+IStream * WINAPI SHOpenRegStreamA(
+	HKEY hkey,
+	LPCSTR pszSubkey,
+	LPCSTR pszValue,
+	DWORD grfMode)
 {
-	TRACE("(0x%08x,%s,%s,0x%08lx)\n",hkey, pszSubkey, pszValue, grfMode);
-	return IStream_Constructor(hkey, pszSubkey, pszValue, grfMode);
+	TRACE("(0x%08x,%s,%s,0x%08lx)\n",
+	hkey, pszSubkey, pszValue, grfMode);
+
+	return IStream_ConstructorA(hkey, pszSubkey, pszValue, grfMode);
+}
+
+/*************************************************************************
+ * SHOpenRegStreamW				[SHLWAPI.@]
+ */
+IStream * WINAPI SHOpenRegStreamW(
+	HKEY hkey,
+	LPCWSTR pszSubkey,
+	LPCWSTR pszValue,
+	DWORD grfMode)
+{
+	TRACE("(0x%08x,%s,%s,0x%08lx)\n",
+	hkey, debugstr_w(pszSubkey), debugstr_w(pszValue), grfMode);
+
+	return IStream_ConstructorW(hkey, pszSubkey, pszValue, grfMode);
 }
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec
index 86ddd46..2905681 100644
--- a/dlls/shell32/shell32.spec
+++ b/dlls/shell32/shell32.spec
@@ -97,7 +97,7 @@
   82 stdcall DragQueryFileA(long long ptr long) DragQueryFileA
   83 stub CIDLData_CreateFromIDArray
   84 stub SHIsBadInterfacePtr
-  85 stdcall OpenRegStream(long long long long) OpenRegStream
+  85 stdcall OpenRegStream(long str str long) SHOpenRegStreamA
   86 stdcall SHRegisterDragDrop(long ptr) SHRegisterDragDrop
   87 stdcall SHRevokeDragDrop(long) SHRevokeDragDrop
   88 stdcall SHDoDragDrop(long long long long long) SHDoDragDrop
@@ -160,9 +160,7 @@
  145 stdcall PathFindOnPath (ptr ptr) PathFindOnPathAW
  146 stdcall RLBuildListOfPaths()RLBuildListOfPaths
  147 stdcall SHCLSIDFromString(long long) SHCLSIDFromStringAW
- 148 stdcall ExtractAssociatedIconA(long ptr long) ExtractAssociatedIconA   # exported by name
  149 stdcall SHFind_InitMenuPopup(long long long long) SHFind_InitMenuPopup
- 150 stub ExtractAssociatedIconExA   # exported by name
  151 stdcall SHLoadOLE (long) SHLoadOLE
  152 stdcall ILGetSize(ptr) ILGetSize
  153 stdcall ILGetNext(ptr) ILGetNext
@@ -198,15 +196,6 @@
  183 varargs ShellMessageBoxA(long long long str long) ShellMessageBoxA
  184 stdcall ArrangeWindows(long long long long long) ArrangeWindows
  185 stub SHHandleDiskFull
- 186 stub ExtractAssociatedIconExW   # exported by name
- 187 stub ExtractAssociatedIconW   # exported by name
- 188 stdcall ExtractIconA(long str long) ExtractIconA   # exported by name
- 189 stdcall ExtractIconEx(ptr long ptr ptr long) ExtractIconExAW
- 190 stdcall ExtractIconExA(str long ptr ptr long) ExtractIconExA
- 191 stdcall ExtractIconExW(wstr long ptr ptr long) ExtractIconExW
- 192 stub ExtractIconResInfoA   # exported by name
- 193 stub ExtractIconResInfoW   # exported by name
- 194 stdcall ExtractIconW(long wstr long) ExtractIconW   # exported by name
  195 stdcall SHFree(ptr) SHFree
  196 stdcall SHAlloc(long) SHAlloc
  197 stub SHGlobalDefect
@@ -254,9 +243,6 @@
  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
- @ stdcall SHFileOperation (ptr) SHFileOperationAW
- @ stdcall SHFileOperationA (ptr) SHFileOperationA
- @ stdcall SHFileOperationW (ptr) SHFileOperationW
  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
@@ -266,17 +252,6 @@
  249 stdcall PathParseIconLocation (ptr) PathParseIconLocationAW
  250 stdcall PathRemoveExtension (ptr) PathRemoveExtensionAW
  251 stdcall PathRemoveArgs (ptr) PathRemoveArgsAW
- @ 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
  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
@@ -284,7 +259,6 @@
  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
@@ -315,14 +289,14 @@
  298 stdcall Shell_NotifyIconW(long ptr) Shell_NotifyIconW
  299 stub Shl1632_ThunkData32
  300 stub Shl3216_ThunkData32
- 301 stub StrChrA
+ 301 stdcall StrChrA (str long) StrChrA   
  302 stub StrChrIA
  303 stub StrChrIW
  304 stdcall StrChrW (wstr long) StrChrW
- 305 stub StrCmpNA
- 306 stub StrCmpNIA
+ 305 stdcall StrCmpNA(str str long) StrCmpNA 
+ 306 stdcall StrCmpNIA (str str long) StrCmpNIA
  307 stdcall StrCmpNIW (wstr wstr long) StrCmpNIW
- 308 stub StrCmpNW
+ 308 stdcall StrCmpNW (wstr wstr long) StrCmpNW
  309 stdcall StrCpyNA (ptr str long) lstrcpynA
  310 stdcall StrCpyNW (ptr wstr long)lstrcpynW
  311 stub StrNCmpA
@@ -339,10 +313,10 @@
  322 stub StrRStrIA
  323 stub StrRStrIW
  324 stub StrRStrW
- 325 stub StrStrA
- 326 stub StrStrIA
- 327 stub StrStrIW
- 328 stub StrStrW
+ 325 stdcall StrStrA(str str)StrStrA
+ 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
@@ -385,6 +359,10 @@
 
  680 stdcall IsUserAdmin () IsUserAdmin
 
+# >= NT5
+ 714 stdcall SHELL32_714(ptr)SHELL32_714
+@    stdcall SHGetFolderLocation(long long long long ptr)SHGetFolderLocation
+
 1217 stub FOOBAR1217   # no joke! This is the real name!!
 
 # later additions ... FIXME: incorrect ordinals
@@ -396,6 +374,32 @@
 1222 stdcall DoEnvironmentSubstA (str str) DoEnvironmentSubstA		# win98:293
 1223 stdcall DoEnvironmentSubstW (wstr wstr) DoEnvironmentSubstW	# win98:204
 
-# by-name routines relocated in win98
+# by-name routines
 
-@ stdcall DllInstall (long wstr) SHELL32_DllInstall
+ @ 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
diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c
index 93802a6..87ea7d6 100644
--- a/dlls/shell32/shell32_main.c
+++ b/dlls/shell32/shell32_main.c
@@ -98,6 +98,7 @@
 
 /*************************************************************************
  * SHGetFileInfoA			[SHELL32.@]
+ *
  */
 
 DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes,
@@ -118,6 +119,11 @@
 	if ((flags & SHGFI_USEFILEATTRIBUTES) && (flags & (SHGFI_ATTRIBUTES|SHGFI_EXETYPE|SHGFI_PIDL)))
 	  return FALSE;
 	
+	/* windows initializes this values regardless of the flags */
+	psfi->szDisplayName[0] = '\0';
+	psfi->szTypeName[0] = '\0';
+	psfi->iIcon = 0;
+	
 	/* translate the path into a pidl only when SHGFI_USEFILEATTRIBUTES in not specified 
 	   the pidl functions fail on not existing file names */
 	if (flags & SHGFI_PIDL)
@@ -298,6 +304,9 @@
 
 /*************************************************************************
  * ExtractIconA				[SHELL32.133]
+ *
+ * fixme
+ *  is the filename is not a file return 1
  */
 HICON WINAPI ExtractIconA( HINSTANCE hInstance, LPCSTR lpszExeFileName,
 	UINT nIconIndex )
@@ -316,6 +325,9 @@
 
 /*************************************************************************
  * ExtractIconW				[SHELL32.180]
+ *
+ * fixme
+ *  is the filename is not a file return 1
  */
 HICON WINAPI ExtractIconW( HINSTANCE hInstance, LPCWSTR lpszExeFileName,
 	UINT nIconIndex )
@@ -703,7 +715,7 @@
 }
 
 /***********************************************************************
- * DllGetVersion [COMCTL32.25]
+ * DllGetVersion [SHELL32]
  *
  * Retrieves version information of the 'SHELL32.DLL'
  *
@@ -721,7 +733,8 @@
 HRESULT WINAPI SHELL32_DllGetVersion (DLLVERSIONINFO *pdvi)
 {
 	if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) 
-	{ WARN("wrong DLLVERSIONINFO size from app");
+	{
+	  WARN("wrong DLLVERSIONINFO size from app");
 	  return E_INVALIDARG;
 	}
 
@@ -736,6 +749,42 @@
 
 	return S_OK;
 }
+/***********************************************************************
+ * DllGetVersion [SHLWAPI]
+ *
+ * Retrieves version information of the 'SHLWAPI.DLL'
+ *
+ * PARAMS
+ *     pdvi [O] pointer to version information structure.
+ *
+ * RETURNS
+ *     Success: S_OK
+ *     Failure: E_INVALIDARG
+ *
+ * NOTES
+ *     Returns version of a SHLWAPI.dll from IE5.01.
+ */
+
+HRESULT WINAPI SHLWAPI_DllGetVersion (DLLVERSIONINFO *pdvi)
+{
+	if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) 
+	{
+	  WARN("wrong DLLVERSIONINFO size from app");
+	  return E_INVALIDARG;
+	}
+
+	pdvi->dwMajorVersion = 5;
+	pdvi->dwMinorVersion = 0;
+	pdvi->dwBuildNumber = 2314;
+	pdvi->dwPlatformID = 1000;
+
+	TRACE("%lu.%lu.%lu.%lu\n",
+	   pdvi->dwMajorVersion, pdvi->dwMinorVersion,
+	   pdvi->dwBuildNumber, pdvi->dwPlatformID);
+
+	return S_OK;
+}
+
 /*************************************************************************
  * global variables of the shell32.dll
  * all are once per process
diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c
index 485d70a..6373a8c 100644
--- a/dlls/shell32/shellord.c
+++ b/dlls/shell32/shellord.c
@@ -184,59 +184,6 @@
 }
 
 /*************************************************************************
- * OleStrToStrN					[SHELL32.78]
- */
-BOOL WINAPI OleStrToStrNA (LPSTR lpStr, INT nStr, LPCWSTR lpOle, INT nOle) 
-{
-	TRACE("(%p, %x, %s, %x)\n", lpStr, nStr, debugstr_wn(lpOle,nOle), nOle);
-	return WideCharToMultiByte (0, 0, lpOle, nOle, lpStr, nStr, NULL, NULL);
-}
-
-BOOL WINAPI OleStrToStrNW (LPWSTR lpwStr, INT nwStr, LPCWSTR lpOle, INT nOle) 
-{
-	TRACE("(%p, %x, %s, %x)\n", lpwStr, nwStr, debugstr_wn(lpOle,nOle), nOle);
-
-	if (lstrcpynW ( lpwStr, lpOle, nwStr))
-	{ return lstrlenW (lpwStr);
-	}
-	return 0;
-}
-
-BOOL WINAPI OleStrToStrNAW (LPVOID lpOut, INT nOut, LPCVOID lpIn, INT nIn) 
-{
-	if (VERSION_OsIsUnicode())
-	  return OleStrToStrNW (lpOut, nOut, lpIn, nIn);
-	return OleStrToStrNA (lpOut, nOut, lpIn, nIn);
-}
-
-/*************************************************************************
- * StrToOleStrN					[SHELL32.79]
- *  lpMulti, nMulti, nWide [IN]
- *  lpWide [OUT]
- */
-BOOL WINAPI StrToOleStrNA (LPWSTR lpWide, INT nWide, LPCSTR lpStrA, INT nStr) 
-{
-	TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_an(lpStrA,nStr), nStr);
-	return MultiByteToWideChar (0, 0, lpStrA, nStr, lpWide, nWide);
-}
-BOOL WINAPI StrToOleStrNW (LPWSTR lpWide, INT nWide, LPCWSTR lpStrW, INT nStr) 
-{
-	TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_wn(lpStrW, nStr), nStr);
-
-	if (lstrcpynW (lpWide, lpStrW, nWide))
-	{ return lstrlenW (lpWide);
-	}
-	return 0;
-}
-
-BOOL WINAPI StrToOleStrNAW (LPWSTR lpWide, INT nWide, LPCVOID lpStr, INT nStr) 
-{
-	if (VERSION_OsIsUnicode())
-	  return StrToOleStrNW (lpWide, nWide, lpStr, nStr);
-	return StrToOleStrNA (lpWide, nWide, lpStr, nStr);
-}
-
-/*************************************************************************
  * RegisterShellHook				[SHELL32.181]
  *
  * PARAMS
@@ -344,7 +291,7 @@
  *     free_ptr() - frees memory using IMalloc
  *     exported by ordinal
  */
-#define MEM_DEBUG 1
+#define MEM_DEBUG 0
 void WINAPI SHFree(LPVOID x) 
 {
 #if MEM_DEBUG
@@ -755,175 +702,6 @@
 	return 0;
 }
 /*************************************************************************
- * SHRegCloseKey			[NT4.0:SHELL32.505]
- *
- */
-HRESULT WINAPI SHRegCloseKey (HKEY hkey)
-{	TRACE("0x%04x\n",hkey);
-	return RegCloseKey( hkey );
-}
-/*************************************************************************
- * SHRegOpenKeyA				[SHELL32.506]
- *
- */
-HRESULT WINAPI SHRegOpenKeyA(HKEY hKey, LPSTR lpSubKey, LPHKEY phkResult)
-{
-	TRACE("(0x%08x, %s, %p)\n", hKey, debugstr_a(lpSubKey), phkResult);
-	return RegOpenKeyA(hKey, lpSubKey, phkResult);
-}
-
-/*************************************************************************
- * SHRegOpenKeyW				[NT4.0:SHELL32.507]
- *
- */
-HRESULT WINAPI SHRegOpenKeyW (HKEY hkey, LPCWSTR lpszSubKey, LPHKEY retkey)
-{	WARN("0x%04x %s %p\n",hkey,debugstr_w(lpszSubKey),retkey);
-	return RegOpenKeyW( hkey, lpszSubKey, retkey );
-}
-/*************************************************************************
- * SHRegQueryValueExA				[SHELL32.509]
- *
- */
-HRESULT WINAPI SHRegQueryValueExA(
-	HKEY hkey,
-	LPSTR lpValueName,
-	LPDWORD lpReserved,
-	LPDWORD lpType,
-	LPBYTE lpData,
-	LPDWORD lpcbData)
-{
-	TRACE("0x%04x %s %p %p %p %p\n", hkey, lpValueName, lpReserved, lpType, lpData, lpcbData);
-	return RegQueryValueExA (hkey, lpValueName, lpReserved, lpType, lpData, lpcbData);
-}
-/*************************************************************************
- * SHRegQueryValueW				[NT4.0:SHELL32.510]
- *
- */
-HRESULT WINAPI SHRegQueryValueW (HKEY hkey, LPWSTR lpszSubKey,
-				 LPWSTR lpszData, LPDWORD lpcbData )
-{	WARN("0x%04x %s %p %p semi-stub\n",
-		hkey, debugstr_w(lpszSubKey), lpszData, lpcbData);
-	return RegQueryValueW( hkey, lpszSubKey, lpszData, lpcbData );
-}
-
-/*************************************************************************
- * SHRegQueryValueExW				[NT4.0:SHELL32.511]
- *
- * FIXME 
- *  if the datatype REG_EXPAND_SZ then expand the string and change
- *  *pdwType to REG_SZ. 
- */
-HRESULT WINAPI SHRegQueryValueExW (HKEY hkey, LPWSTR pszValue, LPDWORD pdwReserved,
-		 LPDWORD pdwType, LPVOID pvData, LPDWORD pcbData)
-{	DWORD ret;
-	WARN("0x%04x %s %p %p %p %p semi-stub\n",
-		hkey, debugstr_w(pszValue), pdwReserved, pdwType, pvData, pcbData);
-	ret = RegQueryValueExW ( hkey, pszValue, pdwReserved, pdwType, pvData, pcbData);
-	return ret;
-}
-
- /* SHGetValue: Gets a value from the registry */
-
-/*************************************************************************
- * SHGetValueA
- *
- * Gets a value from the registry
- */
-DWORD WINAPI SHGetValueA(
-    HKEY     hkey,
-    LPCSTR   pSubKey,
-    LPCSTR   pValue,
-    LPDWORD  pwType,
-    LPVOID   pvData,
-    LPDWORD  pbData
-    )
-{
-    FIXME("(%p),stub!\n", pSubKey);
-
-	return ERROR_SUCCESS;  /* return success */
-}
-
-/*************************************************************************
- * SHGetValueW
- *
- * Gets a value from the registry
- */
-DWORD WINAPI SHGetValueW(
-    HKEY     hkey,
-    LPCWSTR  pSubKey,
-    LPCWSTR  pValue,
-    LPDWORD  pwType,
-    LPVOID   pvData,
-    LPDWORD  pbData
-    )
-{
-    FIXME("(%p),stub!\n", pSubKey);
-
-	return ERROR_SUCCESS;  /* return success */
-}
-
-/* gets a user-specific registry value. */
-
-/*************************************************************************
- * SHRegGetUSValueA
- *
- * Gets a user-specific registry value
- */
-LONG WINAPI SHRegGetUSValueA(
-    LPCSTR   pSubKey,
-    LPCSTR   pValue,
-    LPDWORD  pwType,
-    LPVOID   pvData,
-    LPDWORD  pbData,
-    BOOL     fIgnoreHKCU,
-    LPVOID   pDefaultData,
-    DWORD    wDefaultDataSize
-    )
-{
-    FIXME("(%p),stub!\n", pSubKey);
-
-	return ERROR_SUCCESS;  /* return success */
-}
-
-/*************************************************************************
- * SHRegGetUSValueW
- *
- * Gets a user-specific registry value
- */
-LONG WINAPI SHRegGetUSValueW(
-    LPCWSTR  pSubKey,
-    LPCWSTR  pValue,
-    LPDWORD  pwType,
-    LPVOID   pvData,
-    LPDWORD  pbData,
-    BOOL     flagIgnoreHKCU,
-    LPVOID   pDefaultData,
-    DWORD    wDefaultDataSize
-    )
-{
-    FIXME("(%p),stub!\n", pSubKey);
-
-	return ERROR_SUCCESS;  /* return success */
-}
-  
-/*************************************************************************
- * SHRegDeleteKeyA and SHDeleteKeyA
- */
-HRESULT WINAPI SHRegDeleteKeyA(HKEY hkey, LPCSTR pszSubKey)
-{
-	FIXME("hkey=0x%08x, %s\n", hkey, debugstr_a(pszSubKey));
-	return 0;
-}
-
-/*************************************************************************
- * SHRegDeleteKeyW and SHDeleteKeyA
- */
-HRESULT WINAPI SHRegDeleteKeyW(HKEY hkey, LPCWSTR pszSubKey)
-{
-	FIXME("hkey=0x%08x, %s\n", hkey, debugstr_w(pszSubKey));
-	return 0;
-}
-/*************************************************************************
  * ReadCabinetState				[NT 4.0:SHELL32.651]
  *
  */
@@ -957,128 +735,6 @@
 }
 
 /*************************************************************************
- * StrRetToBufA					[SHLWAPI.@]
- * 
- * converts a STRRET to a normal string
- *
- * NOTES
- *  the pidl is for STRRET OFFSET
- */
-HRESULT WINAPI StrRetToBufA (LPSTRRET src, LPITEMIDLIST pidl, LPSTR dest, DWORD len)
-{
-	return StrRetToStrNA(dest, len, src, pidl);
-}
-
-/*************************************************************************
- * StrRetToBufW					[SHLWAPI.@]
- * 
- * converts a STRRET to a normal string
- *
- * NOTES
- *  the pidl is for STRRET OFFSET
- */
-HRESULT WINAPI StrRetToBufW (LPSTRRET src, LPITEMIDLIST pidl, LPWSTR dest, DWORD len)
-{
-	return StrRetToStrNW(dest, len, src, pidl);
-}
-
-/*************************************************************************
- * StrRetToStrN					[SHELL32.96]
- * 
- * converts a STRRET to a normal string
- *
- * NOTES
- *  the pidl is for STRRET OFFSET
- */
-HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
-{
-	TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
-
-	switch (src->uType)
-	{
-	  case STRRET_WSTR:
-	    WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL);
-	    SHFree(src->u.pOleStr);
-	    break;
-
-	  case STRRET_CSTRA:
-	    lstrcpynA((LPSTR)dest, src->u.cStr, len);
-	    break;
-
-	  case STRRET_OFFSETA:
-	    lstrcpynA((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
-	    break;
-
-	  default:
-	    FIXME("unknown type!\n");
-	    if (len)
-	    {
-	      *(LPSTR)dest = '\0';
-	    }
-	    return(FALSE);
-	}
-	return S_OK;
-}
-
-HRESULT WINAPI StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
-{
-	TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
-
-	switch (src->uType)
-	{
-	  case STRRET_WSTR:
-	    lstrcpynW((LPWSTR)dest, src->u.pOleStr, len);
-	    SHFree(src->u.pOleStr);
-	    break;
-
-	  case STRRET_CSTRA:
-	    lstrcpynAtoW((LPWSTR)dest, src->u.cStr, len);
-	    break;
-
-	  case STRRET_OFFSETA:
-	    if (pidl)
-	    {
-	      lstrcpynAtoW((LPWSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
-	    }
-	    break;
-
-	  default:
-	    FIXME("unknown type!\n");
-	    if (len)
-	    { *(LPSTR)dest = '\0';
-	    }
-	    return(FALSE);
-	}
-	return S_OK;
-}
-HRESULT WINAPI StrRetToStrNAW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
-{
-	if(VERSION_OsIsUnicode())
-	  return StrRetToStrNW (dest, len, src, pidl);
-	return StrRetToStrNA (dest, len, src, pidl);
-}
-
-/*************************************************************************
- * StrChrW					[NT 4.0:SHELL32.651]
- *
- */
-LPWSTR WINAPI StrChrW (LPWSTR str, WCHAR x )
-{
-	TRACE("%s 0x%04x\n",debugstr_w(str),x);
-	return CRTDLL_wcschr(str, x);
-}
-
-/*************************************************************************
- * StrCmpNIW					[NT 4.0:SHELL32.*]
- *
- */
-INT WINAPI StrCmpNIW ( LPWSTR wstr1, LPWSTR wstr2, INT len)
-{
-	TRACE("%s %s %i stub\n", debugstr_w(wstr1),debugstr_w(wstr2),len);
-	return CRTDLL__wcsnicmp(wstr1, wstr2, len);
-}
-
-/*************************************************************************
  * SHAllocShared				[SHELL32.520]
  *
  * NOTES
@@ -1200,49 +856,6 @@
 }
 
 /*************************************************************************
- * StrFormatByteSizeA				[SHLWAPI]
- */
-LPSTR WINAPI StrFormatByteSizeA ( DWORD dw, LPSTR pszBuf, UINT cchBuf )
-{	char buf[64];
-	TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
-	if ( dw<1024L )
-	{ sprintf (buf,"%3.1f bytes", (FLOAT)dw);
-	}
-	else if ( dw<1048576L)
-	{ sprintf (buf,"%3.1f KB", (FLOAT)dw/1024);
-	}
-	else if ( dw < 1073741824L)
-	{ sprintf (buf,"%3.1f MB", (FLOAT)dw/1048576L);
-	}
-	else
-	{ sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
-	}
-	lstrcpynA (pszBuf, buf, cchBuf);
-	return pszBuf;	
-}
-
-/*************************************************************************
- * StrFormatByteSizeW				[SHLWAPI]
- */
-LPWSTR WINAPI StrFormatByteSizeW ( DWORD dw, LPWSTR pszBuf, UINT cchBuf )
-{	char buf[64];
-	TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
-	if ( dw<1024L )
-	{ sprintf (buf,"%3.1f bytes", (FLOAT)dw);
-	}
-	else if ( dw<1048576L)
-	{ sprintf (buf,"%3.1f KB", (FLOAT)dw/1024);
-	}
-	else if ( dw < 1073741824L)
-	{ sprintf (buf,"%3.1f MB", (FLOAT)dw/1048576L);
-	}
-	else
-	{ sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
-	}
-	lstrcpynAtoW (pszBuf, buf, cchBuf);
-	return pszBuf;	
-}
-/*************************************************************************
  * SHWaitForFileToOpen				[SHELL32.97]
  *
  */
@@ -1295,36 +908,6 @@
 	return 0;
 }
 /************************************************************************
- *	StrToOleStr			[SHELL32.163]
- *
- */
-int WINAPI StrToOleStrA (LPWSTR lpWideCharStr, LPCSTR lpMultiByteString)
-{
-	TRACE("(%p, %p %s)\n",
-	lpWideCharStr, lpMultiByteString, debugstr_a(lpMultiByteString));
-
-	return MultiByteToWideChar(0, 0, lpMultiByteString, -1, lpWideCharStr, MAX_PATH);
-
-}
-int WINAPI StrToOleStrW (LPWSTR lpWideCharStr, LPCWSTR lpWString)
-{
-	TRACE("(%p, %p %s)\n",
-	lpWideCharStr, lpWString, debugstr_w(lpWString));
-
-	if (lstrcpyW (lpWideCharStr, lpWString ))
-	{ return lstrlenW (lpWideCharStr);
-	}
-	return 0;
-}
-
-BOOL WINAPI StrToOleStrAW (LPWSTR lpWideCharStr, LPCVOID lpString)
-{
-	if (VERSION_OsIsUnicode())
-	  return StrToOleStrW (lpWideCharStr, lpString);
-	return StrToOleStrA (lpWideCharStr, lpString);
-}
-
-/************************************************************************
  *	SHValidateUNC				[SHELL32.173]
  *
  */
@@ -1378,3 +961,360 @@
   return FALSE; 
 }
 
+/*************************************************************************
+ *      SHCreateShellPalette
+ */
+HPALETTE WINAPI SHCreateShellPalette(HDC hdc)
+{
+	FIXME("stub\n");
+	return CreateHalftonePalette(hdc);
+}
+
+/*
+ NOTES: The most functions exported by ordinal seem to be superflous.
+ The reason for these functions to be there is to provide a wraper
+ for unicode functions to providing these functions on systems without
+ unicode functions eg. win95/win98. Since we have such functions we just
+ call these.
+*/
+
+/*************************************************************************
+ *      SHLWAPI_1	[SHLWAPI]
+ */
+DWORD WINAPI SHLWAPI_1 (
+	LPSTR lpStr,
+	LPVOID x)
+{
+	FIXME("(%p %s %p %s)\n",lpStr, debugstr_a(lpStr),x, debugstr_a(x));
+	return 0;
+}
+
+/*************************************************************************
+ *      SHLWAPI_23	[SHLWAPI.23]
+ *
+ * NOTES
+ *	converts a guid to a string
+ *	returns strlen(str)
+ */
+DWORD WINAPI SHLWAPI_23 (
+	REFGUID guid,	/* [in]  clsid */
+	LPSTR str,	/* [out] buffer */
+	INT cmax)	/* [in]  size of buffer */
+{
+	char xguid[80];
+	TRACE("(%s %p 0x%08x)stub\n", debugstr_guid(guid), str, cmax);
+
+	if (WINE_StringFromCLSID(guid,xguid)) return 0;
+	if (strlen(xguid)>=cmax) return 0;
+	strcpy(str,xguid);
+	return strlen(xguid) + 1;
+}
+
+/*************************************************************************
+ *      SHLWAPI_24	[SHLWAPI.24]
+ *
+ * NOTES
+ *	converts a guid to a string
+ *	returns strlen(str)
+ */
+DWORD WINAPI SHLWAPI_24 (
+	REFGUID guid,	/* [in]  clsid */
+	LPWSTR str,	/* [out] buffer */
+	INT cmax)	/* [in]  size of buffer */
+{
+	TRACE("(%s %p 0x%08x)stub\n", debugstr_guid(guid), str, cmax);
+	return StringFromGUID2(guid, str, cmax);
+}
+
+/*************************************************************************
+ *      SHLWAPI_156	[SHLWAPI]
+ *
+ * FIXME: function guessed
+ */
+DWORD WINAPI SHLWAPI_156 (
+	LPWSTR str1,	/* "shell32.dll" */
+	LPWSTR str2)	/* "shell32.dll" */
+{
+	FIXME("(%s %s)stub\n",debugstr_w(str1),debugstr_w(str2));
+	return lstrcmpW(str1,str2);
+}
+
+/*************************************************************************
+ *      SHLWAPI_169	[SHLWAPI]
+ */
+DWORD WINAPI SHLWAPI_169 (IUnknown * lpUnknown)
+{
+	TRACE("(%p)\n",lpUnknown);
+#if 0
+	if(!lpUnknown || !*((LPDWORD)lpUnknown)) return 0;
+	return IUnknown_Release(lpUnknown);
+#endif
+	return 0;
+}
+
+/*************************************************************************
+ *      SHLWAPI_193	[SHLWAPI]
+ */
+DWORD WINAPI SHLWAPI_193 ()
+{
+	HDC hdc;
+	DWORD ret;
+
+	TRACE("()\n");
+
+	hdc = GetDC(0);
+	ret = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
+	ReleaseDC(0, hdc);
+	return ret;
+}
+
+/*************************************************************************
+ *      SHLWAPI_219	[SHLWAPI]
+ */
+HRESULT WINAPI SHLWAPI_219 (
+	LPVOID w, /* returned by LocalAlloc */
+	LPVOID x,
+	LPVOID y,
+	LPWSTR z) /* OUT: path */
+{
+	FIXME("(%p %p %p %p)stub\n",w,x,y,z);
+	return 0xabba1252;
+}
+
+/*************************************************************************
+ *      SHLWAPI_222	[SHLWAPI]
+ *
+ * NOTES
+ *  securityattributes missing
+ */
+HANDLE WINAPI SHLWAPI_222 (LPCLSID guid)
+{
+	char lpstrName[80];
+	strcpy( lpstrName,"shell.");
+	WINE_StringFromCLSID(guid, lpstrName + strlen(lpstrName));
+
+	FIXME("(%s) stub\n", lpstrName);
+	return CreateSemaphoreA(NULL,0, 0x7fffffff, lpstrName);
+}
+
+/*************************************************************************
+ *      SHLWAPI_223	[SHLWAPI]
+ *
+ * NOTES
+ *  function guessed 
+*/
+DWORD WINAPI SHLWAPI_223 (HANDLE handle)
+{
+	DWORD oldCount;
+	
+	FIXME("(0x%08x) stub\n",handle);
+
+	ReleaseSemaphore( handle, 1, &oldCount);
+	WaitForSingleObject( handle, 0 );
+	return 0;
+}
+
+/*************************************************************************
+ *      SHLWAPI_237	[SHLWAPI]
+ */
+DWORD WINAPI SHLWAPI_237 (LPVOID x)
+{
+	FIXME("(ptr=%p str=%s wstr=%s)\n",x,debugstr_a(x),debugstr_w(x));
+	return 0xabba1234;
+}
+
+/*************************************************************************
+ *      SHLWAPI_241	[SHLWAPI]
+ *
+ */
+DWORD WINAPI SHLWAPI_241 ()
+{
+	FIXME("()stub\n");
+	return 0xabba1243;
+}
+
+/*************************************************************************
+ *      SHLWAPI_266	[SHLWAPI]
+ */
+DWORD WINAPI SHLWAPI_266 (
+	LPVOID w,
+	LPVOID x,
+	LPVOID y,
+	LPVOID z)
+{
+	FIXME("(%p %p %p %p)stub\n",w,x,y,z);
+	return 0xabba1248;
+}
+
+/*************************************************************************
+ *      SHLWAPI_267	[SHLWAPI]
+ */
+HRESULT WINAPI SHLWAPI_267 (
+	LPVOID w, /* same as 1th parameter of SHLWAPI_219 */
+	LPVOID x, /* same as 2nd parameter of SHLWAPI_219 */
+	LPVOID y,
+	LPVOID z)
+{
+	FIXME("(%p %p %p %p)stub\n",w,x,y,z);
+	*((LPDWORD)z) = 0xabba1200;
+	return 0xabba1254;
+}
+
+/*************************************************************************
+ *      SHLWAPI_268	[SHLWAPI]
+ */
+DWORD WINAPI SHLWAPI_268 (
+	LPVOID w,
+	LPVOID x)
+{
+	FIXME("(%p %p)\n",w,x);
+	return 0xabba1251; /* 0 = failure */
+}
+
+/*************************************************************************
+ *      SHLWAPI_276	[SHLWAPI]
+ *
+ */
+DWORD WINAPI SHLWAPI_276 ()
+{
+	FIXME("()stub\n");
+	return 0xabba1244;
+}
+
+/*************************************************************************
+ *      SHLWAPI_309	[SHLWAPI]
+ *
+ */
+DWORD WINAPI SHLWAPI_309 (LPVOID x)
+{
+	FIXME("(%p)stub\n",x);
+	return 0xabba1245;
+}
+
+/*************************************************************************
+ *      SHLWAPI_342	[SHLWAPI]
+ *
+ */
+DWORD WINAPI SHLWAPI_342 (
+	LPVOID w,
+	LPVOID x,
+	LPVOID y,
+	LPVOID z)
+{
+	FIXME("(%p %p %p %p)stub\n",w,x,y,z);
+	return 0xabba1249;
+}
+
+/*************************************************************************
+ *      SHLWAPI_346	[SHLWAPI]
+ */
+DWORD WINAPI SHLWAPI_346 (
+	LPCWSTR src,
+	LPWSTR dest,
+	int len)
+{
+	FIXME("(%s %p 0x%08x)stub\n",debugstr_w(src),dest,len);
+	lstrcpynW(dest, src, len);
+	return lstrlenW(dest)+1;
+}
+
+
+/*************************************************************************
+ *      SHLWAPI_377	[SHLWAPI]
+ */
+DWORD WINAPI SHLWAPI_377 (LPVOID x, LPVOID y, LPVOID z)
+{
+	FIXME("(%p %p %p)stub\n", x,y,z);
+	return 0xabba1246;
+}
+
+/*************************************************************************
+ *      SHLWAPI_437	[SHLWAPI]
+ *
+ * NOTES
+ *  has to do something with switching the api between ascii and unicode
+ *  observed values: 0 and 5
+ *
+ * accesses
+ * HKLM\System\CurrentControlSet\Control\ProductOptions
+ *
+ */
+DWORD WINAPI SHLWAPI_437 (DWORD x)
+{
+	FIXME("(0x%08lx)stub\n", x);
+	return 0xabba1247;
+}
+
+/*************************************************************************
+ *      wnsprintfA	[SHLWAPI]
+ */
+int WINAPIV wnsprintfA(LPSTR lpOut, int cchLimitIn, LPCSTR lpFmt, ...)
+{
+    va_list valist;
+    INT res;
+
+    va_start( valist, lpFmt );
+    res = wvsnprintfA( lpOut, cchLimitIn, lpFmt, valist );
+    va_end( valist );
+    return res;
+}
+
+/*************************************************************************
+ *      wnsprintfW	[SHLWAPI]
+ */
+int WINAPIV wnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt, ...)
+{
+    va_list valist;
+    INT res;
+
+    va_start( valist, lpFmt );
+    res = wvsnprintfW( lpOut, cchLimitIn, lpFmt, valist );
+    va_end( valist );
+    return res;
+}
+/*************************************************************************
+ *      UrlEscapeA	[SHLWAPI]
+ */
+HRESULT WINAPI UrlEscapeA(
+	LPCSTR pszUrl,
+	LPSTR pszEscaped,
+	LPDWORD pcchEscaped,
+	DWORD dwFlags)
+{
+	FIXME("(%s %p %p 0x%08lx)stub\n",debugstr_a(pszUrl),
+	  pszEscaped, pcchEscaped, dwFlags);
+	return 0;
+}	
+
+/*************************************************************************
+ *      UrlEscapeW	[SHLWAPI]
+ */
+HRESULT WINAPI UrlEscapeW(
+	LPCWSTR pszUrl,
+	LPWSTR pszEscaped,
+	LPDWORD pcchEscaped,
+	DWORD dwFlags)
+{
+	FIXME("(%s %p %p 0x%08lx)stub\n",debugstr_w(pszUrl),
+	  pszEscaped, pcchEscaped, dwFlags);
+	return 0;
+}	
+
+/*************************************************************************
+ *      SHELL32_714	[SHELL32]
+ */
+DWORD WINAPI SHELL32_714(LPVOID x)
+{
+ 	FIXME("(%s)stub\n", debugstr_w(x));
+	return 0;
+}
+
+/*************************************************************************
+ *      SHIsLowMemoryMachine	[SHLWAPI.@]
+ */
+DWORD WINAPI SHIsLowMemoryMachine (DWORD x)
+{
+	FIXME("0x%08lx\n", x);
+	return 0;
+}
+
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index 90375e1..7431ce5 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -75,8 +75,6 @@
  *
  * 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,
@@ -94,10 +92,17 @@
 	}
 
 	/*  if lpszFile is a complete path don't care about lpszDir */
-	if (PathIsRootA(lpszFile))
+	if (PathGetDriveNumberA(lpszFile) != -1)
 	{
 	  strcpy(szDest,lpszFile);
 	}
+	else if (lpszFile[0] == '\\' )
+	{
+	  strcpy(sTemp,lpszDir);
+	  PathStripToRootA(sTemp);
+	  strcat(sTemp,lpszFile);
+	  strcpy(szDest,sTemp);
+	}
 	else
 	{
 	  strcpy(sTemp,lpszDir);
@@ -128,10 +133,17 @@
 	}
 
 	/*  if lpszFile is a complete path don't care about lpszDir */
-	if (PathIsRootW(lpszFile))
+	if (PathGetDriveNumberW(lpszFile) != -1)
 	{
 	  CRTDLL_wcscpy(szDest,lpszFile);
 	}
+	else if (lpszFile[0] == (WCHAR)'\\' )
+	{
+	  CRTDLL_wcscpy(sTemp,lpszDir);
+	  PathStripToRootW(sTemp);
+	  CRTDLL_wcscat(sTemp,lpszFile);
+	  CRTDLL_wcscpy(szDest,sTemp);
+	}
 	else
 	{
 	  CRTDLL_wcscpy(sTemp,lpszDir);
@@ -769,7 +781,7 @@
 {
 	LPWSTR p = lpszPath;
 	
-	while (*lpszPath); p = lpszPath++;
+	while (*lpszPath) p = lpszPath++;
 	if ( *p == (WCHAR)'\\') *p = (WCHAR)'\0';
 	return p;
 }
@@ -2188,3 +2200,134 @@
 	}
 	return NULL;
 }
+
+/*************************************************************************
+ * PathAddExtensionA
+ */
+ 
+static void _PathAddDotA(LPSTR lpszPath)
+{
+	int len = strlen(lpszPath);
+	if (len && lpszPath[len-1]!='.')
+	{
+	  lpszPath[len]  = '.';
+	  lpszPath[len+1]= '\0';
+	}
+}
+
+BOOL WINAPI PathAddExtensionA(
+	LPSTR  pszPath,
+	LPCSTR pszExtension)
+{
+	if (*pszPath)
+	{
+	  LPSTR pszExt = PathFindFileNameA(pszPath);	/* last path component */
+	  pszExt = PathFindExtensionA(pszExt);	    
+	  if (*pszExt != '\0') return FALSE;		/* already with extension */
+	  _PathAddDotA(pszPath);
+	}
+
+	if (!pszExtension || *pszExtension=='\0')
+	  strcat(pszPath, "exe");
+	else
+	  strcat(pszPath, pszExtension);
+	return TRUE;
+}
+
+/*************************************************************************
+ *	PathAddExtensionW
+ */
+static void _PathAddDotW(LPWSTR lpszPath)
+{
+	int len = lstrlenW(lpszPath);
+	if (len && lpszPath[len-1]!='.')
+	{
+	  lpszPath[len]  = '.';
+	  lpszPath[len+1]= '\0';
+	}
+}
+
+/*************************************************************************
+ *	PathAddExtensionW
+ */
+BOOL WINAPI PathAddExtensionW(
+	LPWSTR  pszPath,
+	LPCWSTR pszExtension)
+{
+	static const WCHAR ext[] = { 'e','x','e',0 };
+
+	if (*pszPath)
+	{
+	  LPWSTR pszExt = PathFindFileNameW(pszPath);	/* last path component */
+	  pszExt = PathFindExtensionW(pszExt);	    
+	  if (*pszExt != '\0') return FALSE;		/* already with extension */
+	  _PathAddDotW(pszPath);
+	}
+
+	if (!pszExtension || *pszExtension=='\0')
+	  lstrcatW(pszPath, ext);
+	else
+	  lstrcatW(pszPath, pszExtension);
+	return TRUE;
+
+}
+
+/*************************************************************************
+ *	PathIsUNCServerA
+ */
+BOOL WINAPI PathIsUNCServerA(
+	LPCSTR pszPath)
+{
+	FIXME("%s\n", pszPath);
+	return FALSE;
+}
+
+/*************************************************************************
+ *	PathIsUNCServerW
+ */
+BOOL WINAPI PathIsUNCServerW(
+	LPCWSTR pszPath)
+{
+	FIXME("%s\n", debugstr_w(pszPath));
+	return FALSE;
+}
+
+/*************************************************************************
+ *	PathIsUNCServerShareA
+ */
+BOOL WINAPI PathIsUNCServerShareA(
+	LPCSTR pszPath)
+{
+	FIXME("%s\n", pszPath);
+	return FALSE;
+}
+
+/*************************************************************************
+ *	PathIsUNCServerShareW
+ */
+BOOL WINAPI PathIsUNCServerShareW(
+	LPCWSTR pszPath)
+{
+	FIXME("%s\n", debugstr_w(pszPath));
+	return FALSE;
+}
+
+/*************************************************************************
+ *	PathMakePrettyA
+ */
+BOOL WINAPI PathMakePrettyA(
+	LPSTR lpPath)
+{
+	FIXME("%s\n", lpPath);
+	return TRUE;
+}
+
+/*************************************************************************
+ *	PathMakePrettyW
+ */
+BOOL WINAPI PathMakePrettyW(
+	LPWSTR lpPath)
+{
+	FIXME("%s\n", debugstr_w(lpPath));
+	return TRUE;
+}
diff --git a/dlls/shell32/shellreg.c b/dlls/shell32/shellreg.c
new file mode 100644
index 0000000..9ca6f8d
--- /dev/null
+++ b/dlls/shell32/shellreg.c
@@ -0,0 +1,307 @@
+/*
+	Shell Registry Access
+*/
+#include <string.h>
+#include <stdio.h>
+#include "winerror.h"
+#include "winreg.h"
+#include "debugtools.h"
+#include "winnls.h"
+#include "winversion.h"
+#include "heap.h"
+#include "crtdll.h"
+
+#include "shellapi.h"
+#include "shlobj.h"
+#include "shell32_main.h"
+#include "wine/undocshell.h"
+
+DEFAULT_DEBUG_CHANNEL(shell);
+
+/*************************************************************************
+ * SHRegOpenKeyA				[SHELL32.506]
+ *
+ */
+HRESULT WINAPI SHRegOpenKeyA(
+	HKEY hKey,
+	LPSTR lpSubKey,
+	LPHKEY phkResult)
+{
+	TRACE("(0x%08x, %s, %p)\n", hKey, debugstr_a(lpSubKey), phkResult);
+	return RegOpenKeyA(hKey, lpSubKey, phkResult);
+}
+
+/*************************************************************************
+ * SHRegOpenKeyW				[NT4.0:SHELL32.507]
+ *
+ */
+HRESULT WINAPI SHRegOpenKeyW (
+	HKEY hkey,
+	LPCWSTR lpszSubKey,
+	LPHKEY retkey)
+{
+	WARN("0x%04x %s %p\n",hkey,debugstr_w(lpszSubKey),retkey);
+	return RegOpenKeyW( hkey, lpszSubKey, retkey );
+}
+
+/*************************************************************************
+ * SHRegQueryValueExA SHQueryValueExA		[SHELL32.509][SHLWAPI.@]
+ *
+ */
+HRESULT WINAPI SHRegQueryValueExA(
+	HKEY hkey,
+	LPSTR lpValueName,
+	LPDWORD lpReserved,
+	LPDWORD lpType,
+	LPBYTE lpData,
+	LPDWORD lpcbData)
+{
+	TRACE("0x%04x %s %p %p %p %p\n", hkey, lpValueName, lpReserved, lpType, lpData, lpcbData);
+	return RegQueryValueExA (hkey, lpValueName, lpReserved, lpType, lpData, lpcbData);
+}
+
+/*************************************************************************
+ * SHRegQueryValueW				[NT4.0:SHELL32.510]
+ *
+ */
+HRESULT WINAPI SHRegQueryValueW(
+	HKEY hkey,
+	LPWSTR lpszSubKey,
+	LPWSTR lpszData,
+	LPDWORD lpcbData )
+{
+	WARN("0x%04x %s %p %p semi-stub\n",
+		hkey, debugstr_w(lpszSubKey), lpszData, lpcbData);
+	return RegQueryValueW( hkey, lpszSubKey, lpszData, lpcbData );
+}
+
+/*************************************************************************
+ * SHRegQueryValueExW, SHQueryValueExW	[NT4.0:SHELL32.511][SHLWAPI.@]
+ *
+ * FIXME 
+ *  if the datatype REG_EXPAND_SZ then expand the string and change
+ *  *pdwType to REG_SZ. 
+ */
+HRESULT WINAPI SHRegQueryValueExW (
+	HKEY hkey,
+	LPWSTR pszValue,
+	LPDWORD pdwReserved,
+	LPDWORD pdwType,
+	LPVOID pvData,
+	LPDWORD pcbData)
+{
+	DWORD ret;
+	WARN("0x%04x %s %p %p %p %p semi-stub\n",
+		hkey, debugstr_w(pszValue), pdwReserved, pdwType, pvData, pcbData);
+	ret = RegQueryValueExW ( hkey, pszValue, pdwReserved, pdwType, pvData, pcbData);
+	return ret;
+}
+
+ /* SHGetValue: Gets a value from the registry */
+
+/*************************************************************************
+ * SHGetValueA
+ *
+ * Gets a value from the registry
+ */
+DWORD WINAPI SHGetValueA(
+	HKEY     hkey,
+	LPCSTR   pSubKey,
+	LPCSTR   pValue,
+	LPDWORD  pwType,
+	LPVOID   pvData,
+	LPDWORD  pbData)
+{
+	HKEY hSubKey;
+	DWORD res;
+	
+	TRACE("(%s %s)\n", pSubKey, pValue);
+	
+	if((res = RegOpenKeyA(hkey, pSubKey, &hSubKey))) return res;
+	res = RegQueryValueExA(hSubKey, pValue, 0, pwType, pvData, pbData);
+	RegCloseKey( hSubKey );
+	
+	return res;
+}
+
+/*************************************************************************
+ * SHGetValueW
+ *
+ * Gets a value from the registry
+ */
+DWORD WINAPI SHGetValueW(
+	HKEY     hkey,
+	LPCWSTR  pSubKey,
+	LPCWSTR  pValue,
+	LPDWORD  pwType,
+	LPVOID   pvData,
+	LPDWORD  pbData)
+{
+	HKEY hSubKey;
+	DWORD res;
+	
+	TRACE("(%s %s)\n", debugstr_w(pSubKey), debugstr_w(pValue));
+	
+	if((res = RegOpenKeyW(hkey, pSubKey, &hSubKey))) return res;
+	res = RegQueryValueExW(hSubKey, pValue, 0, pwType, pvData, pbData);
+	RegCloseKey( hSubKey );
+	
+	return res;
+}
+
+/* gets a user-specific registry value. */
+
+/*************************************************************************
+ * SHRegGetUSValueA
+ *
+ * Gets a user-specific registry value
+ */
+LONG WINAPI SHRegGetUSValueA(
+	LPCSTR   pSubKey,
+	LPCSTR   pValue,
+	LPDWORD  pwType,
+	LPVOID   pvData,
+	LPDWORD  pbData,
+	BOOL     fIgnoreHKCU,
+	LPVOID   pDefaultData,
+	DWORD    wDefaultDataSize)
+{
+	FIXME("(%p),stub!\n", pSubKey);
+	return ERROR_SUCCESS;  /* return success */
+}
+
+/*************************************************************************
+ * SHRegGetUSValueW
+ *
+ * Gets a user-specific registry value
+ */
+LONG WINAPI SHRegGetUSValueW(
+	LPCWSTR  pSubKey,
+	LPCWSTR  pValue,
+	LPDWORD  pwType,
+	LPVOID   pvData,
+	LPDWORD  pbData,
+	BOOL     flagIgnoreHKCU,
+	LPVOID   pDefaultData,
+	DWORD    wDefaultDataSize)
+{
+	FIXME("(%p),stub!\n", pSubKey);
+	return ERROR_SUCCESS;  /* return success */
+}
+
+/*************************************************************************
+ * SHRegGetBoolUSValueA
+ */
+BOOL WINAPI SHRegGetBoolUSValueA(
+	LPCSTR pszSubKey,
+	LPCSTR pszValue,
+	BOOL fIgnoreHKCU,
+	BOOL fDefault)
+{
+	FIXME("%s %s\n", pszSubKey,pszValue);
+	return fDefault;
+}
+
+/*************************************************************************
+ * SHRegGetBoolUSValueW
+ */
+BOOL WINAPI SHRegGetBoolUSValueW(
+	LPCWSTR pszSubKey,
+	LPCWSTR pszValue,
+	BOOL fIgnoreHKCU,
+	BOOL fDefault)
+{
+	FIXME("%s %s\n", debugstr_w(pszSubKey),debugstr_w(pszValue));
+	return fDefault;
+}
+
+/*************************************************************************
+ *      SHRegQueryUSValueA	[SHLWAPI]
+ */
+LONG WINAPI SHRegQueryUSValueA(
+	HKEY/*HUSKEY*/ hUSKey,
+	LPCSTR pszValue,
+	LPDWORD pdwType,
+	void *pvData,
+	LPDWORD pcbData,
+	BOOL fIgnoreHKCU,
+	void *pvDefaultData,
+	DWORD dwDefaultDataSize)
+{
+	FIXME("%s stub\n",pszValue);
+	return 1;
+}
+
+/*************************************************************************
+ * SHRegGetPathA
+ */
+DWORD WINAPI SHRegGetPathA(
+	HKEY hKey,
+	LPCSTR pcszSubKey,
+	LPCSTR pcszValue,
+	LPSTR pszPath,
+	DWORD dwFlags)
+{
+	FIXME("%s %s\n", pcszSubKey, pcszValue);
+	return 0;
+}
+
+/*************************************************************************
+ * SHRegGetPathW
+ */
+DWORD WINAPI SHRegGetPathW(
+	HKEY hKey,
+	LPCWSTR pcszSubKey,
+	LPCWSTR pcszValue,
+	LPWSTR pszPath,
+	DWORD dwFlags)
+{
+	FIXME("%s %s\n", debugstr_w(pcszSubKey), debugstr_w(pcszValue));
+	return 0;
+}
+/*************************************************************************
+ * SHRegDeleteKeyA and SHDeleteKeyA
+ */
+HRESULT WINAPI SHRegDeleteKeyA(
+	HKEY hkey,
+	LPCSTR pszSubKey)
+{
+	FIXME("hkey=0x%08x, %s\n", hkey, debugstr_a(pszSubKey));
+	return 0;
+}
+
+/*************************************************************************
+ * SHRegDeleteKeyW and SHDeleteKeyA
+ */
+HRESULT WINAPI SHRegDeleteKeyW(
+	HKEY hkey,
+	LPCWSTR pszSubKey)
+{
+	FIXME("hkey=0x%08x, %s\n", hkey, debugstr_w(pszSubKey));
+	return 0;
+}
+
+/*************************************************************************
+ *      SHSetValueA	[SHLWAPI]
+ */
+DWORD WINAPI SHSetValueA(
+	HKEY hkey,
+	LPCSTR pszSubKey,
+	LPCSTR pszValue,
+	DWORD dwType,
+	LPCVOID pvData,
+	DWORD cbData)
+{
+	FIXME("(%s %s)stub\n",pszSubKey, pszValue);
+	return 1;
+}
+
+/*************************************************************************
+ * SHRegCloseKey			[NT4.0:SHELL32.505]
+ *
+ */
+HRESULT WINAPI SHRegCloseKey (HKEY hkey)
+{
+	TRACE("0x%04x\n",hkey);
+	return RegCloseKey( hkey );
+}
diff --git a/dlls/shell32/shellstring.c b/dlls/shell32/shellstring.c
new file mode 100644
index 0000000..229973d
--- /dev/null
+++ b/dlls/shell32/shellstring.c
@@ -0,0 +1,467 @@
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h> 
+
+#include "winnls.h"
+#include "winerror.h"
+#include "debugtools.h"
+#include "winversion.h"
+#include "crtdll.h"
+#include "heap.h"
+
+#include "shellapi.h"
+#include "wine/undocshell.h"
+
+DEFAULT_DEBUG_CHANNEL(shell);
+
+/************************* STRRET functions ****************************/
+
+/*************************************************************************
+ * StrRetToStrN					[SHELL32.96]
+ * 
+ * converts a STRRET to a normal string
+ *
+ * NOTES
+ *  the pidl is for STRRET OFFSET
+ */
+HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
+{
+	TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
+
+	switch (src->uType)
+	{
+	  case STRRET_WSTR:
+	    WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL);
+	    SHFree(src->u.pOleStr);
+	    break;
+
+	  case STRRET_CSTRA:
+	    lstrcpynA((LPSTR)dest, src->u.cStr, len);
+	    break;
+
+	  case STRRET_OFFSETA:
+	    lstrcpynA((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
+	    break;
+
+	  default:
+	    FIXME("unknown type!\n");
+	    if (len)
+	    {
+	      *(LPSTR)dest = '\0';
+	    }
+	    return(FALSE);
+	}
+	return S_OK;
+}
+
+HRESULT WINAPI StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
+{
+	TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
+
+	switch (src->uType)
+	{
+	  case STRRET_WSTR:
+	    lstrcpynW((LPWSTR)dest, src->u.pOleStr, len);
+	    SHFree(src->u.pOleStr);
+	    break;
+
+	  case STRRET_CSTRA:
+	    lstrcpynAtoW((LPWSTR)dest, src->u.cStr, len);
+	    break;
+
+	  case STRRET_OFFSETA:
+	    if (pidl)
+	    {
+	      lstrcpynAtoW((LPWSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
+	    }
+	    break;
+
+	  default:
+	    FIXME("unknown type!\n");
+	    if (len)
+	    { *(LPSTR)dest = '\0';
+	    }
+	    return(FALSE);
+	}
+	return S_OK;
+}
+HRESULT WINAPI StrRetToStrNAW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
+{
+	if(VERSION_OsIsUnicode())
+	  return StrRetToStrNW (dest, len, src, pidl);
+	return StrRetToStrNA (dest, len, src, pidl);
+}
+
+/*************************************************************************
+ * StrRetToBufA					[SHLWAPI.@]
+ * 
+ * converts a STRRET to a normal string
+ *
+ * NOTES
+ *  the pidl is for STRRET OFFSET
+ */
+HRESULT WINAPI StrRetToBufA (LPSTRRET src, LPITEMIDLIST pidl, LPSTR dest, DWORD len)
+{
+	return StrRetToStrNA(dest, len, src, pidl);
+}
+
+/*************************************************************************
+ * StrRetToBufW					[SHLWAPI.@]
+ * 
+ * converts a STRRET to a normal string
+ *
+ * NOTES
+ *  the pidl is for STRRET OFFSET
+ */
+HRESULT WINAPI StrRetToBufW (LPSTRRET src, LPITEMIDLIST pidl, LPWSTR dest, DWORD len)
+{
+	return StrRetToStrNW(dest, len, src, pidl);
+}
+
+/************************* string functions ****************************/
+
+/*************************************************************************
+ * StrChrA					[SHLWAPI]
+ */
+LPSTR WINAPI StrChrA (LPCSTR str, INT c)
+{
+	TRACE("%s %i stub\n", str,c);
+	return strchr(str, c);
+}
+
+/*************************************************************************
+ * StrChrW					[NT 4.0:SHELL32.651]
+ *
+ */
+LPWSTR WINAPI StrChrW (LPWSTR str, WCHAR x )
+{
+	TRACE("%s 0x%04x\n",debugstr_w(str),x);
+	return CRTDLL_wcschr(str, x);
+}
+
+/*************************************************************************
+ * StrCmpNA					[NT 4.0:SHELL32.*]
+ */
+INT WINAPI StrCmpNA ( LPCSTR str1, LPCSTR str2, INT len)
+{
+	TRACE("%s %s %i stub\n", str1,str2,len);
+	return strncmp(str1, str2, len);
+}
+
+/*************************************************************************
+ * StrCmpNW					[NT 4.0:SHELL32.*]
+ */
+INT WINAPI StrCmpNW ( LPCWSTR wstr1, LPCWSTR wstr2, INT len)
+{
+	TRACE("%s %s %i stub\n", debugstr_w(wstr1),debugstr_w(wstr2),len);
+	return CRTDLL_wcsncmp(wstr1, wstr2, len);
+}
+
+/*************************************************************************
+ * StrCmpNIA					[NT 4.0:SHELL32.*]
+ */
+int WINAPI StrCmpNIA ( LPCSTR str1, LPCSTR str2, int len)
+{
+	TRACE("%s %s %i stub\n", str1,str2,len);
+	return strncasecmp(str1, str2, len);
+}
+
+/*************************************************************************
+ * StrCmpNIW					[NT 4.0:SHELL32.*]
+ */
+int WINAPI StrCmpNIW ( LPCWSTR wstr1, LPCWSTR wstr2, int len)
+{
+	TRACE("%s %s %i stub\n", debugstr_w(wstr1),debugstr_w(wstr2),len);
+	return CRTDLL__wcsnicmp(wstr1, wstr2, len);
+}
+
+/*************************************************************************
+ * StrStrA					[SHLWAPI]
+ */
+LPSTR WINAPI StrStrA(LPCSTR lpFirst, LPCSTR lpSrch)
+{
+    while (*lpFirst)
+    {
+        LPCSTR p1 = lpFirst, p2 = lpSrch;
+        while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
+        if (!*p2) return (LPSTR)lpFirst;
+        lpFirst++;
+    }
+    return NULL;
+}
+
+/*************************************************************************
+ * StrStrW					[SHLWAPI]
+ */
+LPWSTR WINAPI StrStrW(LPCWSTR lpFirst, LPCWSTR lpSrch)
+{
+    while (*lpFirst)
+    {
+        LPCWSTR p1 = lpFirst, p2 = lpSrch;
+        while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
+        if (!*p2) return (LPWSTR)lpFirst;
+        lpFirst++;
+    }
+    return NULL;
+}
+
+/*************************************************************************
+ * StrStrIA					[SHLWAPI]
+ */
+LPSTR WINAPI StrStrIA(LPCSTR lpFirst, LPCSTR lpSrch)
+{
+    while (*lpFirst)
+    {
+        LPCSTR p1 = lpFirst, p2 = lpSrch;
+        while (*p1 && *p2 && toupper(*p1) == toupper(*p2)) { p1++; p2++; }
+        if (!*p2) return (LPSTR)lpFirst;
+        lpFirst++;
+    }
+    return NULL;
+}
+
+/*************************************************************************
+ * StrStrIW					[SHLWAPI]
+ */
+LPWSTR WINAPI StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch)
+{
+    while (*lpFirst)
+    {
+        LPCWSTR p1 = lpFirst, p2 = lpSrch;
+        while (*p1 && *p2 && CRTDLL_towupper(*p1) == CRTDLL_towupper(*p2)) { p1++; p2++; }
+        if (!*p2) return (LPWSTR)lpFirst;
+        lpFirst++;
+    }
+    return NULL;
+}
+
+/*************************************************************************
+ *	StrToIntA			[SHLWAPI]
+ */
+int WINAPI StrToIntA(LPCSTR lpSrc)
+{
+	TRACE("%s\n", lpSrc);
+	return atol(lpSrc);
+}
+
+/*************************************************************************
+ *	StrToIntW			[SHLWAPI]
+ */
+int WINAPI StrToIntW(LPCWSTR lpSrc)
+{
+	int ret;
+	LPSTR lpStr =  HEAP_strdupWtoA(GetProcessHeap(),0,lpSrc);
+
+	TRACE("%s\n", debugstr_w(lpSrc));
+
+	ret = atol(lpStr);
+	HeapFree(GetProcessHeap(),0,lpStr);
+	return ret;
+}
+
+/*************************************************************************
+ *	StrDupA			[SHLWAPI]
+ */
+LPSTR WINAPI StrDupA (LPCSTR lpSrc)
+{
+	int len = strlen(lpSrc);
+	LPSTR lpDest = (LPSTR) LocalAlloc(LMEM_FIXED, len+1);
+	
+	TRACE("%s\n", lpSrc);
+
+	if (lpDest) strcpy(lpDest, lpSrc);
+	return lpDest;
+}
+
+/*************************************************************************
+ *	StrDupW			[SHLWAPI]
+ */
+LPWSTR WINAPI StrDupW (LPCWSTR lpSrc)
+{
+	int len = lstrlenW(lpSrc);
+	LPWSTR lpDest = (LPWSTR) LocalAlloc(LMEM_FIXED, sizeof(WCHAR) * (len+1));
+	
+	TRACE("%s\n", debugstr_w(lpSrc));
+
+	if (lpDest) lstrcpyW(lpDest, lpSrc);
+	return lpDest;
+}
+
+/*************************************************************************
+ *	StrCSpnA		[SHLWAPI]
+ */
+int StrCSpnA (LPCSTR lpStr, LPCSTR lpSet)
+{
+	int i,j, pos = strlen(lpStr);
+
+	TRACE("(%p %s  %p %s)\n",
+	   lpStr, debugstr_a(lpStr), lpSet, debugstr_a(lpSet));
+
+	for (i=0; i < strlen(lpSet) ; i++ )
+	{
+	  for (j = 0; j < pos;j++)
+	  {
+	    if (lpStr[j] == lpSet[i])
+	    {
+	      pos = j;
+	    }
+	  }
+	}      
+	TRACE("-- %u\n", pos);
+	return pos;	
+}
+
+/*************************************************************************
+ *	StrCSpnW		[SHLWAPI]
+ */
+int StrCSpnW (LPCWSTR lpStr, LPCWSTR lpSet)
+{
+	int i,j, pos = lstrlenW(lpStr);
+
+	TRACE("(%p %s %p %s)\n",
+	   lpStr, debugstr_w(lpStr), lpSet, debugstr_w(lpSet));
+
+	for (i=0; i < lstrlenW(lpSet) ; i++ )
+	{
+	  for (j = 0; j < pos;j++)
+	  {
+	    if (lpStr[j] == lpSet[i])
+	    {
+	      pos = j;
+	    }
+	  }
+	}      
+	TRACE("-- %u\n", pos);
+	return pos;	
+}
+
+/************************* OLESTR functions ****************************/
+
+/************************************************************************
+ *	StrToOleStr			[SHELL32.163]
+ *
+ */
+int WINAPI StrToOleStrA (LPWSTR lpWideCharStr, LPCSTR lpMultiByteString)
+{
+	TRACE("(%p, %p %s)\n",
+	lpWideCharStr, lpMultiByteString, debugstr_a(lpMultiByteString));
+
+	return MultiByteToWideChar(0, 0, lpMultiByteString, -1, lpWideCharStr, MAX_PATH);
+
+}
+int WINAPI StrToOleStrW (LPWSTR lpWideCharStr, LPCWSTR lpWString)
+{
+	TRACE("(%p, %p %s)\n",
+	lpWideCharStr, lpWString, debugstr_w(lpWString));
+
+	if (lstrcpyW (lpWideCharStr, lpWString ))
+	{ return lstrlenW (lpWideCharStr);
+	}
+	return 0;
+}
+
+BOOL WINAPI StrToOleStrAW (LPWSTR lpWideCharStr, LPCVOID lpString)
+{
+	if (VERSION_OsIsUnicode())
+	  return StrToOleStrW (lpWideCharStr, lpString);
+	return StrToOleStrA (lpWideCharStr, lpString);
+}
+
+/*************************************************************************
+ * StrToOleStrN					[SHELL32.79]
+ *  lpMulti, nMulti, nWide [IN]
+ *  lpWide [OUT]
+ */
+BOOL WINAPI StrToOleStrNA (LPWSTR lpWide, INT nWide, LPCSTR lpStrA, INT nStr) 
+{
+	TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_an(lpStrA,nStr), nStr);
+	return MultiByteToWideChar (0, 0, lpStrA, nStr, lpWide, nWide);
+}
+BOOL WINAPI StrToOleStrNW (LPWSTR lpWide, INT nWide, LPCWSTR lpStrW, INT nStr) 
+{
+	TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_wn(lpStrW, nStr), nStr);
+
+	if (lstrcpynW (lpWide, lpStrW, nWide))
+	{ return lstrlenW (lpWide);
+	}
+	return 0;
+}
+
+BOOL WINAPI StrToOleStrNAW (LPWSTR lpWide, INT nWide, LPCVOID lpStr, INT nStr) 
+{
+	if (VERSION_OsIsUnicode())
+	  return StrToOleStrNW (lpWide, nWide, lpStr, nStr);
+	return StrToOleStrNA (lpWide, nWide, lpStr, nStr);
+}
+
+/*************************************************************************
+ * OleStrToStrN					[SHELL32.78]
+ */
+BOOL WINAPI OleStrToStrNA (LPSTR lpStr, INT nStr, LPCWSTR lpOle, INT nOle) 
+{
+	TRACE("(%p, %x, %s, %x)\n", lpStr, nStr, debugstr_wn(lpOle,nOle), nOle);
+	return WideCharToMultiByte (0, 0, lpOle, nOle, lpStr, nStr, NULL, NULL);
+}
+
+BOOL WINAPI OleStrToStrNW (LPWSTR lpwStr, INT nwStr, LPCWSTR lpOle, INT nOle) 
+{
+	TRACE("(%p, %x, %s, %x)\n", lpwStr, nwStr, debugstr_wn(lpOle,nOle), nOle);
+
+	if (lstrcpynW ( lpwStr, lpOle, nwStr))
+	{ return lstrlenW (lpwStr);
+	}
+	return 0;
+}
+
+BOOL WINAPI OleStrToStrNAW (LPVOID lpOut, INT nOut, LPCVOID lpIn, INT nIn) 
+{
+	if (VERSION_OsIsUnicode())
+	  return OleStrToStrNW (lpOut, nOut, lpIn, nIn);
+	return OleStrToStrNA (lpOut, nOut, lpIn, nIn);
+}
+
+/*************************************************************************
+ * StrFormatByteSizeA				[SHLWAPI]
+ */
+LPSTR WINAPI StrFormatByteSizeA ( DWORD dw, LPSTR pszBuf, UINT cchBuf )
+{	char buf[64];
+	TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
+	if ( dw<1024L )
+	{ sprintf (buf,"%3.1f bytes", (FLOAT)dw);
+	}
+	else if ( dw<1048576L)
+	{ sprintf (buf,"%3.1f KB", (FLOAT)dw/1024);
+	}
+	else if ( dw < 1073741824L)
+	{ sprintf (buf,"%3.1f MB", (FLOAT)dw/1048576L);
+	}
+	else
+	{ sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
+	}
+	lstrcpynA (pszBuf, buf, cchBuf);
+	return pszBuf;	
+}
+
+/*************************************************************************
+ * StrFormatByteSizeW				[SHLWAPI]
+ */
+LPWSTR WINAPI StrFormatByteSizeW ( DWORD dw, LPWSTR pszBuf, UINT cchBuf )
+{	char buf[64];
+	TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
+	if ( dw<1024L )
+	{ sprintf (buf,"%3.1f bytes", (FLOAT)dw);
+	}
+	else if ( dw<1048576L)
+	{ sprintf (buf,"%3.1f KB", (FLOAT)dw/1024);
+	}
+	else if ( dw < 1073741824L)
+	{ sprintf (buf,"%3.1f MB", (FLOAT)dw/1048576L);
+	}
+	else
+	{ sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
+	}
+	lstrcpynAtoW (pszBuf, buf, cchBuf);
+	return pszBuf;	
+}
+
diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c
index ea3c06a..6ff64d7 100644
--- a/dlls/shell32/shlfolder.c
+++ b/dlls/shell32/shlfolder.c
@@ -1819,12 +1819,12 @@
 
 	  if(IsEqualIID(riid, &IID_IDropTarget))
 	  {
-	    FIXME("IDropTarget not implemented\n");
+	    WARN("IDropTarget not implemented\n");
 	    hr = E_NOTIMPL;
 	  }
 	  else if(IsEqualIID(riid, &IID_IContextMenu))
 	  {
-	    FIXME("IContextMenu not implemented\n");
+	    WARN("IContextMenu not implemented\n");
 	    hr = E_NOTIMPL;
 	  }
 	  else if(IsEqualIID(riid, &IID_IShellView))
@@ -2242,12 +2242,12 @@
 
 	  if(IsEqualIID(riid, &IID_IDropTarget))
 	  {
-	    FIXME("IDropTarget not implemented\n");
+	    WARN("IDropTarget not implemented\n");
 	    hr = E_NOTIMPL;
 	  }
 	  else if(IsEqualIID(riid, &IID_IContextMenu))
 	  {
-	    FIXME("IContextMenu not implemented\n");
+	    WARN("IContextMenu not implemented\n");
 	    hr = E_NOTIMPL;
 	  }
 	  else if(IsEqualIID(riid, &IID_IShellView))
diff --git a/dlls/shell32/shlmenu.c b/dlls/shell32/shlmenu.c
index 5b41ccc..9c35dc7 100644
--- a/dlls/shell32/shlmenu.c
+++ b/dlls/shell32/shlmenu.c
@@ -106,7 +106,7 @@
  */
 static int FM_InitMenuPopup(HMENU hmenu, LPITEMIDLIST pAlternatePidl)
 {	IShellFolder	*lpsf, *lpsf2;
-	ULONG		ulItemAttr;
+	ULONG		ulItemAttr = SFGAO_FOLDER;
 	UINT		uID, uFlags, uEnumFlags;
 	LPFNFMCALLBACK	lpfnCallback;
 	LPITEMIDLIST	pidl;
diff --git a/dlls/shell32/shlwapi.spec b/dlls/shell32/shlwapi.spec
index 735c2ae..18569e7 100644
--- a/dlls/shell32/shlwapi.spec
+++ b/dlls/shell32/shlwapi.spec
@@ -1,8 +1,7 @@
 name shlwapi
 type win32
 
-# ordinal exports
-1   stub @
+1   stdcall SHLWAPI_1(ptr ptr)SHLWAPI_1
 2   stub @
 3   stub @
 4   stub @
@@ -24,8 +23,8 @@
 20  stub @
 21  stub @
 22  stub @
-23  stub @
-24  stub @
+23  stdcall SHLWAPI_23(ptr ptr long)SHLWAPI_23
+24  stdcall SHLWAPI_24(ptr ptr long)SHLWAPI_24
 25  stub @
 26  stub @
 27  stub @
@@ -68,9 +67,9 @@
 64  stub @
 65  stub @
 66  stub @
-67  stub @
-68  stub @
-69  stub @
+67 forward SHLWAPI_67 user32.FindWindowW
+68 forward SHLWAPI_68 kernel32.FormatMessageW
+69 forward SHLWAPI_69 user32.GetClassInfoW
 70  stub @
 71  stub @
 72  stub @
@@ -81,10 +80,10 @@
 77  stub @
 78  stub @
 79  stub @
-80  stub @
-81  stub @
-82  stub @
-83  stub @
+80  forward SHLWAPI_80 kernel32.GetModuleFileNameW
+81  forward SHLWAPI_81 kernel32.GetSystemDirectoryW
+82  forward SHLWAPI_82 kernel32.SearchPathW
+83  forward SHLWAPI_83 kernel32.GetModuleHandleW
 84  stub @
 85  stub @
 86  stub @
@@ -103,7 +102,7 @@
 99  stub @
 100 stub @
 101 stub @
-102 stub @
+102 forward SHLWAPI_102 user32.LoadCursorW
 103 stub @
 104 stub @
 105 stub @
@@ -121,18 +120,18 @@
 117 stub @
 118 stub @
 119 stub @
-120 stub @
+120 forward SHLWAPI_120 advapi32.RegCreateKeyExW
 121 stub @
 122 stub @
 123 stub @
 124 stub @
-125 stub @
+125 forward SHLWAPI_125 advapi32.RegOpenKeyExW
 126 stub @
 127 stub @
-128 stub @
+128 forward SHLWAPI_128 advapi32.RegQueryValueExW
 129 stub @
 130 stub @
-131 stub @
+131 forward SHLWAPI_131 user32.RegisterClassW
 132 stub @
 133 stub @
 134 stub @
@@ -148,7 +147,7 @@
 144 stub @
 145 stub @
 146 stub @
-147 stub @
+147 forward SHLWAPI_147 user32.UnregisterClassW
 148 stub @
 149 stub @
 150 stub @
@@ -157,26 +156,309 @@
 153 stub @
 154 stub @
 155 stub @
-156 stub @
+156 stdcall SHLWAPI_156 (wstr wstr) SHLWAPI_156
 157 stub @
 158 stub @
 159 stub @
 160 stub @
 161 stub @
+162 stub @
+163 stub @
+164 stub @
+165 stub @
+166 stub @
+167 stub @
+168 stub @
+169 stdcall SHLWAPI_169(long)SHLWAPI_169
+170 stub @
+171 stub @
+172 stub @
+173 stub @
+174 stub @
+175 stub @
+176 stub @
+177 stub @
+178 stub @
+179 stub @
+180 stub @
+181 stub @
+182 stub @
+183 stub @
+184 stub @
+185 stub @
+186 stub @
+187 stub @
+188 stub @
+189 stub @
+190 stub @
+191 stub @
+192 stub @
+193 stdcall SHLWAPI_193()SHLWAPI_193
+194 stub @
+195 stub @
+196 stub @
+197 stub @
+198 stub @
+199 stub @
+200 stub @
+201 stub @
+202 stub @
+203 stub @
+204 stub @
+205 stub @
+206 stub @
+207 stub @
+208 stub @
+209 stub @
+210 stub @
+211 stub @
+212 stub @
+213 stub @
+214 stub @
+215 stub @
+216 stub @
+217 stub @
+218 stub @
+219 stdcall SHLWAPI_219(long long long long)SHLWAPI_219
+220 stub @
+221 stub @
+222 stdcall SHLWAPI_222(long)SHLWAPI_222
+223 stdcall SHLWAPI_223(long)SHLWAPI_223
+224 stub @
+225 stub @
+226 stub @
+227 stub @
+228 stub @
+229 stub @
+230 stub @
+231 stub @
+232 stub @
+233 stub @
+234 stub @
+235 stub @
+236 stub @
+237 stdcall SHLWAPI_237(ptr)SHLWAPI_237
+238 stub @
+239 stub @
+240 stub @
+241 stdcall SHLWAPI_241()SHLWAPI_241
+242 stub @
+243 stub @
+244 stub @
+245 stub @
+246 stub @
+247 stub @
+248 stub @
+249 stub @
+250 stub @
+251 stub @
+252 stub @
+253 stub AssocCreate
+254 stub AssocQueryKeyA
+255 stub AssocQueryKeyW
+256 stub @
+257 stub @
+258 stub @
+259 stub @
+260 stub @
+261 stub @
+262 stub @
+263 stub @
+264 stub @
+265 stub @
+266 stdcall SHLWAPI_266(long long long long)SHLWAPI_266
+267 stdcall SHLWAPI_267(long long long long)SHLWAPI_267
+268 stdcall SHLWAPI_268(long long)SHLWAPI_268
+269 stub @
+270 stub @
+271 stub @
+272 stub @
+273 stub @
+274 stub @
+275 stub @
+276 stdcall SHLWAPI_276()SHLWAPI_276
+277 stub @
+278 stub @
+279 stub @
+280 stub @
+281 stub @
+282 stub @
+283 stub @
+284 stub @
+285 stub @
+286 stub @
+287 stub @
+288 stub @
+289 stub @
+290 stub @
+291 stub @
+292 stub @
+293 stub @
+294 stub @
+295 stub @
+296 stub @
+297 stub @
+298 stub @
+299 stub @
+300 stub @
+301 stub @
+302 stub @
+303 stub @
+304 stub @
+305 stub @
+306 stub @
+307 stub @
+308 stub @
+309 stdcall SHLWAPI_309(ptr)SHLWAPI_309
+310 stub @
+311 stub @
+312 stub @
+313 stub @
+314 stub @
+315 stub @
+316 stub SHCreateStreamOnFileAOld
+317 stub SHCreateStreamOnFileWOld
+318 stub @
+319 stub @
+320 stub @
+321 stub @
+322 stub @
+323 stub @
+324 stub @
+325 stub @
+326 stub @
+327 stub @
+328 stub @
+329 stub @
+330 stub @
+331 stub @
+332 stub @
+333 stub @
+334 stub @
+335 stub @
+336 stub @
+337 stub @
+338 stub @
+339 stub @
+340 stub @
+341 stub @
+342 stdcall SHLWAPI_342(long long long long)SHLWAPI_342
+343 stub @
+344 stub @
+345 stub @
+346 stdcall SHLWAPI_346(wstr ptr long)SHLWAPI_346
+347 stub @
+348 stub @
+349 stub @
+350 stub @
+351 stub @
+352 stub @
+353 stub @
+354 stub @
+355 stub @
+356 stub @
+357 stub @
+358 stub @
+359 stub @
+360 stub @
+361 stub @
+362 stub @
+363 stub @
+364 stub @
+365 stub @
+366 stub @
+367 stub @
+368 stub @
+369 stub @
+370 stub @
+371 stub @
+372 stub @
+373 stub @
+374 stub @
+375 stub @
+376 stub @
+377 stdcall SHLWAPI_377(long long long)SHLWAPI_377
+378 stub @
+379 stub @
+380 stub @
+381 stub AssocQueryStringA
+382 stub AssocQueryStringByKeyA
+383 stub AssocQueryStringByKeyW
+384 stub AssocQueryStringW
+385 stub ChrCmpIA
+386 stub ChrCmpIW
+387 stub ColorAdjustLuma
+388 stub @
+389 stub @
+390 stub @
+391 stub @
+392 stub @
+393 stub @
+394 stub @
+395 stub @
+396 stub @
+397 stub @
+398 stub @
+399 stub @
+400 stub @
+401 stub @
+402 stub @
+403 stub @
+404 stub @
+405 stub @
+406 stub @
+407 stub @
+408 stub @
+409 stub @
+410 stub @
+411 stub @
+412 stub @
+413 stub @
+414 stub @
+415 stub @
+416 stub @
+417 stub @
+418 stub @
+419 stub @
+420 stub @
+421 stub @
+422 stub @
+423 stub @
+424 stub @
+425 stub @
+426 stub @
+427 stub @
+428 stub @
+429 stub @
+430 stub @
+431 stub @
+432 stub @
+433 stub @
+434 stub @
+435 stub @
+436 stub @
+437 stdcall SHLWAPI_437(long) SHLWAPI_437
+438 stub @
+439 stub @
+440 stub @
+441 stub @
+442 stub @
+443 stub @
+444 stub @
+445 stub @
+446 stub @
 
-@ stub    ChrCmpIA
-@ stub    ChrCmpIW
-@ stub    DllGetVersion
+@ stdcall DllGetVersion (ptr) SHLWAPI_DllGetVersion
 @ stub    GetMenuPosFromID
 @ stub    HashData
 @ stub    IntlStrEqWorkerA
 @ stub    IntlStrEqWorkerW
-@ stdcall PathAddBackslashA (ptr) PathAddBackslashA
-@ stdcall PathAddBackslashW (ptr) PathAddBackslashW
-@ stub    PathAddExtensionA
-@ stub    PathAddExtensionW
+@ stdcall PathAddBackslashA (str) PathAddBackslashA
+@ stdcall PathAddBackslashW (wstr) PathAddBackslashW
+@ stdcall PathAddExtensionA (str str) PathAddExtensionA
+@ stdcall PathAddExtensionW (wstr wstr) PathAddExtensionW
 @ stdcall PathAppendA (str str) PathAppendA
-@ stdcall PathAppendW (str str) PathAppendW
+@ stdcall PathAppendW (wstr wstr) PathAppendW
 @ stdcall PathBuildRootA (ptr long) PathBuildRootA
 @ stdcall PathBuildRootW (ptr long) PathBuildRootW
 @ stdcall PathCanonicalizeA (ptr str) PathCanonicalizeA
@@ -224,23 +506,23 @@
 @ stub    PathIsSystemFolderA
 @ stub    PathIsSystemFolderW
 @ stdcall PathIsUNCA (str) PathIsUNCA
-@ stub    PathIsUNCServerA
-@ stub    PathIsUNCServerShareA
-@ stub    PathIsUNCServerShareW
-@ stub    PathIsUNCServerW
+@ stdcall PathIsUNCServerA(str)PathIsUNCServerA
+@ stdcall PathIsUNCServerShareA(str)PathIsUNCServerShareA
+@ stdcall PathIsUNCServerShareW(wstr)PathIsUNCServerShareW
+@ stdcall PathIsUNCServerW(wstr)PathIsUNCServerW
 @ stdcall PathIsUNCW(wstr) PathIsUNCW
 @ stdcall PathIsURLA(str) PathIsURLA
 @ stdcall PathIsURLW(wstr) PathIsURLW
-@ stub    PathMakePrettyA
-@ stub    PathMakePrettyW
+@ stdcall PathMakePrettyA(str)PathMakePrettyA
+@ stdcall PathMakePrettyW(wstr)PathMakePrettyW
 @ stub    PathMakeSystemFolderA
 @ stub    PathMakeSystemFolderW
 @ stdcall PathMatchSpecA  (str str) PathMatchSpecA
-@ stdcall PathMatchSpecW  (str str) PathMatchSpecW
+@ stdcall PathMatchSpecW  (wstr wstr) PathMatchSpecW
 @ stdcall PathParseIconLocationA (str) PathParseIconLocationA
 @ stdcall PathParseIconLocationW (wstr) PathParseIconLocationW
-@ stdcall PathQuoteSpacesA (ptr) PathQuoteSpacesA
-@ stdcall PathQuoteSpacesW (ptr) PathQuoteSpacesW
+@ stdcall PathQuoteSpacesA (str) PathQuoteSpacesA
+@ stdcall PathQuoteSpacesW (wstr) PathQuoteSpacesW
 @ stub    PathRelativePathToA
 @ stub    PathRelativePathToW
 @ stdcall PathRemoveArgsA(str)PathRemoveArgsA
@@ -269,7 +551,7 @@
 @ stub    PathUnmakeSystemFolderW
 @ stdcall PathUnquoteSpacesA (str) PathUnquoteSpacesA
 @ stdcall PathUnquoteSpacesW (wstr) PathUnquoteSpacesW
-@ stub    SHCreateShellPalette
+@ stdcall SHCreateShellPalette(long)SHCreateShellPalette
 @ stub    SHDeleteEmptyKeyA
 @ stub    SHDeleteEmptyKeyW
 @ stdcall SHDeleteKeyA(long str)SHRegDeleteKeyA
@@ -283,15 +565,17 @@
 @ stub    SHEnumValueA
 @ stub    SHEnumValueW
 @ stub    SHGetInverseCMAP
-@ stdcall SHGetValueA ( long ptr ptr ptr ptr ptr ) SHGetValueA
-@ stdcall SHGetValueW ( long ptr ptr ptr ptr ptr ) SHGetValueW
-@ stub    SHIsLowMemoryMachine
-@ stub    SHOpenRegStreamA
-@ stub    SHOpenRegStreamW
+@ stdcall SHGetValueA ( long str str ptr ptr ptr ) SHGetValueA
+@ stdcall SHGetValueW ( long wstr wstr ptr ptr ptr ) SHGetValueW
+@ stdcall SHIsLowMemoryMachine(long)SHIsLowMemoryMachine
+@ stdcall SHOpenRegStreamA(long str str long)SHOpenRegStreamA
+@ stdcall SHOpenRegStreamW(long wstr str long)SHOpenRegStreamW
+@ stdcall SHOpenRegStream2A(long str str long)SHOpenRegStreamA
+@ stdcall SHOpenRegStream2W(long wstr str long)SHOpenRegStreamW
 @ stub    SHQueryInfoKeyA
 @ stub    SHQueryInfoKeyW
-@ stub    SHQueryValueExA
-@ stub    SHQueryValueExW
+@ stdcall SHQueryValueExA(long str ptr ptr ptr ptr)SHRegQueryValueExA
+@ stdcall SHQueryValueExW(long wstr ptr ptr ptr ptr)SHRegQueryValueExW
 @ stub    SHRegCloseUSKey
 @ stub    SHRegCreateUSKeyA
 @ stub    SHRegCreateUSKeyW
@@ -303,41 +587,41 @@
 @ stub    SHRegEnumUSKeyW
 @ stub    SHRegEnumUSValueA
 @ stub    SHRegEnumUSValueW
-@ stub    SHRegGetBoolUSValueA
-@ stub    SHRegGetBoolUSValueW
-@ stdcall SHRegGetUSValueA ( ptr ptr ptr ptr ptr long ptr long ) SHRegGetUSValueA
-@ stdcall SHRegGetUSValueW ( ptr ptr ptr ptr ptr long ptr long ) SHRegGetUSValueW
+@ stdcall SHRegGetBoolUSValueA(str str long long)SHRegGetBoolUSValueA
+@ stdcall SHRegGetBoolUSValueW(wstr wstr long long)SHRegGetBoolUSValueW
+@ stdcall SHRegGetUSValueA ( ptr str ptr ptr ptr long ptr long ) SHRegGetUSValueA
+@ stdcall SHRegGetUSValueW ( ptr wstr ptr ptr ptr long ptr long ) SHRegGetUSValueW
 @ stub    SHRegOpenUSKeyA
 @ stub    SHRegOpenUSKeyW
 @ stub    SHRegQueryInfoUSKeyA
 @ stub    SHRegQueryInfoUSKeyW
-@ stub    SHRegQueryUSValueA
+@ stdcall SHRegQueryUSValueA(long str ptr ptr ptr long ptr long)SHRegQueryUSValueA
 @ stub    SHRegQueryUSValueW
 @ stub    SHRegSetUSValueA
 @ stub    SHRegSetUSValueW
 @ stub    SHRegWriteUSValueA
 @ stub    SHRegWriteUSValueW
-@ stub    SHSetValueA
+@ stdcall SHSetValueA (long str str long ptr long) SHSetValueA
 @ stub    SHSetValueW
-@ stub    StrCSpnA
+@ stdcall StrCSpnA (str str) StrCSpnA
 @ stub    StrCSpnIA
 @ stub    StrCSpnIW
-@ stub    StrCSpnW
+@ stdcall StrCSpnW (wstr wstr) StrCSpnW
 @ stub    StrCatW
-@ stdcall StrChrA (ptr long) strchr
+@ stdcall StrChrA (str long) StrChrA
 @ stub    StrChrIA
 @ stub    StrChrIW
-@ stdcall StrChrW (ptr long) StrChrW
-@ stub    StrCmpIW
-@ stub    StrCmpNA
-@ stub    StrCmpNIA
+@ stdcall StrChrW (wstr long) StrChrW
+@ stdcall StrCmpIW (wstr wstr) lstrcmpiW
+@ stdcall StrCmpNA (str str long) StrCmpNA
+@ stdcall StrCmpNIA (str str long) StrCmpNIA
 @ stdcall StrCmpNIW (wstr wstr long) StrCmpNIW
-@ stub    StrCmpNW
-@ stub    StrCmpW
-@ stub    StrCpyNW
-@ stub    StrCpyW
-@ stub    StrDupA
-@ stub    StrDupW
+@ stdcall StrCmpNW (wstr wstr long) StrCmpNW
+@ stdcall StrCmpW (wstr wstr) lstrcmpW
+@ stdcall StrCpyNW (ptr wstr long) lstrcpynW
+@ stdcall StrCpyW (ptr wstr) lstrcpyW
+@ stdcall StrDupA (str) StrDupA
+@ stdcall StrDupW (wstr) StrDupW
 @ stdcall StrFormatByteSizeA(long str long) StrFormatByteSizeA
 @ stdcall StrFormatByteSizeW(long wstr long) StrFormatByteSizeW
 @ stub    StrFromTimeIntervalA
@@ -356,14 +640,14 @@
 @ stub    StrRStrIW
 @ stub    StrSpnA
 @ stub    StrSpnW
-@ stub    StrStrA
-@ stub    StrStrIA
-@ stub    StrStrIW
-@ stub    StrStrW
-@ stub    StrToIntA
+@ stdcall StrStrA(str str)StrStrA
+@ stdcall StrStrIA(str str)StrStrIA
+@ stdcall StrStrIW(wstr wstr)StrStrIW
+@ stdcall StrStrW(wstr wstr)StrStrW
+@ stdcall StrToIntA(str)StrToIntA
 @ stub    StrToIntExA
 @ stub    StrToIntExW
-@ stub    StrToIntW
+@ stdcall StrToIntW(wstr)StrToIntW
 @ stub    StrTrimA
 @ stub    StrTrimW
 @ stub    UrlApplySchemeA
@@ -376,8 +660,8 @@
 @ stub    UrlCompareW
 @ stub    UrlCreateFromPathA
 @ stub    UrlCreateFromPathW
-@ stub    UrlEscapeA
-@ stub    UrlEscapeW
+@ stdcall UrlEscapeA(str ptr ptr long)UrlEscapeA
+@ stdcall UrlEscapeW(wstr ptr ptr long)UrlEscapeW
 @ stub    UrlGetLocationA
 @ stub    UrlGetLocationW
 @ stub    UrlGetPartA
@@ -392,9 +676,14 @@
 @ stub    UrlIsW
 @ stub    UrlUnescapeA
 @ stub    UrlUnescapeW
+@ varargs wnsprintfA(ptr long str)wnsprintfA
+@ varargs wnsprintfW(ptr long wstr)wnsprintfW
+
 
 # exported in later versions 
 @ stdcall StrRetToBufA (ptr ptr ptr long) StrRetToBufA
 @ stdcall StrRetToBufW (ptr ptr ptr long) StrRetToBufW
 #@ stdcall StrRetToStrA (ptr ptr ptr) StrRetToStrA
 #@ stdcall StrRetToStrW (ptr ptr ptr) StrRetToStrW
+@ stdcall SHRegGetPathA(long str str ptr long)SHRegGetPathA
+@ stdcall SHRegGetPathW(long wstr wstr ptr long)SHRegGetPathW
diff --git a/documentation/shell32 b/documentation/shell32
index b848017..a21ca7b 100644
--- a/documentation/shell32
+++ b/documentation/shell32
@@ -64,3 +64,39 @@
 - many examples from MSDN
 
 Feb-21-2000 <juergen.schmied@debitel.net>
+
+4. native shell32
+-----------------
+
+4.1 win95/98
+
+IShellFolder_GetAttributesOf sometimes returns more bits set 
+than the mask asked for
+
+
+
+4.2 NT4
+
+4.3 NT5
+----------
+
+SHGetSpecialFolderLocation needs the <winntdir>/Recent directory.
+If the directory is missing it returns a x80070002.
+
+needed Registry keys:
+----------------------------
+[MACHINE\\Software\\Classes\\CLSID\\{00021400-0000-0000-c000-000000000046}] 957887196
+@="Desktop"
+
+[MACHINE\\Software\\Classes\\CLSID\\{00021400-0000-0000-c000-000000000046}\\InProcServer32] 957887196
+@="shell32.dll"
+"ThreadingModel"="Apartment"
+
+[MACHINE\\Software\\Classes\\CLSID\\{000214e6-0000-0000-c000-000000000046}] 957887196
+@="Shellfolder"
+
+[MACHINE\\Software\\Classes\\CLSID\\{000214e6-0000-0000-c000-000000000046}\\InProcServer32] 957887196
+@="shell32.dll"
+"ThreadingModel"="Apartment"
+----------------------------
+
diff --git a/include/shlwapi.h b/include/shlwapi.h
index 36ffdf6..62a0eae 100644
--- a/include/shlwapi.h
+++ b/include/shlwapi.h
@@ -29,6 +29,14 @@
 BOOL WINAPI PathIsURLW(LPCWSTR pszPath);
 #define PathIsURL WINELIB_NAME_AW(PathIsURL)
 
+BOOL WINAPI PathAddExtensionA(LPSTR pszPath, LPCSTR pszExt);
+BOOL WINAPI PathAddExtensionW(LPWSTR pszPath, LPCWSTR pszExt);
+#define PathAddExtension WINELIB_NAME_AW(PathAddExtension)
+
+BOOL WINAPI PathStripToRootA(LPSTR pszPath);
+BOOL WINAPI PathStripToRootW(LPWSTR pszPath);
+#define PathStripToRoot WINELIB_NAME_AW(PathStripToRoot)
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif /* defined(__cplusplus) */