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