shell32/shlwapi

Jürgen Schmied juergenschmied at lycos.de
Thu May 9 04:45:56 CDT 2002


dlls/shell32/Makefile.in
new file debughlp.c

moving the pidl-debug-functions to a separate file and made them self 
contained. This prevents useless trace-messages generated from the 
debugfunctions itself.

dlls/shlwapi/reg.c
reimplemented SHRegGetPathA/W, SHGetValueA/W, 
SHRegGetPathA/W


---
juergen.schmied at debitel.net



-------------- next part --------------
Index: wine/dlls/shell32/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/shell32/Makefile.in,v
retrieving revision 1.44
diff -d -u -r1.44 Makefile.in
--- wine/dlls/shell32/Makefile.in	20 Mar 2002 22:19:09 -0000	1.44
+++ wine/dlls/shell32/Makefile.in	7 May 2002 18:58:22 -0000
@@ -17,6 +17,7 @@
 	clipboard.c \
 	control.c \
 	dataobject.c \
+	debughlp.c \
 	dialogs.c \
 	enumidlist.c \
 	folders.c \
@@ -47,4 +48,5 @@
 @MAKE_DLL_RULES@
 
 ### Dependencies:
+
 
Index: wine/dlls/shell32/pidl.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/pidl.c,v
retrieving revision 1.69
diff -d -u -r1.69 pidl.c
--- wine/dlls/shell32/pidl.c	3 Apr 2002 22:52:52 -0000	1.69
+++ wine/dlls/shell32/pidl.c	7 May 2002 18:58:24 -0000
@@ -36,108 +36,12 @@
 #include "shlwapi.h"
 
 #include "pidl.h"
+#include "debughlp.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(pidl);
 WINE_DECLARE_DEBUG_CHANNEL(shell);
 
