From 9acb0274e4c762d3b917f8f3364bd2553aa4d7b8 Mon Sep 17 00:00:00 2001 From: Jon Griffiths <jon_p_griffiths@yahoo.com> Date: Tue, 22 Jul 2003 00:58:09 +0000 Subject: [PATCH] Implement @280,343,344. Misc cleanups and documentation updates. --- dlls/shlwapi/reg.c | 194 +++++++++++++++++++++++++++++++------- dlls/shlwapi/shlwapi.spec | 4 +- 2 files changed, 161 insertions(+), 37 deletions(-) diff --git a/dlls/shlwapi/reg.c b/dlls/shlwapi/reg.c index 943232c0377..7bf6009392b 100644 --- a/dlls/shlwapi/reg.c +++ b/dlls/shlwapi/reg.c @@ -20,12 +20,8 @@ */ #include <string.h> -#include "windef.h" #include "winbase.h" -#include "wingdi.h" #include "winuser.h" -#include "winerror.h" -#include "winnls.h" #include "winreg.h" #include "wine/debug.h" #define NO_SHLWAPI_STREAM @@ -55,6 +51,9 @@ typedef struct { WCHAR key_string[MAX_PATH]; /* additional path from 'start' */ } Internal_HUSKEY, *LPInternal_HUSKEY; +DWORD WINAPI SHLWAPI_24(REFGUID,LPWSTR,INT); +HRESULT WINAPI SHLWAPI_344(REFGUID,LPCWSTR,BOOL,BOOL,PHKEY); + #define REG_HKCU TRUE #define REG_HKLM FALSE @@ -64,7 +63,7 @@ typedef struct { * Function: Return the proper registry key from the HUSKEY structure * also allow special predefined values. */ -HKEY REG_GetHKEYFromHUSKEY(HUSKEY hUSKey, BOOL which) +static HKEY WINAPI REG_GetHKEYFromHUSKEY(HUSKEY hUSKey, BOOL which) { HKEY test = (HKEY) hUSKey; LPInternal_HUSKEY mihk = (LPInternal_HUSKEY) hUSKey; @@ -150,7 +149,7 @@ LONG WINAPI SHRegOpenUSKeyA( return ret2; } - TRACE("HUSKEY=0x%08lx\n", (LONG)ihky); + TRACE("HUSKEY=%p\n", ihky); if (phNewUSKey) *phNewUSKey = (HUSKEY)ihky; return ERROR_SUCCESS; @@ -417,7 +416,7 @@ LONG WINAPI SHRegGetUSValueW( if (ret == ERROR_SUCCESS) { ret = SHRegQueryUSValueW(myhuskey, pValue, pwType, pvData, pcbData, flagIgnoreHKCU, pDefaultData, - wDefaultDataSize); + wDefaultDataSize); SHRegCloseUSKey(myhuskey); } return ret; @@ -425,14 +424,24 @@ LONG WINAPI SHRegGetUSValueW( /************************************************************************* * SHRegSetUSValueA [SHLWAPI.@] + * + * Set a user-specific registry value. + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: An error code from SHRegOpenUSKeyA() or SHRegWriteUSValueA(), or + * ERROR_INVALID_FUNCTION if pvData is NULL. + * + * NOTES + * This function opens pszSubKey, sets the value, and then closes the key. */ LONG WINAPI SHRegSetUSValueA( - LPCSTR pszSubKey, - LPCSTR pszValue, - DWORD dwType, - LPVOID pvData, - DWORD cbData, - DWORD dwFlags) + LPCSTR pszSubKey, /* [I] Name of key to set the value in */ + LPCSTR pszValue, /* [I] Name of value under pszSubKey to set the value in */ + DWORD dwType, /* [I] Type of the value */ + LPVOID pvData, /* [I] Data to set as the value */ + DWORD cbData, /* [I] length of pvData */ + DWORD dwFlags) /* [I] SHREGSET_ flags from "shlwapi.h" */ { HUSKEY myhuskey; LONG ret; @@ -441,12 +450,12 @@ LONG WINAPI SHRegSetUSValueA( if (!pvData) return ERROR_INVALID_FUNCTION; TRACE("key '%s', value '%s', datalen %ld\n", debugstr_a(pszSubKey), debugstr_a(pszValue), cbData); - + ignoreHKCU = ((dwFlags == SHREGSET_HKLM) || (dwFlags == SHREGSET_FORCE_HKLM)); ret = SHRegOpenUSKeyA(pszSubKey, 0x1, 0, &myhuskey, ignoreHKCU); if (ret == ERROR_SUCCESS) { - ret = SHRegWriteUSValueA(myhuskey, pszValue, dwType, pvData, + ret = SHRegWriteUSValueA(myhuskey, pszValue, dwType, pvData, cbData, dwFlags); SHRegCloseUSKey(myhuskey); } @@ -455,6 +464,8 @@ LONG WINAPI SHRegSetUSValueA( /************************************************************************* * SHRegSetUSValueW [SHLWAPI.@] + * + * See SHRegSetUSValueA. */ LONG WINAPI SHRegSetUSValueW( LPCWSTR pszSubKey, @@ -471,12 +482,12 @@ LONG WINAPI SHRegSetUSValueW( if (!pvData) return ERROR_INVALID_FUNCTION; TRACE("key '%s', value '%s', datalen %ld\n", debugstr_w(pszSubKey), debugstr_w(pszValue), cbData); - + ignoreHKCU = ((dwFlags == SHREGSET_HKLM) || (dwFlags == SHREGSET_FORCE_HKLM)); ret = SHRegOpenUSKeyW(pszSubKey, 0x1, 0, &myhuskey, ignoreHKCU); if (ret == ERROR_SUCCESS) { - ret = SHRegWriteUSValueW(myhuskey, pszValue, dwType, pvData, + ret = SHRegWriteUSValueW(myhuskey, pszValue, dwType, pvData, cbData, dwFlags); SHRegCloseUSKey(myhuskey); } @@ -632,8 +643,8 @@ LONG WINAPI SHRegQueryInfoUSKeyA( HKEY dokey; LONG ret; - TRACE("(0x%lx,%p,%p,%p,%p,%d)\n", - (LONG)hUSKey,pcSubKeys,pcchMaxSubKeyLen,pcValues, + TRACE("(%p,%p,%p,%p,%p,%d)\n", + hUSKey,pcSubKeys,pcchMaxSubKeyLen,pcValues, pcchMaxValueNameLen,enumRegFlags); /* if user wants HKCU, and it exists, then try it */ @@ -673,8 +684,8 @@ LONG WINAPI SHRegQueryInfoUSKeyW( HKEY dokey; LONG ret; - TRACE("(0x%lx,%p,%p,%p,%p,%d)\n", - (LONG)hUSKey,pcSubKeys,pcchMaxSubKeyLen,pcValues, + TRACE("(%p,%p,%p,%p,%p,%d)\n", + hUSKey,pcSubKeys,pcchMaxSubKeyLen,pcValues, pcchMaxValueNameLen,enumRegFlags); /* if user wants HKCU, and it exists, then try it */ @@ -716,8 +727,8 @@ LONG WINAPI SHRegEnumUSKeyA( { HKEY dokey; - TRACE("(0x%lx,%ld,%p,%p(%ld),%d)\n", - (LONG)hUSKey, dwIndex, pszName, pcchValueNameLen, + TRACE("(%p,%ld,%p,%p(%ld),%d)\n", + hUSKey, dwIndex, pszName, pcchValueNameLen, *pcchValueNameLen, enumRegFlags); if (((enumRegFlags == SHREGENUM_HKCU) || @@ -751,8 +762,8 @@ LONG WINAPI SHRegEnumUSKeyW( { HKEY dokey; - TRACE("(0x%lx,%ld,%p,%p(%ld),%d)\n", - (LONG)hUSKey, dwIndex, pszName, pcchValueNameLen, + TRACE("(%p,%ld,%p,%p(%ld),%d)\n", + hUSKey, dwIndex, pszName, pcchValueNameLen, *pcchValueNameLen, enumRegFlags); if (((enumRegFlags == SHREGENUM_HKCU) || @@ -772,18 +783,31 @@ LONG WINAPI SHRegEnumUSKeyW( return ERROR_INVALID_FUNCTION; } + /************************************************************************* * SHRegWriteUSValueA [SHLWAPI.@] * + * Write a user-specific registry value. * + * PARAMS + * hUSKey [I] Key to write the value to + * pszValue [I] Name of value under hUSKey to write the value as + * dwType [I] Type of the value + * pvData [I] Data to set as the value + * cbData [I] length of pvData + * dwFlags [I] SHREGSET_ flags from "shlwapi.h" + * + * RETURNS + * Success: ERROR_SUCCESS. + * Failure: An error code from RegSetValueExA(). */ LONG WINAPI SHRegWriteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, DWORD dwType, LPVOID pvData, DWORD cbData, DWORD dwFlags) { HKEY dokey; - TRACE("(0x%lx,%s,%ld,%p,%ld,%ld)\n", - (LONG)hUSKey, debugstr_a(pszValue), dwType, pvData, cbData, dwFlags); + TRACE("(%p,%s,%ld,%p,%ld,%ld)\n", + hUSKey, debugstr_a(pszValue), dwType, pvData, cbData, dwFlags); if ((dwFlags & SHREGSET_FORCE_HKCU) && (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) { @@ -812,8 +836,8 @@ LONG WINAPI SHRegWriteUSValueW(HUSKEY hUSKey, LPCWSTR pszValue, DWORD dwType, { HKEY dokey; - TRACE("(0x%lx,%s,%ld,%p,%ld,%ld)\n", - (LONG)hUSKey, debugstr_w(pszValue), dwType, pvData, cbData, dwFlags); + TRACE("(%p,%s,%ld,%p,%ld,%ld)\n", + hUSKey, debugstr_w(pszValue), dwType, pvData, cbData, dwFlags); if ((dwFlags & SHREGSET_FORCE_HKCU) && (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) { @@ -890,7 +914,7 @@ DWORD WINAPI SHRegGetPathW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, * * RETURNS * Success: ERROR_SUCCESS. - * Failure: An error code from SHSetValueA. + * Failure: An error code from SHSetValueA(). */ DWORD WINAPI SHRegSetPathA(HKEY hKey, LPCSTR lpszSubKey, LPCSTR lpszValue, LPCSTR lpszPath, DWORD dwFlags) @@ -1074,6 +1098,9 @@ DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, * SHQueryInfoKeyA [SHLWAPI.@] * * Get information about a registry key. See RegQueryInfoKeyA(). + * + * RETURNS + * The result of calling RegQueryInfoKeyA(). */ LONG WINAPI SHQueryInfoKeyA(HKEY hKey, LPDWORD pwSubKeys, LPDWORD pwSubKeyMax, LPDWORD pwValues, LPDWORD pwValueMax) @@ -1087,7 +1114,7 @@ LONG WINAPI SHQueryInfoKeyA(HKEY hKey, LPDWORD pwSubKeys, LPDWORD pwSubKeyMax, /************************************************************************* * SHQueryInfoKeyW [SHLWAPI.@] * - * See SHQueryInfoKeyA + * See SHQueryInfoKeyA. */ LONG WINAPI SHQueryInfoKeyW(HKEY hKey, LPDWORD pwSubKeys, LPDWORD pwSubKeyMax, LPDWORD pwValues, LPDWORD pwValueMax) @@ -1558,7 +1585,7 @@ DWORD WINAPI SHDeleteValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue) * lpszSubKey [O] Pointer updated with the subkey name * pwLen [O] Pointer updated with the subkey length * - * RETURN + * RETURNS * Success: ERROR_SUCCESS. lpszSubKey and pwLen are updated. * Failure: An error code from RegEnumKeyExA(). */ @@ -1673,8 +1700,7 @@ DWORD WINAPI SHLWAPI_206(HKEY hkey, LPCWSTR pSubKey, LPCWSTR pValue, * Set a MIME content type in the registry. * * PARAMS - * hKey [I] Handle to registry key - * lpszSubKey [I] Name of sub key under hKey + * lpszSubKey [I] Name of key under HKEY_CLASSES_ROOT. * lpszValue [I] Value to set * * RETURNS @@ -1768,7 +1794,7 @@ BOOL WINAPI SHLWAPI_328(LPCSTR lpszType, LPSTR lpszBuffer, DWORD dwLen) if (dwLen > dwLenMimeDbContent && lpszType && lpszBuffer) { - DWORD dwStrLen = strlen(lpszType); + size_t dwStrLen = strlen(lpszType); if (dwStrLen < dwLen - dwLenMimeDbContent) { @@ -2062,3 +2088,101 @@ DWORD WINAPI SHCopyKeyW(HKEY hKeyDst, LPCWSTR lpszSubKey, HKEY hKeySrc, DWORD dw RegCloseKey(hKeyDst); return dwRet; } + +/* + * The following functions are ORDINAL ONLY: + */ + +/************************************************************************* + * SHLWAPI_280 [SHLWAPI.280] + * + * Read an integer value from the registry, falling back to a default. + * + * PARAMS + * hKey [I] Registry key to read from + * lpszValue [I] Value name to read + * iDefault [I] Default value to return + * + * RETURNS + * The value contained in the given registry value if present, otherwise + * iDefault. + */ +int WINAPI SHLWAPI_280(HKEY hKey, LPCWSTR lpszValue, int iDefault) +{ + TRACE("(%p,%s,%d)", hKey, debugstr_w(lpszValue), iDefault); + + if (hKey) + { + WCHAR szBuff[32]; + DWORD dwSize = sizeof(szBuff); + szBuff[0] = '\0'; + SHQueryValueExW(hKey, lpszValue, 0, 0, szBuff, &dwSize); + + if(*szBuff >= '0' && *szBuff <= '9') + return StrToIntW(szBuff); + } + return iDefault; +} + +/************************************************************************* + * SHLWAPI_343 [SHLWAPI.343] + * + * Create or open an explorer ClassId Key. + * + * PARAMS + * guid [I] Explorer ClassId key to open + * lpszValue [I] Value name under the ClassId Key + * bUseHKCU [I] TRUE=Use HKEY_CURRENT_USER, FALSE=Use HKEY_CLASSES_ROOT + * bCreate [I] TRUE=Create the key if it doesn't exist, FALSE=Don't + * phKey [O] Destination for the resulting key handle + * + * RETURNS + * Success: S_OK. phKey contains the resulting registry handle. + * Failure: An HRESULT error code indicating the problem. + */ +HRESULT WINAPI SHLWAPI_343(REFGUID guid, LPCSTR lpszValue, BOOL bUseHKCU, BOOL bCreate, PHKEY phKey) +{ + WCHAR szValue[MAX_PATH]; + + if (lpszValue) + MultiByteToWideChar(CP_ACP, 0, lpszValue, -1, szValue, sizeof(szValue)/sizeof(WCHAR)); + + return SHLWAPI_344(guid, lpszValue ? szValue : NULL, bUseHKCU, bCreate, phKey); +} + +/************************************************************************* + * SHLWAPI_344 [SHLWAPI.344] + * + * Unicode version of SHLWAPI_343. + */ +HRESULT WINAPI SHLWAPI_344(REFGUID guid, LPCWSTR lpszValue, BOOL bUseHKCU, + BOOL bCreate, PHKEY phKey) +{ + static const WCHAR szClassIdKey[] = { 'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'E','x','p','l','o','r','e','r','\\','C','L','S','I','D','\\' }; +#define szClassIdKeyLen (sizeof(szClassIdKey)/sizeof(WCHAR)) + WCHAR szKey[MAX_PATH]; + DWORD dwRet; + HKEY hkey; + + /* Create the key string */ + memcpy(szKey, szClassIdKey, sizeof(szClassIdKey)); + SHLWAPI_24(guid, szKey + szClassIdKeyLen, 39); /* Append guid */ + + if(lpszValue) + { + szKey[szClassIdKeyLen + 39] = '\\'; + strcpyW(szKey + szClassIdKeyLen + 40, lpszValue); /* Append value name */ + } + + hkey = bUseHKCU ? HKEY_CURRENT_USER : HKEY_CLASSES_ROOT; + + if(bCreate) + dwRet = RegCreateKeyW(hkey, szKey, phKey); + else + dwRet = RegOpenKeyExW(hkey, szKey, 0, KEY_READ, phKey); + + return dwRet ? HRESULT_FROM_WIN32(dwRet) : S_OK; +} diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec index 41806ff6327..8050b556280 100644 --- a/dlls/shlwapi/shlwapi.spec +++ b/dlls/shlwapi/shlwapi.spec @@ -340,8 +340,8 @@ 340 stdcall @(long wstr wstr long) user32.MessageBoxW 341 stdcall @(long ptr) kernel32.FindNextFileW 342 stdcall @(ptr long long) SHInterlockedCompareExchange -343 stub @ -344 stub @ +343 stdcall -noname SHLWAPI_343(ptr str long long ptr) +344 stdcall -noname SHLWAPI_344(ptr wstr long long ptr) 345 stub @ 346 stdcall @(wstr ptr long) SHLWAPI_346 347 stdcall @(long wstr) advapi32.RegDeleteValueW -- GitLab