From 54eed4d70852ecfb3a19ec9975641e83d02c8492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 14 Feb 2005 14:50:45 +0000 Subject: [PATCH] Sync to Wine-20050211 James Hawkins - use only stored result of Interlocked* in AddRef/Release - expand TRACEs to display the ref count Hans Leidekker - Stub implementations for PathUnExpandEnvStringsSHRegEnumUSValue{A,W}, SHRegCreateUSKey{A,W}, SHRegDeleteEmptyUSKey{A,W}, SHRegDeleteUSValue{A,W}, SHRegEnumUSValue{A,W}. - Implement and test PathIsValidChar{A,W}. Paul Vriens - Change the order of Src and Dst in CopyKey calls/functions. svn path=/trunk/; revision=13559 --- reactos/lib/shlwapi/assoc.c | 16 +-- reactos/lib/shlwapi/istream.c | 17 +-- reactos/lib/shlwapi/path.c | 204 +++++++++++++++++++------------ reactos/lib/shlwapi/reg.c | 160 ++++++++++++++++++++++-- reactos/lib/shlwapi/regstream.c | 15 ++- reactos/lib/shlwapi/shlwapi.spec | 20 +-- 6 files changed, 313 insertions(+), 119 deletions(-) diff --git a/reactos/lib/shlwapi/assoc.c b/reactos/lib/shlwapi/assoc.c index 2bd8b195808..340ac2071b5 100644 --- a/reactos/lib/shlwapi/assoc.c +++ b/reactos/lib/shlwapi/assoc.c @@ -467,10 +467,11 @@ static HRESULT WINAPI IQueryAssociations_fnQueryInterface( static ULONG WINAPI IQueryAssociations_fnAddRef(IQueryAssociations *iface) { IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface; + ULONG refCount = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(ref before=%lu)\n",This, refCount - 1); - TRACE("(%p)->(ref before=%lu)\n",This, This->ref); - - return InterlockedIncrement(&This->ref); + return refCount; } /************************************************************************** @@ -481,16 +482,17 @@ static ULONG WINAPI IQueryAssociations_fnAddRef(IQueryAssociations *iface) static ULONG WINAPI IQueryAssociations_fnRelease(IQueryAssociations *iface) { IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface; - ULONG ulRet; + ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)->(ref before=%lu)\n",This, This->ref); + TRACE("(%p)->(ref before=%lu)\n",This, refCount + 1); - if (!(ulRet = InterlockedDecrement(&This->ref))) + if (!refCount) { TRACE("Destroying IQueryAssociations (%p)\n", This); HeapFree(GetProcessHeap(), 0, This); } - return ulRet; + + return refCount; } /************************************************************************** diff --git a/reactos/lib/shlwapi/istream.c b/reactos/lib/shlwapi/istream.c index de061ae0b72..50581c02d62 100644 --- a/reactos/lib/shlwapi/istream.c +++ b/reactos/lib/shlwapi/istream.c @@ -78,9 +78,11 @@ static HRESULT WINAPI IStream_fnQueryInterface(IStream *iface, REFIID riid, LPVO static ULONG WINAPI IStream_fnAddRef(IStream *iface) { ISHFileStream *This = (ISHFileStream *)iface; + ULONG refCount = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(ref before=%lu)\n",This, refCount - 1); - TRACE("(%p)\n", This); - return InterlockedIncrement(&This->ref); + return refCount; } /************************************************************************** @@ -89,18 +91,19 @@ static ULONG WINAPI IStream_fnAddRef(IStream *iface) static ULONG WINAPI IStream_fnRelease(IStream *iface) { ISHFileStream *This = (ISHFileStream *)iface; - ULONG ulRet; + ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)\n", This); - - if (!(ulRet = InterlockedDecrement(&This->ref))) + TRACE("(%p)->(ref before=%lu)\n",This, refCount + 1); + + if (!refCount) { IStream_fnCommit(iface, 0); /* If ever buffered, this will be needed */ LocalFree((HLOCAL)This->lpszPath); CloseHandle(This->hFile); HeapFree(GetProcessHeap(), 0, This); } - return ulRet; + + return refCount; } /************************************************************************** diff --git a/reactos/lib/shlwapi/path.c b/reactos/lib/shlwapi/path.c index fd78b765ba1..1c070f1e6cd 100644 --- a/reactos/lib/shlwapi/path.c +++ b/reactos/lib/shlwapi/path.c @@ -3910,6 +3910,38 @@ VOID WINAPI PathUndecorateW(LPWSTR lpszPath) } } +/************************************************************************* + * PathUnExpandEnvStringsA [SHLWAPI.@] + * + * Substitute folder names in a path with their corresponding environment + * strings. + * + * PARAMS + * pszPath [I] Buffer containing the path to unexpand. + * pszBuf [O] Buffer to receive the unexpanded path. + * cchBuf [I] Size of pszBuf in characters. + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL WINAPI PathUnExpandEnvStringsA(LPCSTR pszPath, LPSTR pszBuf, UINT cchBuf) +{ + FIXME("(%s,%s,0x%08x)\n", debugstr_a(pszPath), debugstr_a(pszBuf), cchBuf); + return FALSE; +} + +/************************************************************************* + * PathUnExpandEnvStringsW [SHLWAPI.@] + * + * Unicode version of PathUnExpandEnvStringsA. + */ +BOOL WINAPI PathUnExpandEnvStringsW(LPCWSTR pszPath, LPWSTR pszBuf, UINT cchBuf) +{ + FIXME("(%s,%s,0x%08x)\n", debugstr_w(pszPath), debugstr_w(pszBuf), cchBuf); + return FALSE; +} + /************************************************************************* * @ [SHLWAPI.440] * @@ -3990,100 +4022,110 @@ HRESULT WINAPI SHGetWebFolderFilePathW(LPCWSTR lpszFile, LPWSTR lpszPath, DWORD return E_FAIL; } -#define PATH_CHAR_CLASS_LETTER 0x0001 -#define PATH_CHAR_CLASS_ASTERIX 0x0002 -#define PATH_CHAR_CLASS_DOT 0x0004 -#define PATH_CHAR_CLASS_BACKSLASH 0x0008 -#define PATH_CHAR_CLASS_COLON 0x0010 -#define PATH_CHAR_CLASS_SEMICOLON 0x0020 -#define PATH_CHAR_CLASS_COMMA 0x0040 -#define PATH_CHAR_CLASS_SPACE 0x0080 -#define PATH_CHAR_CLASS_OTHER_VALID 0x0100 -#define PATH_CHAR_CLASS_DOUBLEQUOTE 0x0200 +#define PATH_CHAR_CLASS_LETTER 0x00000001 +#define PATH_CHAR_CLASS_ASTERIX 0x00000002 +#define PATH_CHAR_CLASS_DOT 0x00000004 +#define PATH_CHAR_CLASS_BACKSLASH 0x00000008 +#define PATH_CHAR_CLASS_COLON 0x00000010 +#define PATH_CHAR_CLASS_SEMICOLON 0x00000020 +#define PATH_CHAR_CLASS_COMMA 0x00000040 +#define PATH_CHAR_CLASS_SPACE 0x00000080 +#define PATH_CHAR_CLASS_OTHER_VALID 0x00000100 +#define PATH_CHAR_CLASS_DOUBLEQUOTE 0x00000200 -/************************************************************************* - * PathIsValidCharAW [internal] - * - * Check if a char is of a certain class - */ -static BOOL WINAPI PathIsValidCharAW(unsigned Ch, DWORD Class) +#define PATH_CHAR_CLASS_INVALID 0x00000000 +#define PATH_CHAR_CLASS_ANY 0xffffffff + +static const DWORD SHELL_charclass[] = { - static struct - { - char Ch; - DWORD Class; - } CharClass[] = - { - { ' ', PATH_CHAR_CLASS_SPACE }, - { '!', PATH_CHAR_CLASS_OTHER_VALID }, - { '"', PATH_CHAR_CLASS_DOUBLEQUOTE }, - { '#', PATH_CHAR_CLASS_OTHER_VALID }, - { '$', PATH_CHAR_CLASS_OTHER_VALID }, - { '%', PATH_CHAR_CLASS_OTHER_VALID }, - { '&', PATH_CHAR_CLASS_OTHER_VALID }, - { '\'', PATH_CHAR_CLASS_OTHER_VALID }, - { '(', PATH_CHAR_CLASS_OTHER_VALID }, - { ')', PATH_CHAR_CLASS_OTHER_VALID }, - { '*', PATH_CHAR_CLASS_ASTERIX }, - { '+', PATH_CHAR_CLASS_OTHER_VALID }, - { ',', PATH_CHAR_CLASS_COMMA }, - { '-', PATH_CHAR_CLASS_OTHER_VALID }, - { '.', PATH_CHAR_CLASS_DOT }, - { ':', PATH_CHAR_CLASS_COLON }, - { ';', PATH_CHAR_CLASS_SEMICOLON }, - { '=', PATH_CHAR_CLASS_OTHER_VALID }, - { '?', PATH_CHAR_CLASS_LETTER }, - { '@', PATH_CHAR_CLASS_OTHER_VALID }, - { '[', PATH_CHAR_CLASS_OTHER_VALID }, - { '\\', PATH_CHAR_CLASS_BACKSLASH }, - { ']', PATH_CHAR_CLASS_OTHER_VALID }, - { '^', PATH_CHAR_CLASS_OTHER_VALID }, - { '_', PATH_CHAR_CLASS_OTHER_VALID }, - { '`', PATH_CHAR_CLASS_OTHER_VALID }, - { '{', PATH_CHAR_CLASS_OTHER_VALID }, - { '}', PATH_CHAR_CLASS_OTHER_VALID }, - { '~', PATH_CHAR_CLASS_OTHER_VALID }, - { 0x7f, PATH_CHAR_CLASS_OTHER_VALID } - }; - unsigned Index; - - if (('A' <= Ch && Ch <= 'Z') || ('a' <= Ch && Ch <= 'z')) - { - return (Class & PATH_CHAR_CLASS_LETTER); - } - - if (('0' <= Ch && Ch <= '9') || 0x80 <= Ch) - { - return (Class & PATH_CHAR_CLASS_OTHER_VALID); - } - - for (Index = 0; Index < sizeof(CharClass) / sizeof(CharClass[0]); Index++) - { - if (Ch == CharClass[Index].Ch) - { - return (Class & CharClass[Index].Class); - } - } - - return FALSE; -} + /* 0x00 */ PATH_CHAR_CLASS_INVALID, /* 0x01 */ PATH_CHAR_CLASS_INVALID, + /* 0x02 */ PATH_CHAR_CLASS_INVALID, /* 0x03 */ PATH_CHAR_CLASS_INVALID, + /* 0x04 */ PATH_CHAR_CLASS_INVALID, /* 0x05 */ PATH_CHAR_CLASS_INVALID, + /* 0x06 */ PATH_CHAR_CLASS_INVALID, /* 0x07 */ PATH_CHAR_CLASS_INVALID, + /* 0x08 */ PATH_CHAR_CLASS_INVALID, /* 0x09 */ PATH_CHAR_CLASS_INVALID, + /* 0x0a */ PATH_CHAR_CLASS_INVALID, /* 0x0b */ PATH_CHAR_CLASS_INVALID, + /* 0x0c */ PATH_CHAR_CLASS_INVALID, /* 0x0d */ PATH_CHAR_CLASS_INVALID, + /* 0x0e */ PATH_CHAR_CLASS_INVALID, /* 0x0f */ PATH_CHAR_CLASS_INVALID, + /* 0x10 */ PATH_CHAR_CLASS_INVALID, /* 0x11 */ PATH_CHAR_CLASS_INVALID, + /* 0x12 */ PATH_CHAR_CLASS_INVALID, /* 0x13 */ PATH_CHAR_CLASS_INVALID, + /* 0x14 */ PATH_CHAR_CLASS_INVALID, /* 0x15 */ PATH_CHAR_CLASS_INVALID, + /* 0x16 */ PATH_CHAR_CLASS_INVALID, /* 0x17 */ PATH_CHAR_CLASS_INVALID, + /* 0x18 */ PATH_CHAR_CLASS_INVALID, /* 0x19 */ PATH_CHAR_CLASS_INVALID, + /* 0x1a */ PATH_CHAR_CLASS_INVALID, /* 0x1b */ PATH_CHAR_CLASS_INVALID, + /* 0x1c */ PATH_CHAR_CLASS_INVALID, /* 0x1d */ PATH_CHAR_CLASS_INVALID, + /* 0x1e */ PATH_CHAR_CLASS_INVALID, /* 0x1f */ PATH_CHAR_CLASS_INVALID, + /* ' ' */ PATH_CHAR_CLASS_SPACE, /* '!' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '"' */ PATH_CHAR_CLASS_DOUBLEQUOTE, /* '#' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '$' */ PATH_CHAR_CLASS_OTHER_VALID, /* '%' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '&' */ PATH_CHAR_CLASS_OTHER_VALID, /* '\'' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '(' */ PATH_CHAR_CLASS_OTHER_VALID, /* ')' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '*' */ PATH_CHAR_CLASS_ASTERIX, /* '+' */ PATH_CHAR_CLASS_OTHER_VALID, + /* ',' */ PATH_CHAR_CLASS_COMMA, /* '-' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '.' */ PATH_CHAR_CLASS_DOT, /* '/' */ PATH_CHAR_CLASS_INVALID, + /* '0' */ PATH_CHAR_CLASS_OTHER_VALID, /* '1' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '2' */ PATH_CHAR_CLASS_OTHER_VALID, /* '3' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '4' */ PATH_CHAR_CLASS_OTHER_VALID, /* '5' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '6' */ PATH_CHAR_CLASS_OTHER_VALID, /* '7' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '8' */ PATH_CHAR_CLASS_OTHER_VALID, /* '9' */ PATH_CHAR_CLASS_OTHER_VALID, + /* ':' */ PATH_CHAR_CLASS_COLON, /* ';' */ PATH_CHAR_CLASS_SEMICOLON, + /* '<' */ PATH_CHAR_CLASS_INVALID, /* '=' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '>' */ PATH_CHAR_CLASS_INVALID, /* '?' */ PATH_CHAR_CLASS_LETTER, + /* '@' */ PATH_CHAR_CLASS_OTHER_VALID, /* 'A' */ PATH_CHAR_CLASS_ANY, + /* 'B' */ PATH_CHAR_CLASS_ANY, /* 'C' */ PATH_CHAR_CLASS_ANY, + /* 'D' */ PATH_CHAR_CLASS_ANY, /* 'E' */ PATH_CHAR_CLASS_ANY, + /* 'F' */ PATH_CHAR_CLASS_ANY, /* 'G' */ PATH_CHAR_CLASS_ANY, + /* 'H' */ PATH_CHAR_CLASS_ANY, /* 'I' */ PATH_CHAR_CLASS_ANY, + /* 'J' */ PATH_CHAR_CLASS_ANY, /* 'K' */ PATH_CHAR_CLASS_ANY, + /* 'L' */ PATH_CHAR_CLASS_ANY, /* 'M' */ PATH_CHAR_CLASS_ANY, + /* 'N' */ PATH_CHAR_CLASS_ANY, /* 'O' */ PATH_CHAR_CLASS_ANY, + /* 'P' */ PATH_CHAR_CLASS_ANY, /* 'Q' */ PATH_CHAR_CLASS_ANY, + /* 'R' */ PATH_CHAR_CLASS_ANY, /* 'S' */ PATH_CHAR_CLASS_ANY, + /* 'T' */ PATH_CHAR_CLASS_ANY, /* 'U' */ PATH_CHAR_CLASS_ANY, + /* 'V' */ PATH_CHAR_CLASS_ANY, /* 'W' */ PATH_CHAR_CLASS_ANY, + /* 'X' */ PATH_CHAR_CLASS_ANY, /* 'Y' */ PATH_CHAR_CLASS_ANY, + /* 'Z' */ PATH_CHAR_CLASS_ANY, /* '[' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '\\' */ PATH_CHAR_CLASS_BACKSLASH, /* ']' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '^' */ PATH_CHAR_CLASS_OTHER_VALID, /* '_' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '`' */ PATH_CHAR_CLASS_OTHER_VALID, /* 'a' */ PATH_CHAR_CLASS_ANY, + /* 'b' */ PATH_CHAR_CLASS_ANY, /* 'c' */ PATH_CHAR_CLASS_ANY, + /* 'd' */ PATH_CHAR_CLASS_ANY, /* 'e' */ PATH_CHAR_CLASS_ANY, + /* 'f' */ PATH_CHAR_CLASS_ANY, /* 'g' */ PATH_CHAR_CLASS_ANY, + /* 'h' */ PATH_CHAR_CLASS_ANY, /* 'i' */ PATH_CHAR_CLASS_ANY, + /* 'j' */ PATH_CHAR_CLASS_ANY, /* 'k' */ PATH_CHAR_CLASS_ANY, + /* 'l' */ PATH_CHAR_CLASS_ANY, /* 'm' */ PATH_CHAR_CLASS_ANY, + /* 'n' */ PATH_CHAR_CLASS_ANY, /* 'o' */ PATH_CHAR_CLASS_ANY, + /* 'p' */ PATH_CHAR_CLASS_ANY, /* 'q' */ PATH_CHAR_CLASS_ANY, + /* 'r' */ PATH_CHAR_CLASS_ANY, /* 's' */ PATH_CHAR_CLASS_ANY, + /* 't' */ PATH_CHAR_CLASS_ANY, /* 'u' */ PATH_CHAR_CLASS_ANY, + /* 'v' */ PATH_CHAR_CLASS_ANY, /* 'w' */ PATH_CHAR_CLASS_ANY, + /* 'x' */ PATH_CHAR_CLASS_ANY, /* 'y' */ PATH_CHAR_CLASS_ANY, + /* 'z' */ PATH_CHAR_CLASS_ANY, /* '{' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '|' */ PATH_CHAR_CLASS_INVALID, /* '}' */ PATH_CHAR_CLASS_OTHER_VALID, + /* '~' */ PATH_CHAR_CLASS_OTHER_VALID +}; /************************************************************************* * @ [SHLWAPI.455] * - * Check if an Ascii char is of a certain class + * Check if an ASCII char is of a certain class */ -BOOL WINAPI PathIsValidCharA(char Ch, DWORD Class) +BOOL WINAPI PathIsValidCharA( char c, DWORD class ) { - return PathIsValidCharAW((unsigned) Ch, Class); + if ((unsigned)c > 0x7e) + return class & PATH_CHAR_CLASS_OTHER_VALID; + + return class & SHELL_charclass[(unsigned)c]; } /************************************************************************* * @ [SHLWAPI.456] * - * Check if an Unicode char is of a certain class + * Check if a Unicode char is of a certain class */ -BOOL WINAPI PathIsValidCharW(WCHAR Ch, DWORD Class) +BOOL WINAPI PathIsValidCharW( WCHAR c, DWORD class ) { - return PathIsValidCharAW((unsigned) Ch, Class); + if (c > 0x7e) + return class & PATH_CHAR_CLASS_OTHER_VALID; + + return class & SHELL_charclass[c]; } diff --git a/reactos/lib/shlwapi/reg.c b/reactos/lib/shlwapi/reg.c index a7a8486cfba..15a1f17c86c 100644 --- a/reactos/lib/shlwapi/reg.c +++ b/reactos/lib/shlwapi/reg.c @@ -206,6 +206,150 @@ LONG WINAPI SHRegCloseUSKey( return ret; } +/************************************************************************* + * SHRegCreateUSKeyA [SHLWAPI.@] + * + * Create or open a user-specific registry key. + * + * PARAMS + * pszPath [I] Key name to create or open. + * samDesired [I] Wanted security access. + * hRelativeUSKey [I] Base path if pszPath is relative. NULL otherwise. + * phNewUSKey [O] Receives a handle to the new or openened key. + * dwFlags [I] Base key under which the key should be opened. + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: Nonzero error code from winerror.h + */ +LONG WINAPI SHRegCreateUSKeyA(LPCSTR pszPath, REGSAM samDesired, HUSKEY hRelativeUSKey, + PHUSKEY phNewUSKey, DWORD dwFlags) +{ + FIXME("(%s, 0x%08lx, %p, %p, 0x%08lx) stub\n", debugstr_a(pszPath), samDesired, + hRelativeUSKey, phNewUSKey, dwFlags); + return ERROR_SUCCESS; +} + +/************************************************************************* + * SHRegCreateUSKeyW [SHLWAPI.@] + * + * See SHRegCreateUSKeyA. + */ +LONG WINAPI SHRegCreateUSKeyW(LPCWSTR pszPath, REGSAM samDesired, HUSKEY hRelativeUSKey, + PHUSKEY phNewUSKey, DWORD dwFlags) +{ + FIXME("(%s, 0x%08lx, %p, %p, 0x%08lx) stub\n", debugstr_w(pszPath), samDesired, + hRelativeUSKey, phNewUSKey, dwFlags); + return ERROR_SUCCESS; +} + +/************************************************************************* + * SHRegDeleteEmptyUSKeyA [SHLWAPI.@] + * + * Delete an empty user-specific registry key. + * + * PARAMS + * hUSKey [I] Handle to an open registry key. + * pszValue [I] Empty key name. + * delRegFlags [I] Flag that specifies the base from which to delete + * the key. + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: Nonzero error code from winerror.h + */ +LONG WINAPI SHRegDeleteEmptyUSKeyA(HUSKEY hUSKey, LPCSTR pszValue, SHREGDEL_FLAGS delRegFlags) +{ + FIXME("(%p, %s, 0x%08x) stub\n", hUSKey, debugstr_a(pszValue), delRegFlags); + return ERROR_SUCCESS; +} + +/************************************************************************* + * SHRegDeleteEmptyUSKeyW [SHLWAPI.@] + * + * See SHRegDeleteEmptyUSKeyA. + */ +LONG WINAPI SHRegDeleteEmptyUSKeyW(HUSKEY hUSKey, LPCWSTR pszValue, SHREGDEL_FLAGS delRegFlags) +{ + FIXME("(%p, %s, 0x%08x) stub\n", hUSKey, debugstr_w(pszValue), delRegFlags); + return ERROR_SUCCESS; +} + +/************************************************************************* + * SHRegDeleteUSValueA [SHLWAPI.@] + * + * Delete a user-specific registry value. + * + * PARAMS + * hUSKey [I] Handle to an open registry key. + * pszValue [I] Specifies the value to delete. + * delRegFlags [I] Flag that specifies the base of the key from which to + * delete the value. + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: Nonzero error code from winerror.h + */ +LONG WINAPI SHRegDeleteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, SHREGDEL_FLAGS delRegFlags) +{ + FIXME("(%p, %s, 0x%08x) stub\n", hUSKey, debugstr_a(pszValue), delRegFlags); + return ERROR_SUCCESS; +} + +/************************************************************************* + * SHRegDeleteUSValueW [SHLWAPI.@] + * + * See SHRegDeleteUSValueA. + */ +LONG WINAPI SHRegDeleteUSValueW(HUSKEY hUSKey, LPCWSTR pszValue, SHREGDEL_FLAGS delRegFlags) +{ + FIXME("(%p, %s, 0x%08x) stub\n", hUSKey, debugstr_w(pszValue), delRegFlags); + return ERROR_SUCCESS; +} + +/************************************************************************* + * SHRegEnumUSValueA [SHLWAPI.@] + * + * Enumerate values of a specified registry key. + * + * PARAMS + * hUSKey [I] Handle to an open registry key. + * dwIndex [I] Index of the value to be retrieved. + * pszValueName [O] Buffer to receive the value name. + * pcchValueNameLen [I] Size of pszValueName in characters. + * pdwType [O] Receives data type of the value. + * pvData [O] Receives value data. May be NULL. + * pcbData [I/O] Size of pvData in bytes. + * enumRegFlags [I] Flag that specifies the base key under which to + * enumerate values. + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: Nonzero error code from winerror.h + */ +LONG WINAPI SHRegEnumUSValueA(HUSKEY hUSKey, DWORD dwIndex, LPSTR pszValueName, + LPDWORD pcchValueNameLen, LPDWORD pdwType, LPVOID pvData, + LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags) +{ + FIXME("(%p, 0x%08lx, %s, %p, %p, %p, %p, 0x%08x) stub\n", hUSKey, dwIndex, + debugstr_a(pszValueName), pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags); + return ERROR_INVALID_FUNCTION; +} + +/************************************************************************* + * SHRegEnumUSValueW [SHLWAPI.@] + * + * See SHRegEnumUSValueA. + */ +LONG WINAPI SHRegEnumUSValueW(HUSKEY hUSKey, DWORD dwIndex, LPWSTR pszValueName, + LPDWORD pcchValueNameLen, LPDWORD pdwType, LPVOID pvData, + LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags) +{ + FIXME("(%p, 0x%08lx, %s, %p, %p, %p, %p, 0x%08x) stub\n", hUSKey, dwIndex, + debugstr_w(pszValueName), pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags); + return ERROR_INVALID_FUNCTION; +} + /************************************************************************* * SHRegQueryUSValueA [SHLWAPI.@] * @@ -2038,9 +2182,9 @@ HKEY WINAPI SHRegDuplicateHKey(HKEY hKey) * Copy a key and its values/sub keys to another location. * * PARAMS - * hKeyDst [I] Destination key - * lpszSubKey [I] Sub key under hKeyDst, or NULL to use hKeyDst directly * hKeySrc [I] Source key to copy from + * lpszSubKey [I] Sub key under hKeyDst, or NULL to use hKeyDst directly + * hKeyDst [I] Destination key * dwReserved [I] Reserved, must be 0 * * RETURNS @@ -2052,16 +2196,16 @@ HKEY WINAPI SHRegDuplicateHKey(HKEY hKey) * (It will loop until out of stack, or the registry is full). This * bug is present in Win32 also. */ -DWORD WINAPI SHCopyKeyA(HKEY hKeyDst, LPCSTR lpszSubKey, HKEY hKeySrc, DWORD dwReserved) +DWORD WINAPI SHCopyKeyA(HKEY hKeySrc, LPCSTR lpszSubKey, HKEY hKeyDst, DWORD dwReserved) { WCHAR szSubKeyW[MAX_PATH]; - TRACE("(hkey=%p,%s,%p08x,%ld)\n", hKeyDst, debugstr_a(lpszSubKey), hKeySrc, dwReserved); + TRACE("(hkey=%p,%s,%p08x,%ld)\n", hKeySrc, debugstr_a(lpszSubKey), hKeyDst, dwReserved); if (lpszSubKey) MultiByteToWideChar(0, 0, lpszSubKey, -1, szSubKeyW, MAX_PATH); - return SHCopyKeyW(hKeyDst, lpszSubKey ? szSubKeyW : NULL, hKeySrc, dwReserved); + return SHCopyKeyW(hKeySrc, lpszSubKey ? szSubKeyW : NULL, hKeyDst, dwReserved); } /************************************************************************* @@ -2069,7 +2213,7 @@ DWORD WINAPI SHCopyKeyA(HKEY hKeyDst, LPCSTR lpszSubKey, HKEY hKeySrc, DWORD dwR * * See SHCopyKeyA. */ -DWORD WINAPI SHCopyKeyW(HKEY hKeyDst, LPCWSTR lpszSubKey, HKEY hKeySrc, DWORD dwReserved) +DWORD WINAPI SHCopyKeyW(HKEY hKeySrc, LPCWSTR lpszSubKey, HKEY hKeyDst, DWORD dwReserved) { DWORD dwKeyCount = 0, dwValueCount = 0, dwMaxKeyLen = 0; DWORD dwMaxValueLen = 0, dwMaxDataLen = 0, i; @@ -2078,7 +2222,7 @@ DWORD WINAPI SHCopyKeyW(HKEY hKeyDst, LPCWSTR lpszSubKey, HKEY hKeySrc, DWORD dw WCHAR szName[MAX_PATH], *lpszName = szName; DWORD dwRet = S_OK; - TRACE("hkey=%p,%s,%p08x,%ld)\n", hKeyDst, debugstr_w(lpszSubKey), hKeySrc, dwReserved); + TRACE("hkey=%p,%s,%p08x,%ld)\n", hKeySrc, debugstr_w(lpszSubKey), hKeyDst, dwReserved); if(!hKeyDst || !hKeySrc) dwRet = ERROR_INVALID_PARAMETER; @@ -2134,7 +2278,7 @@ DWORD WINAPI SHCopyKeyW(HKEY hKeyDst, LPCWSTR lpszSubKey, HKEY hKeySrc, DWORD dw if(!dwRet) { /* Recursively copy keys and values from the sub key */ - dwRet = SHCopyKeyW(hSubKeyDst, NULL, hSubKeySrc, 0); + dwRet = SHCopyKeyW(hSubKeySrc, NULL, hSubKeyDst, 0); RegCloseKey(hSubKeyDst); } } diff --git a/reactos/lib/shlwapi/regstream.c b/reactos/lib/shlwapi/regstream.c index 14c48d21c05..172e1bbd842 100644 --- a/reactos/lib/shlwapi/regstream.c +++ b/reactos/lib/shlwapi/regstream.c @@ -75,10 +75,11 @@ static HRESULT WINAPI IStream_fnQueryInterface(IStream *iface, REFIID riid, LPVO static ULONG WINAPI IStream_fnAddRef(IStream *iface) { ISHRegStream *This = (ISHRegStream *)iface; + ULONG refCount = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(ref before=%lu)\n",This, refCount - 1); - TRACE("(%p)->(count=%lu)\n",This, This->ref); - - return InterlockedIncrement(&This->ref); + return refCount; } /************************************************************************** @@ -87,10 +88,11 @@ static ULONG WINAPI IStream_fnAddRef(IStream *iface) static ULONG WINAPI IStream_fnRelease(IStream *iface) { ISHRegStream *This = (ISHRegStream *)iface; + ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)->()\n",This); + TRACE("(%p)->(ref before=%lu)\n",This, refCount + 1); - if (!InterlockedDecrement(&This->ref)) + if (!refCount) { TRACE(" destroying SHReg IStream (%p)\n",This); @@ -102,7 +104,8 @@ static ULONG WINAPI IStream_fnRelease(IStream *iface) HeapFree(GetProcessHeap(),0,This); return 0; } - return This->ref; + + return refCount; } /************************************************************************** diff --git a/reactos/lib/shlwapi/shlwapi.spec b/reactos/lib/shlwapi/shlwapi.spec index 654011a8163..140de9fda58 100644 --- a/reactos/lib/shlwapi/shlwapi.spec +++ b/reactos/lib/shlwapi/shlwapi.spec @@ -687,16 +687,16 @@ @ stdcall SHQueryValueExA(long str ptr ptr ptr ptr) @ stdcall SHQueryValueExW(long wstr ptr ptr ptr ptr) @ stdcall SHRegCloseUSKey(ptr) -@ stub SHRegCreateUSKeyA -@ stub SHRegCreateUSKeyW -@ stub SHRegDeleteEmptyUSKeyA -@ stub SHRegDeleteEmptyUSKeyW -@ stub SHRegDeleteUSValueA -@ stub SHRegDeleteUSValueW +@ stdcall SHRegCreateUSKeyA(str long long ptr long) +@ stdcall SHRegCreateUSKeyW(wstr long long ptr long) +@ stdcall SHRegDeleteEmptyUSKeyA(long str long) +@ stdcall SHRegDeleteEmptyUSKeyW(long wstr long) +@ stdcall SHRegDeleteUSValueA(long str long) +@ stdcall SHRegDeleteUSValueW(long wstr long) @ stdcall SHRegEnumUSKeyA(long long str ptr long) @ stdcall SHRegEnumUSKeyW(long long wstr ptr long) -@ stub SHRegEnumUSValueA -@ stub SHRegEnumUSValueW +@ stdcall SHRegEnumUSValueA(long long ptr ptr ptr ptr ptr long) +@ stdcall SHRegEnumUSValueW(long long ptr ptr ptr ptr ptr long) @ stdcall SHRegGetBoolUSValueA(str str long long) @ stdcall SHRegGetBoolUSValueW(wstr wstr long long) @ stdcall SHRegGetUSValueA ( str str ptr ptr ptr long ptr long ) @@ -814,8 +814,8 @@ @ stdcall _SHGetInstanceExplorer(ptr) @ stdcall PathUndecorateA(str) @ stdcall PathUndecorateW(wstr) -@ stub PathUnExpandEnvStringsA -@ stub PathUnExpandEnvStringsW +@ stdcall PathUnExpandEnvStringsA(str ptr long) +@ stdcall PathUnExpandEnvStringsW(wstr ptr long) @ stdcall SHCopyKeyA(long str long long) @ stdcall SHCopyKeyW(long wstr long long) @ stdcall SHAutoComplete(ptr long)