-void pdump (LPCITEMIDLIST pidl)
-{
-	LPITEMIDLIST pidltemp = pidl;
-	if (!TRACE_ON(pidl))
-	  return;
-
-	if (! pidltemp)
-	{
-	  MESSAGE ("-------- pidl=NULL (Desktop)\n");
-	}
-	else
-	{
-	  MESSAGE ("-------- pidl=%p\n", pidl);
-	  if (pidltemp->mkid.cb)
-	  { 
-	    do
-	    {
-	      DWORD dwAttrib = 0;
-	      LPPIDLDATA pData   = _ILGetDataPointer(pidltemp);
-	      DWORD type         = pData->type;
-	      LPSTR szLongName   = _ILGetTextPointer(pidltemp);
-	      LPSTR szShortName  = _ILGetSTextPointer(pidltemp);
-	      char szName[MAX_PATH];
-
-	      _ILSimpleGetText(pidltemp, szName, MAX_PATH);
-	      if( PT_FOLDER == type)
-	        dwAttrib = pData->u.folder.uFileAttribs;
-	      else if( PT_VALUE == type)
-	        dwAttrib = pData->u.file.uFileAttribs;
-
-	      MESSAGE ("-- pidl=%p size=%u type=%lx attr=0x%08lx name=%s (%s,%s)\n",
-	               pidltemp, pidltemp->mkid.cb,type,dwAttrib,szName,debugstr_a(szLongName), debugstr_a(szShortName));
-
-	      pidltemp = ILGetNext(pidltemp);
-
-	    } while (pidltemp->mkid.cb);
-	  }
-	  else
-	  {
-	    MESSAGE ("empty pidl (Desktop)\n");
-	  }
-	  pcheck(pidl);
-	}
-}
-#define BYTES_PRINTED 32
-BOOL pcheck (LPCITEMIDLIST pidl)
-{
-        DWORD type, ret=TRUE;
-        LPITEMIDLIST pidltemp = pidl;
-
-        if (pidltemp && pidltemp->mkid.cb)
-        { do
-          { type   = _ILGetDataPointer(pidltemp)->type;
-            switch (type)
-	    { case PT_DESKTOP:
-	      case PT_MYCOMP:
-	      case PT_SPECIAL:
-	      case PT_DRIVE:
-	      case PT_DRIVE1:
-	      case PT_DRIVE2:
-	      case PT_DRIVE3:
-	      case PT_FOLDER:
-	      case PT_VALUE:
-	      case PT_FOLDER1:
-	      case PT_WORKGRP:
-	      case PT_COMP:
-	      case PT_NETWORK:
-	      case PT_IESPECIAL1:
-	      case PT_IESPECIAL2:
-	      case PT_SHARE:
-		break;
-	      default:
-	      {
-		char szTemp[BYTES_PRINTED*4 + 1];
-		int i;
-		unsigned char c;
-
-		memset(szTemp, ' ', BYTES_PRINTED*4 + 1);
-		for ( i = 0; (i<pidltemp->mkid.cb) && (i<BYTES_PRINTED); i++)
-		{
-		  c = ((unsigned char *)pidltemp)[i];
-
-		  szTemp[i*3+0] = ((c>>4)>9)? (c>>4)+55 : (c>>4)+48;
-		  szTemp[i*3+1] = ((0x0F&c)>9)? (0x0F&c)+55 : (0x0F&c)+48;
-		  szTemp[i*3+2] = ' ';
-		  szTemp[i+BYTES_PRINTED*3]  =  (c>=0x20 && c <=0x80) ? c : '.';
-		}
-		szTemp[BYTES_PRINTED*4] = 0x00;
-		ERR("unknown IDLIST type size=%u type=%lx\n%s\n",pidltemp->mkid.cb,type, szTemp);
-		ret = FALSE;
-	      }
-	    }
-	    pidltemp = ILGetNext(pidltemp);
-	  } while (pidltemp->mkid.cb);
-	}
-	return ret;
-}
 
 /*************************************************************************
  * ILGetDisplayName			[SHELL32.15]
@@ -1880,3 +1784,5 @@
 
 	return dst;
 }
+
+
Index: wine/dlls/shlwapi/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/Makefile.in,v
retrieving revision 1.12
diff -d -u -r1.12 Makefile.in
--- wine/dlls/shlwapi/Makefile.in	20 Mar 2002 22:19:09 -0000	1.12
+++ wine/dlls/shlwapi/Makefile.in	7 May 2002 18:58:25 -0000
@@ -18,7 +18,14 @@
 	string.c \
 	url.c
 
+EXTRASUBDIRS = \
+        tests
+
+CTESTS = \
+        tests/shreg.c
+
 @MAKE_DLL_RULES@
 
 ### Dependencies:
+
 
Index: wine/dlls/shlwapi/ordinal.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/ordinal.c,v
retrieving revision 1.38
diff -d -u -r1.38 ordinal.c
--- wine/dlls/shlwapi/ordinal.c	3 Apr 2002 02:43:03 -0000	1.38
+++ wine/dlls/shlwapi/ordinal.c	7 May 2002 18:58:29 -0000
@@ -2,7 +2,7 @@
  * SHLWAPI ordinal functions
  *
  * Copyright 1997 Marcus Meissner
- *           1998 Jrgen Schmied
+ *           1998 Jrgen Schmied
  *           2001 Jon Griffiths
  *
  * This library is free software; you can redistribute it and/or
@@ -1213,6 +1213,17 @@
 }
 
 /*************************************************************************
+ *      @	[SHLWAPI.175]
+ *
+ *	NOTE:
+ *	  Param1 can be an IShellFolder Object
+ */
+HRESULT WINAPI SHLWAPI_175 (LPVOID x, LPVOID y)
+{
+	FIXME("(%p %p) stub\n", x,y);
+	return E_FAIL;
+}
+/*************************************************************************
  *      @	[SHLWAPI.176]
  *
  * Function appears to be interface to IServiceProvider::QueryService
@@ -2463,3 +2474,4 @@
     TlsSetValue(SHLWAPI_ThreadRef_index, (LPVOID) punk);
     return S_OK;
 }
+
Index: wine/dlls/shlwapi/reg.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/reg.c,v
retrieving revision 1.24
diff -d -u -r1.24 reg.c
--- wine/dlls/shlwapi/reg.c	9 Mar 2002 23:44:30 -0000	1.24
+++ wine/dlls/shlwapi/reg.c	7 May 2002 18:58:32 -0000
@@ -34,8 +34,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
-typedef DWORD (WINAPI *RegQueryFn)(HKEY,LPCVOID,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
-
 static const char *lpszContentTypeA = "Content Type";
 static const WCHAR lpszContentTypeW[] = { 'C','o','n','t','e','n','t',' ','T','y','p','e','\0'};
 
@@ -727,24 +725,12 @@
 DWORD WINAPI SHRegGetPathA(HKEY hKey, LPCSTR lpszSubKey, LPCSTR lpszValue,
                            LPSTR lpszPath, DWORD dwFlags)
 {
-  HKEY hSubKey;
-  DWORD dwType = REG_SZ, dwSize = MAX_PATH, dwRet = ERROR_SUCCESS;
+  DWORD dwSize = MAX_PATH;
 
   TRACE("(hkey=0x%08x,%s,%s,%p,%ld)\n", hKey, debugstr_a(lpszSubKey),
         debugstr_a(lpszValue), lpszPath, dwFlags);
 
-  if (lpszSubKey && *lpszSubKey)
-    dwRet = RegOpenKeyExA(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
-  else
-    hSubKey = hKey;
-
-  if (!dwRet)
-    dwRet = SHQueryValueExA(hSubKey, lpszValue, NULL, &dwType, lpszPath, &dwSize);
-
-  if (hSubKey != hKey)
-    RegCloseKey(hSubKey);
-
-  return dwRet;
+  return SHGetValueA(hKey, lpszSubKey, lpszValue, 0, lpszPath, &dwSize);
 }
 
 /*************************************************************************
@@ -755,24 +741,12 @@
 DWORD WINAPI SHRegGetPathW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue,
                            LPWSTR lpszPath, DWORD dwFlags)
 {
-  HKEY hSubKey;
-  DWORD dwType = REG_SZ, dwSize = MAX_PATH, dwRet = ERROR_SUCCESS;
+  DWORD dwSize = MAX_PATH;
 
   TRACE("(hkey=0x%08x,%s,%s,%p,%ld)\n", hKey, debugstr_w(lpszSubKey),
         debugstr_w(lpszValue), lpszPath, dwFlags);
 
-  if (lpszSubKey && *lpszSubKey)
-    dwRet = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
-  else
-    hSubKey = hKey;
-
-  if (!dwRet)
-    dwRet = SHQueryValueExW(hSubKey, lpszValue, NULL, &dwType, lpszPath, &dwSize);
-
-  if (hSubKey != hKey)
-    RegCloseKey(hSubKey);
-
-  return dwRet;
+  return SHGetValueW(hKey, lpszSubKey, lpszValue, 0, lpszPath, &dwSize);
 }
 
 
@@ -844,22 +818,28 @@
  *
  * RETURNS
  *   Success: ERROR_SUCCESS. Output parameters contain the details read.
- *   Failure: An error code from RegOpenKeyExA or RegQueryValueExA.
+ *   Failure: An error code from RegOpenKeyExA or SHQueryValueExA.
  */
 DWORD WINAPI SHGetValueA(HKEY hKey, LPCSTR lpszSubKey, LPCSTR lpszValue,
                          LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
 {
-  DWORD dwRet;
-  HKEY hSubKey;
+  DWORD dwRet = 0;
+  HKEY hSubKey = 0;
 
   TRACE("(hkey=0x%08x,%s,%s,%p,%p,%p)\n", hKey, debugstr_a(lpszSubKey),
         debugstr_a(lpszValue), pwType, pvData, pcbData);
 
-  dwRet = RegOpenKeyExA(hKey, lpszSubKey, 0, KEY_QUERY_VALUE, &hSubKey);
-  if (!dwRet)
+  /*   lpszSubKey can be 0. In this case the value is taken from the
+   *   current key.
+   */
+  if(lpszSubKey) 
+    dwRet = RegOpenKeyExA(hKey, lpszSubKey, 0, KEY_QUERY_VALUE, &hSubKey);
+
+  if (! dwRet)
   {
-    dwRet = RegQueryValueExA(hSubKey, lpszValue, 0, pwType, pvData, pcbData);
-    RegCloseKey(hSubKey);
+    /* SHQueryValueEx expands Environment strings */
+    dwRet = SHQueryValueExA(hSubKey ? hSubKey : hKey, lpszValue, 0, pwType, pvData, pcbData);
+    if (hSubKey) RegCloseKey(hSubKey);
   }
   return dwRet;
 }
@@ -872,17 +852,19 @@
 DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue,
                          LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
 {
-  DWORD dwRet;
-  HKEY hSubKey;
+  DWORD dwRet = 0;
+  HKEY hSubKey = 0;
 
   TRACE("(hkey=0x%08x,%s,%s,%p,%p,%p)\n", hKey, debugstr_w(lpszSubKey),
         debugstr_w(lpszValue), pwType, pvData, pcbData);
 
-  dwRet = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_QUERY_VALUE, &hSubKey);
-  if (!dwRet)
+  if(lpszSubKey) 
+    dwRet = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_QUERY_VALUE, &hSubKey);
+
+  if (! dwRet)
   {
-    dwRet = RegQueryValueExW(hSubKey, lpszValue, 0, pwType, pvData, pcbData);
-    RegCloseKey(hSubKey);
+    dwRet = SHQueryValueExW(hSubKey ? hSubKey : hKey, lpszValue, 0, pwType, pvData, pcbData);
+    if (hSubKey) RegCloseKey(hSubKey);
   }
   return dwRet;
 }
@@ -990,86 +972,67 @@
                           NULL, pwValues, pwValueMax, NULL, NULL, NULL);
 }
 
-/*************************************************************************
- * SHQueryValueExAW
- *
- * Internal implementation of SHQueryValueExA/SHQueryValueExW.
- */
-static DWORD WINAPI SHQueryValueExAW(RegQueryFn pfn,
-                                     HKEY hKey, LPCVOID lpszValue,
-                                     LPDWORD lpReserved, LPDWORD pwType,
-                                     LPBYTE pvData, LPDWORD pcbData)
-{
+/*
   DWORD dwRet, dwType, dwDataLen;
 
-  if (pcbData)
-    dwDataLen = *pcbData;
+  FIXME("(hkey=0x%08x,%s,%p,%p,%p,%p=%ld)\n", hKey, debugstr_a(lpszValue),
+        lpReserved, pwType, pvData, pcbData, pcbData ? *pcbData : 0);
 
-  dwRet = pfn(hKey, lpszValue, lpReserved, &dwType, pvData, &dwDataLen);
+  if (pcbData) dwDataLen = *pcbData;
+
+  dwRet = RegQueryValueExA(hKey, lpszValue, lpReserved, &dwType, pvData, &dwDataLen);
   if (!dwRet)
   {
     if (dwType == REG_EXPAND_SZ)
     {
-      /* Expand type REG_EXPAND_SZ into REG_SZ */
       LPSTR szExpand;
       LPBYTE pData = pvData;
 
       if (!pData)
       {
-        /* Create a buffer to hold the data, to get the size */
-        if (!pcbData ||
-            !(pData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *pcbData)))
+        if (!pcbData || !(pData = (LPBYTE) LocalAlloc(GMEM_ZEROINIT, *pcbData)))
           return ERROR_OUTOFMEMORY;
-        /* Read the data in to the buffer */
-        if ((dwRet = pfn(hKey, lpszValue, lpReserved, &dwType,
-                         pData, &dwDataLen)))
+
+        if ((dwRet = RegQueryValueExA (hKey, lpszValue, lpReserved, &dwType, pData, &dwDataLen)))
           return dwRet;
       }
 
       if (!pcbData && pData != pvData)
       {
-        /* Note: In this case the caller will crash under Win32 */
         WARN("Invalid pcbData would crash under Win32!");
         return ERROR_OUTOFMEMORY;
       }
 
-      szExpand = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *pcbData);
+      szExpand = (LPBYTE) LocalAlloc(GMEM_ZEROINIT, *pcbData);
       if (!szExpand)
       {
-        if (pData != pvData)
-          HeapFree(GetProcessHeap(), 0, pData);
+        if ( pData != pvData ) LocalFree((HLOCAL)pData);
         return ERROR_OUTOFMEMORY;
       }
-      if ((ExpandEnvironmentStringsA(pvData, szExpand, *pcbData) <= 0))
+      if ((ExpandEnvironmentStringsA(pvData, szExpand, *pcbData) > 0))
       {
         dwDataLen = strlen(szExpand) + 1;
         strncpy(pvData, szExpand, *pcbData);
       }
       else
       {
-        if (pData != pvData)
-          HeapFree(GetProcessHeap(), 0, pData);
-        HeapFree(GetProcessHeap(), 0, szExpand);
+        if ( pData != pvData ) LocalFree((HLOCAL)pData);
+        LocalFree((HLOCAL)szExpand);
         return GetLastError();
       }
-      if (pData != pvData)
-        HeapFree(GetProcessHeap(), 0, pData);
-      HeapFree(GetProcessHeap(), 0, szExpand);
+      if (pData != pvData) LocalFree((HLOCAL)pData);
+      LocalFree((HLOCAL)szExpand);
       dwType = REG_SZ;
     }
     if (dwType == REG_SZ && pvData && pcbData && dwDataLen >= *pcbData)
     {
-      /* String type too long: truncate it */
-      pvData[*pcbData] = '\0';
+      ((LPBYTE) pvData)[*pcbData] = '\0';
     }
   }
-  /* Update the type and data size if the caller wanted them */
-  if (pwType)
-    *pwType = dwType;
-  if (pcbData)
-    *pcbData  = dwDataLen;
+  if ( pwType ) *pwType = dwType;
+  if ( pcbData ) *pcbData = dwDataLen;
   return dwRet;
-}
+*/
 
 /*************************************************************************
  * SHQueryValueExA   [SHLWAPI.@]
@@ -1078,7 +1041,7 @@
  *
  * PARAMS
  *   hKey       [I] Handle to registry key
- *   lpszValue  [I] Name of value to delete
+ *   lpszValue  [I] Name of value to query
  *   lpReserved [O] Reserved for future use; must be NULL
  *   pwType     [O] Optional pointer updated with the values type
  *   pvData     [O] Optional pointer updated with the values data
@@ -1098,18 +1061,75 @@
  *   If the type of the data is REG_EXPAND_SZ, it is expanded to REG_SZ. The
  *   value returned will be truncated if it is of type REG_SZ and bigger than
  *   the buffer given to store it.
  */
-DWORD WINAPI SHQueryValueExA(HKEY hKey, LPCSTR lpszValue,
-                             LPDWORD lpReserved, LPDWORD pwType,
-                             LPVOID pvData, LPDWORD pcbData)
+DWORD WINAPI SHQueryValueExA( HKEY hKey, LPCSTR lpszValue,
+                              LPDWORD lpReserved, LPDWORD pwType,
+                              LPVOID pvData, LPDWORD pcbData)
 {
+  DWORD dwRet, dwType, dwUnExpDataLen = 0, dwExpDataLen;
+
   TRACE("(hkey=0x%08x,%s,%p,%p,%p,%p=%ld)\n", hKey, debugstr_a(lpszValue),
         lpReserved, pwType, pvData, pcbData, pcbData ? *pcbData : 0);
 
-  return SHQueryValueExAW((RegQueryFn)RegQueryValueExA, hKey, lpszValue,
-                          lpReserved, pwType, pvData, pcbData);
+  if (pcbData) dwUnExpDataLen = *pcbData;
+
+  dwRet = RegQueryValueExA(hKey, lpszValue, lpReserved, &dwType, pvData, &dwUnExpDataLen);
+
+  if (pcbData && (dwType == REG_EXPAND_SZ))
+  {
+    DWORD nBytesToAlloc;
+
+    /* Expand type REG_EXPAND_SZ into REG_SZ */
+    LPSTR szData;
+
+    /* If the caller didn't supply a buffer or the buffer is to small we have
+     * to allocate our own
+     */
+    if ((!pvData) || (dwRet == ERROR_MORE_DATA) )
+    { 
+      char cNull = '\0';
+      nBytesToAlloc = (!pvData || (dwRet == ERROR_MORE_DATA)) ? dwUnExpDataLen : *pcbData;
+
+      szData = (LPSTR) LocalAlloc(GMEM_ZEROINIT, nBytesToAlloc);
+      RegQueryValueExA (hKey, lpszValue, lpReserved, NULL, (LPBYTE)szData, &nBytesToAlloc);
+      dwExpDataLen = ExpandEnvironmentStringsA(szData, &cNull, 1);
+      dwUnExpDataLen = max(nBytesToAlloc, dwExpDataLen);
+      LocalFree((HLOCAL) szData);
+    }
+    else
+    {
+      nBytesToAlloc = lstrlenA(pvData) * sizeof (CHAR);
+      szData = (LPSTR) LocalAlloc(GMEM_ZEROINIT, nBytesToAlloc + 1);
+      lstrcpyA(szData, pvData);
+      dwExpDataLen = ExpandEnvironmentStringsA(szData, pvData, *pcbData / sizeof(CHAR));
+      if (dwExpDataLen > *pcbData) dwRet = ERROR_MORE_DATA; 
+      dwUnExpDataLen = max(nBytesToAlloc, dwExpDataLen);
+      LocalFree((HLOCAL) szData);
+    }
+  }
+
+  /* Update the type and data size if the caller wanted them */
+  if ( dwType == REG_EXPAND_SZ ) dwType = REG_SZ;
+  if ( pwType ) *pwType = dwType;
+  if ( pcbData ) *pcbData = dwUnExpDataLen;
+  return dwRet;
 }
 
+
 /*************************************************************************
  * SHQueryValueExW   [SHLWAPI.@]
  *
@@ -1119,11 +1139,53 @@
                              LPDWORD lpReserved, LPDWORD pwType,
                              LPVOID pvData, LPDWORD pcbData)
 {
+  DWORD dwRet, dwType, dwUnExpDataLen = 0, dwExpDataLen;
+
   TRACE("(hkey=0x%08x,%s,%p,%p,%p,%p=%ld)\n", hKey, debugstr_w(lpszValue),
         lpReserved, pwType, pvData, pcbData, pcbData ? *pcbData : 0);
 
-  return SHQueryValueExAW((RegQueryFn)RegQueryValueExW, hKey, lpszValue,
-                          lpReserved, pwType, pvData, pcbData);
+  if (pcbData) dwUnExpDataLen = *pcbData;
+
+  dwRet = RegQueryValueExW(hKey, lpszValue, lpReserved, &dwType, pvData, &dwUnExpDataLen);
+
+  if (pcbData && (dwType == REG_EXPAND_SZ))
+  {
+    DWORD nBytesToAlloc;
+
+    /* Expand type REG_EXPAND_SZ into REG_SZ */
+    LPWSTR szData;
+
+    /* If the caller didn't supply a buffer or the buffer is to small we have
+     * to allocate our own
+     */
+    if ((!pvData) || (dwRet == ERROR_MORE_DATA) )
+    { 
+      WCHAR cNull = '\0';
+      nBytesToAlloc = (!pvData || (dwRet == ERROR_MORE_DATA)) ? dwUnExpDataLen : *pcbData;
+
+      szData = (LPWSTR) LocalAlloc(GMEM_ZEROINIT, nBytesToAlloc);
+      RegQueryValueExW (hKey, lpszValue, lpReserved, NULL, (LPBYTE)szData, &nBytesToAlloc);
+      dwExpDataLen = ExpandEnvironmentStringsW(szData, &cNull, 1);
+      dwUnExpDataLen = max(nBytesToAlloc, dwExpDataLen);
+      LocalFree((HLOCAL) szData);
+    }
+    else
+    {
+      nBytesToAlloc = lstrlenW(pvData) * sizeof(WCHAR);
+      szData = (LPWSTR) LocalAlloc(GMEM_ZEROINIT, nBytesToAlloc + 1);
+      lstrcpyW(szData, pvData);
+      dwExpDataLen = ExpandEnvironmentStringsW(szData, pvData, *pcbData/sizeof(WCHAR) );
+      if (dwExpDataLen > *pcbData) dwRet = ERROR_MORE_DATA; 
+      dwUnExpDataLen = max(nBytesToAlloc, dwExpDataLen);
+      LocalFree((HLOCAL) szData);
+    }
+  }
+
+  /* Update the type and data size if the caller wanted them */
+  if ( dwType == REG_EXPAND_SZ ) dwType = REG_SZ;
+  if ( pwType ) *pwType = dwType;
+  if ( pcbData ) *pcbData = dwUnExpDataLen;
+  return dwRet;
 }
 
 /*************************************************************************
@@ -1618,3 +1680,12 @@
     TRACE("new key is %08x\n", newKey);
     return newKey;
 }
+
+
+
+
+
+
+
+
+
Index: wine/dlls/shlwapi/shlwapi.spec
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/shlwapi.spec,v
retrieving revision 1.33
diff -d -u -r1.33 shlwapi.spec
--- wine/dlls/shlwapi/shlwapi.spec	23 Mar 2002 21:39:05 -0000	1.33
+++ wine/dlls/shlwapi/shlwapi.spec	7 May 2002 18:58:33 -0000
@@ -184,7 +184,7 @@
 172 stdcall @(ptr ptr) SHLWAPI_172
 173 stub @
 174 stdcall @(ptr ptr) SHLWAPI_174
-175 stub @
+175 stdcall @(ptr ptr) SHLWAPI_175
 176 stdcall @(ptr ptr ptr ptr) SHLWAPI_176
 177 stub @
 178 stub @
@@ -734,3 +734,4 @@
 @ stub    StrFormatByteSize64A
 @ stub    StrFormatKBSizeA
 @ stub    StrFormatKBSizeW
+
===================================================================
--- /dev/null	Mon Mar  4 08:42:02 2002
+++ wine/dlls/shell32/debughlp.c	Fri Mar 29 20:45:43 2002
@@ -0,0 +1,267 @@
+/*
+ *
+ * Helper functions for debugging
+ *
+ * Copyright 1998, 2002 Juergen Schmied
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "pidl.h"
+#include "shlguid.h"
+#include "wine/debug.h"
+#include "debughlp.h"
+
+
+WINE_DEFAULT_DEBUG_CHANNEL(pidl);
+
+LPITEMIDLIST  _dbg_ILGetNext(LPITEMIDLIST pidl)
+{
+	WORD len;
+
+	if(pidl)
+	{
+	  len =  pidl->mkid.cb;
+	  if (len)
+	  {
+	    pidl = (LPITEMIDLIST) (((LPBYTE)pidl)+len);
+	    return pidl;
+	  }
+	}
+	return NULL;
+}
+
+BOOL _dbg_ILIsDesktop(LPCITEMIDLIST pidl)
+{
+	return ( !pidl || (pidl && pidl->mkid.cb == 0x00) );
+}
+
+LPPIDLDATA _dbg_ILGetDataPointer(LPITEMIDLIST pidl)
+{
+	if(pidl && pidl->mkid.cb != 0x00)
+	  return (LPPIDLDATA) &(pidl->mkid.abID);
+	return NULL;
+}
+
+LPSTR _dbg_ILGetTextPointer(LPCITEMIDLIST pidl)
+{
+	LPPIDLDATA pdata =_dbg_ILGetDataPointer(pidl);
+
+	if (pdata)
+	{
+	  switch (pdata->type)
+	  {
+	    case PT_MYCOMP:
+	    case PT_SPECIAL:
+	      return NULL;
+
+	    case PT_DRIVE:
+	    case PT_DRIVE1:
+	    case PT_DRIVE2:
+	    case PT_DRIVE3:
+	      return (LPSTR)&(pdata->u.drive.szDriveName);
+
+	    case PT_FOLDER:
+	    case PT_FOLDER1:
+	    case PT_VALUE:
+	    case PT_IESPECIAL1:
+	    case PT_IESPECIAL2:
+	      return (LPSTR)&(pdata->u.file.szNames);
+
+	    case PT_WORKGRP:
+	    case PT_COMP:
+	    case PT_NETWORK:
+	    case PT_SHARE:
+	      return (LPSTR)&(pdata->u.network.szNames);
+	  }
+	}
+	return NULL;
+}
+
+LPSTR _dbg_ILGetSTextPointer(LPCITEMIDLIST pidl)
+{
+	LPPIDLDATA pdata =_dbg_ILGetDataPointer(pidl);
+
+	if (pdata)
+	{
+	  switch (pdata->type)
+	  {
+	    case PT_FOLDER:
+	    case PT_VALUE:
+	    case PT_IESPECIAL1:
+	    case PT_IESPECIAL2:
+	      return (LPSTR)(pdata->u.file.szNames + strlen (pdata->u.file.szNames) + 1);
+
+	    case PT_WORKGRP:
+	      return (LPSTR)(pdata->u.network.szNames + strlen (pdata->u.network.szNames) + 1);
+	  }
+	}
+	return NULL;
+}
+
+REFIID _dbg_ILGetGUIDPointer(LPCITEMIDLIST pidl)
+{
+	LPPIDLDATA pdata =_ILGetDataPointer(pidl);
+
+	if (pdata)
+	{
+	  switch (pdata->type)
+	  {
+	    case PT_SPECIAL:
+	    case PT_MYCOMP:
+	      return (REFIID) &(pdata->u.mycomp.guid);
+
+	    default:
+		TRACE("Unknown pidl type 0x%04x\n", pdata->type);
+		break;
+	  }
+	}
+	return NULL;
+}
+
+DWORD _dbg_ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
+{
+	DWORD		dwReturn=0; 
+	LPSTR		szSrc;
+	GUID const * 	riid;
+	char szTemp[MAX_PATH];
+	
+	if (!pidl) return 0;
+
+	if (szOut)
+	  *szOut = 0;
+
+	if (_dbg_ILIsDesktop(pidl))					
+	{
+	 /* desktop */
+	  if (szOut) strncpy(szOut, "Desktop", uOutSize);
+	  dwReturn = strlen ("Desktop");
+	}
+	else if (( szSrc = _dbg_ILGetTextPointer(pidl) ))
+	{
+	  /* filesystem */
+	  if (szOut) strncpy(szOut, szSrc, uOutSize);
+	  dwReturn = strlen(szSrc);
+	}
+	else if (( riid = _dbg_ILGetGUIDPointer(pidl) ))
+	{
+	  if (szOut)
+            sprintf( szOut, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+                 riid->Data1, riid->Data2, riid->Data3,
+                 riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
+                 riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] );
+	  dwReturn = strlen (szTemp);
+	}
+	else
+	{
+	  ERR("-- no text\n");
+	}
+	return dwReturn;
+}
+
+
+
+
+void pdump (LPCITEMIDLIST pidl)
+{
+	LPITEMIDLIST pidltemp = pidl;
+
+	if (!TRACE_ON(pidl)) return;
+
+	if (! pidltemp)
+	{
+	  MESSAGE ("-------- pidl=NULL (Desktop)\n");
+	}
+	else
+	{
+	  MESSAGE ("-------- pidl=%p\n", pidl);
+	  if (pidltemp->mkid.cb)
+	  { 
+	    do
+	    {
+	      DWORD dwAttrib = 0;
+	      LPPIDLDATA pData   = _dbg_ILGetDataPointer(pidltemp);
+	      DWORD type         = pData->type;
+	      LPSTR szLongName   = _dbg_ILGetTextPointer(pidltemp);
+	      LPSTR szShortName  = _dbg_ILGetSTextPointer(pidltemp);
+	      char szName[MAX_PATH];
+
+	      _dbg_ILSimpleGetText(pidltemp, szName, MAX_PATH);
+	      if( PT_FOLDER == type)
+	        dwAttrib = pData->u.folder.uFileAttribs;
+	      else if( PT_VALUE == type)
+	        dwAttrib = pData->u.file.uFileAttribs;
+
+	      MESSAGE ("-- pidl=%p size=%u type=%lx attr=0x%08lx name=%s (%s,%s)\n",
+	               pidltemp, pidltemp->mkid.cb,type,dwAttrib,szName,debugstr_a(szLongName), debugstr_a(szShortName));
+
+	      pidltemp = _dbg_ILGetNext(pidltemp);
+
+	    } while (pidltemp->mkid.cb);
+	  }
+	  else
+	  {
+	    MESSAGE ("empty pidl (Desktop)\n");
+	  }
+	  pcheck(pidl);
+	}
+}
+#define BYTES_PRINTED 32
+BOOL pcheck (LPCITEMIDLIST pidl)
+{
+        DWORD type, ret=TRUE;
+        LPITEMIDLIST pidltemp = pidl;
+
+        if (pidltemp && pidltemp->mkid.cb)
+        { do
+          { type   = _dbg_ILGetDataPointer(pidltemp)->type;
+            switch (type)
+	    { case PT_DESKTOP:
+	      case PT_MYCOMP:
+	      case PT_SPECIAL:
+	      case PT_DRIVE:
+	      case PT_DRIVE1:
+	      case PT_DRIVE2:
+	      case PT_DRIVE3:
+	      case PT_FOLDER:
+	      case PT_VALUE:
+	      case PT_FOLDER1:
+	      case PT_WORKGRP:
+	      case PT_COMP:
+	      case PT_NETWORK:
+	      case PT_IESPECIAL1:
+	      case PT_IESPECIAL2:
+	      case PT_SHARE:
+		break;
+	      default:
+	      {
+		char szTemp[BYTES_PRINTED*4 + 1];
+		int i;
+		unsigned char c;
+
+		memset(szTemp, ' ', BYTES_PRINTED*4 + 1);
+		for ( i = 0; (i<pidltemp->mkid.cb) && (i<BYTES_PRINTED); i++)
+		{
+		  c = ((unsigned char *)pidltemp)[i];
+
+		  szTemp[i*3+0] = ((c>>4)>9)? (c>>4)+55 : (c>>4)+48;
+		  szTemp[i*3+1] = ((0x0F&c)>9)? (0x0F&c)+55 : (0x0F&c)+48;
+		  szTemp[i*3+2] = ' ';
+		  szTemp[i+BYTES_PRINTED*3]  =  (c>=0x20 && c <=0x80) ? c : '.';
+		}
+		szTemp[BYTES_PRINTED*4] = 0x00;
+		ERR("unknown IDLIST type size=%u type=%lx\n%s\n",pidltemp->mkid.cb,type, szTemp);
+		ret = FALSE;
+	      }
+	    }
+	    pidltemp = _dbg_ILGetNext(pidltemp);
+	  } while (pidltemp->mkid.cb);
+	}
+	return ret;
+}
+
+
+
+
===================================================================
--- /dev/null	Mon Mar  4 08:42:02 2002
+++ wine/dlls/shell32/debughlp.h	Fri Mar 22 18:33:37 2002
@@ -0,0 +1,6 @@
+#include "winbase.h"
+#include "shlobj.h"
+
+void pdump (LPCITEMIDLIST pidl);
+BOOL pcheck (LPCITEMIDLIST pidl);
+



More information about the wine-patches mailing list