📄 reg.c
字号:
/* if user wants HKCU, and it exists, then try it */
if (((enumRegFlags == SHREGENUM_HKCU) ||
(enumRegFlags == SHREGENUM_DEFAULT)) &&
(dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) {
ret = RegQueryInfoKeyW(dokey, 0, 0, 0,
pcSubKeys, pcchMaxSubKeyLen, 0,
pcValues, pcchMaxValueNameLen, 0, 0, 0);
if ((ret == ERROR_SUCCESS) ||
(enumRegFlags == SHREGENUM_HKCU))
return ret;
}
if (((enumRegFlags == SHREGENUM_HKLM) ||
(enumRegFlags == SHREGENUM_DEFAULT)) &&
(dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKLM))) {
return RegQueryInfoKeyW(dokey, 0, 0, 0,
pcSubKeys, pcchMaxSubKeyLen, 0,
pcValues, pcchMaxValueNameLen, 0, 0, 0);
}
return ERROR_INVALID_FUNCTION;
}
/*************************************************************************
* SHRegEnumUSKeyA [SHLWAPI.@]
*
* Enumerate a user-specific registry key.
*
* RETURNS
* Success: ERROR_SUCCESS
* Failure: An error code from RegEnumKeyExA().
*/
LONG WINAPI SHRegEnumUSKeyA(
HUSKEY hUSKey, /* [in] Key to enumerate */
DWORD dwIndex, /* [in] Index within hUSKey */
LPSTR pszName, /* [out] Name of the enumerated value */
LPDWORD pcchValueNameLen, /* [in/out] Length of pszName */
SHREGENUM_FLAGS enumRegFlags) /* [in] SHREGENUM_ flags from "shlwapi.h" */
{
HKEY dokey;
TRACE("(%p,%d,%p,%p(%d),%d)\n",
hUSKey, dwIndex, pszName, pcchValueNameLen,
*pcchValueNameLen, enumRegFlags);
if (((enumRegFlags == SHREGENUM_HKCU) ||
(enumRegFlags == SHREGENUM_DEFAULT)) &&
(dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) {
return RegEnumKeyExA(dokey, dwIndex, pszName, pcchValueNameLen,
0, 0, 0, 0);
}
if (((enumRegFlags == SHREGENUM_HKLM) ||
(enumRegFlags == SHREGENUM_DEFAULT)) &&
(dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKLM))) {
return RegEnumKeyExA(dokey, dwIndex, pszName, pcchValueNameLen,
0, 0, 0, 0);
}
FIXME("no support for SHREGENUM_BOTH\n");
return ERROR_INVALID_FUNCTION;
}
/*************************************************************************
* SHRegEnumUSKeyW [SHLWAPI.@]
*
* See SHRegEnumUSKeyA.
*/
LONG WINAPI SHRegEnumUSKeyW(
HUSKEY hUSKey,
DWORD dwIndex,
LPWSTR pszName,
LPDWORD pcchValueNameLen,
SHREGENUM_FLAGS enumRegFlags)
{
HKEY dokey;
TRACE("(%p,%d,%p,%p(%d),%d)\n",
hUSKey, dwIndex, pszName, pcchValueNameLen,
*pcchValueNameLen, enumRegFlags);
if (((enumRegFlags == SHREGENUM_HKCU) ||
(enumRegFlags == SHREGENUM_DEFAULT)) &&
(dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) {
return RegEnumKeyExW(dokey, dwIndex, pszName, pcchValueNameLen,
0, 0, 0, 0);
}
if (((enumRegFlags == SHREGENUM_HKLM) ||
(enumRegFlags == SHREGENUM_DEFAULT)) &&
(dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKLM))) {
return RegEnumKeyExW(dokey, dwIndex, pszName, pcchValueNameLen,
0, 0, 0, 0);
}
FIXME("no support for SHREGENUM_BOTH\n");
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: ERROR_INVALID_PARAMETER, if any parameter is invalid, otherwise
* an error code from RegSetValueExA().
*
* NOTES
* dwFlags must have at least SHREGSET_FORCE_HKCU or SHREGSET_FORCE_HKLM set.
*/
LONG WINAPI SHRegWriteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, DWORD dwType,
LPVOID pvData, DWORD cbData, DWORD dwFlags)
{
WCHAR szValue[MAX_PATH];
if (pszValue)
MultiByteToWideChar(CP_ACP, 0, pszValue, -1, szValue, MAX_PATH);
return SHRegWriteUSValueW(hUSKey, pszValue ? szValue : NULL, dwType,
pvData, cbData, dwFlags);
}
/*************************************************************************
* SHRegWriteUSValueW [SHLWAPI.@]
*
* See SHRegWriteUSValueA.
*/
LONG WINAPI SHRegWriteUSValueW(HUSKEY hUSKey, LPCWSTR pszValue, DWORD dwType,
LPVOID pvData, DWORD cbData, DWORD dwFlags)
{
DWORD dummy;
LPSHUSKEY hKey = (LPSHUSKEY)hUSKey;
LONG ret = ERROR_SUCCESS;
TRACE("(%p,%s,%d,%p,%d,%d)\n", hUSKey, debugstr_w(pszValue),
dwType, pvData, cbData, dwFlags);
if (!hUSKey || IsBadWritePtr(hUSKey, sizeof(SHUSKEY)) ||
!(dwFlags & (SHREGSET_FORCE_HKCU|SHREGSET_FORCE_HKLM)))
return ERROR_INVALID_PARAMETER;
if (dwFlags & (SHREGSET_FORCE_HKCU|SHREGSET_HKCU))
{
if (!hKey->HKCUkey)
{
/* Create the key */
ret = RegCreateKeyW(hKey->HKCUstart, hKey->lpszPath, &hKey->HKCUkey);
TRACE("Creating HKCU key, ret = %d\n", ret);
if (ret && (dwFlags & (SHREGSET_FORCE_HKCU)))
{
hKey->HKCUkey = 0;
return ret;
}
}
if (!ret)
{
if ((dwFlags & SHREGSET_FORCE_HKCU) ||
RegQueryValueExW(hKey->HKCUkey, pszValue, NULL, NULL, NULL, &dummy))
{
/* Doesn't exist or we are forcing: Write value */
ret = RegSetValueExW(hKey->HKCUkey, pszValue, 0, dwType, pvData, cbData);
TRACE("Writing HKCU value, ret = %d\n", ret);
}
}
}
if (dwFlags & (SHREGSET_FORCE_HKLM|SHREGSET_HKLM))
{
if (!hKey->HKLMkey)
{
/* Create the key */
ret = RegCreateKeyW(hKey->HKLMstart, hKey->lpszPath, &hKey->HKLMkey);
TRACE("Creating HKLM key, ret = %d\n", ret);
if (ret && (dwFlags & (SHREGSET_FORCE_HKLM)))
{
hKey->HKLMkey = 0;
return ret;
}
}
if (!ret)
{
if ((dwFlags & SHREGSET_FORCE_HKLM) ||
RegQueryValueExW(hKey->HKLMkey, pszValue, NULL, NULL, NULL, &dummy))
{
/* Doesn't exist or we are forcing: Write value */
ret = RegSetValueExW(hKey->HKLMkey, pszValue, 0, dwType, pvData, cbData);
TRACE("Writing HKLM value, ret = %d\n", ret);
}
}
}
return ret;
}
/*************************************************************************
* SHRegGetPathA [SHLWAPI.@]
*
* Get a path from the registry.
*
* PARAMS
* hKey [I] Handle to registry key
* lpszSubKey [I] Name of sub key containing path to get
* lpszValue [I] Name of value containing path to get
* lpszPath [O] Buffer for returned path
* dwFlags [I] Reserved
*
* RETURNS
* Success: ERROR_SUCCESS. lpszPath contains the path.
* Failure: An error code from RegOpenKeyExA() or SHQueryValueExA().
*/
DWORD WINAPI SHRegGetPathA(HKEY hKey, LPCSTR lpszSubKey, LPCSTR lpszValue,
LPSTR lpszPath, DWORD dwFlags)
{
DWORD dwSize = MAX_PATH;
TRACE("(hkey=%p,%s,%s,%p,%d)\n", hKey, debugstr_a(lpszSubKey),
debugstr_a(lpszValue), lpszPath, dwFlags);
return SHGetValueA(hKey, lpszSubKey, lpszValue, 0, lpszPath, &dwSize);
}
/*************************************************************************
* SHRegGetPathW [SHLWAPI.@]
*
* See SHRegGetPathA.
*/
DWORD WINAPI SHRegGetPathW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue,
LPWSTR lpszPath, DWORD dwFlags)
{
DWORD dwSize = MAX_PATH;
TRACE("(hkey=%p,%s,%s,%p,%d)\n", hKey, debugstr_w(lpszSubKey),
debugstr_w(lpszValue), lpszPath, dwFlags);
return SHGetValueW(hKey, lpszSubKey, lpszValue, 0, lpszPath, &dwSize);
}
/*************************************************************************
* SHRegSetPathA [SHLWAPI.@]
*
* Write a path to the registry.
*
* PARAMS
* hKey [I] Handle to registry key
* lpszSubKey [I] Name of sub key containing path to set
* lpszValue [I] Name of value containing path to set
* lpszPath [O] Path to write
* dwFlags [I] Reserved, must be 0.
*
* RETURNS
* Success: ERROR_SUCCESS.
* Failure: An error code from SHSetValueA().
*/
DWORD WINAPI SHRegSetPathA(HKEY hKey, LPCSTR lpszSubKey, LPCSTR lpszValue,
LPCSTR lpszPath, DWORD dwFlags)
{
char szBuff[MAX_PATH];
FIXME("(hkey=%p,%s,%s,%p,%d) - semi-stub\n",hKey, debugstr_a(lpszSubKey),
debugstr_a(lpszValue), lpszPath, dwFlags);
lstrcpyA(szBuff, lpszPath);
/* FIXME: PathUnExpandEnvStringsA(szBuff); */
return SHSetValueA(hKey,lpszSubKey, lpszValue, REG_SZ, szBuff,
lstrlenA(szBuff));
}
/*************************************************************************
* SHRegSetPathW [SHLWAPI.@]
*
* See SHRegSetPathA.
*/
DWORD WINAPI SHRegSetPathW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue,
LPCWSTR lpszPath, DWORD dwFlags)
{
WCHAR szBuff[MAX_PATH];
FIXME("(hkey=%p,%s,%s,%p,%d) - semi-stub\n",hKey, debugstr_w(lpszSubKey),
debugstr_w(lpszValue), lpszPath, dwFlags);
lstrcpyW(szBuff, lpszPath);
/* FIXME: PathUnExpandEnvStringsW(szBuff); */
return SHSetValueW(hKey,lpszSubKey, lpszValue, REG_SZ, szBuff,
lstrlenW(szBuff));
}
/*************************************************************************
* SHGetValueA [SHLWAPI.@]
*
* Get a value from the registry.
*
* PARAMS
* hKey [I] Handle to registry key
* lpszSubKey [I] Name of sub key containing value to get
* lpszValue [I] Name of value to get
* pwType [O] Pointer to the values type
* pvData [O] Pointer to the values data
* pcbData [O] Pointer to the values size
*
* RETURNS
* Success: ERROR_SUCCESS. Output parameters contain the details read.
* 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 = 0;
HKEY hSubKey = 0;
TRACE("(hkey=%p,%s,%s,%p,%p,%p)\n", hKey, debugstr_a(lpszSubKey),
debugstr_a(lpszValue), pwType, pvData, pcbData);
/* 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)
{
/* SHQueryValueEx expands Environment strings */
dwRet = SHQueryValueExA(hSubKey ? hSubKey : hKey, lpszValue, 0, pwType, pvData, pcbData);
if (hSubKey) RegCloseKey(hSubKey);
}
return dwRet;
}
/*************************************************************************
* SHRegGetValueA [SHLWAPI.@]
*
* Get a value from the registry.
*
* PARAMS
* hKey [I] Handle to registry key
* lpszSubKey [I] Name of sub key containing value to get
* lpszValue [I] Name of value to get
* srrf [I] Flags for restricting returned data
* pwType [O] Pointer to the values type
* pvData [O] Pointer to the values data
* pcbData [O] Pointer to the values size
*
* RETURNS
* Success: ERROR_SUCCESS. Output parameters contain the details read.
* Failure: An error code from RegOpenKeyExA() or SHQueryValueExA().
*/
DWORD WINAPI SHRegGetValueA(HKEY hKey, LPCSTR lpszSubKey, LPCSTR lpszValue, DWORD srrfFlags,
LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
{
DWORD dwRet = 0;
HKEY hSubKey = 0;
TRACE("(hkey=%p,%s,%s,%p,%p,%p)\n", hKey, debugstr_a(lpszSubKey),
debugstr_a(lpszValue), pwType, pvData, pcbData);
FIXME("Semi-Stub: Find meaning and implement handling of SRFF Flags 0x%08x\n", srrfFlags);
dwRet = RegOpenKeyExA(hKey, lpszSubKey, 0, KEY_QUERY_VALUE, &hSubKey);
if (! dwRet)
{
/* SHQueryValueEx expands Environment strings */
dwRet = SHQueryValueExA(hSubKey, lpszValue, 0, pwType, pvData, pcbData);
RegCloseKey(hSubKey);
}
return dwRet;
}
/*************************************************************************
* SHReg GetRegValueW [SHLWAPI.@]
*
* See SHGetValueA.
*/
DWORD WINAPI SHRegGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD srrfFlags,
LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
{
DWORD dwRet = 0;
HKEY hSubKey = 0;
TRACE("(hkey=%p,%s,%s,0x%08x, %p,%p,%p)\n", hKey, debugstr_w(lpszSubKey),
debugstr_w(lpszValue), srrfFlags,pwType, pvData, pcbData);
FIXME("Semi-Stub: Find meaning and implement handling of SRFF Flags 0x%08x\n", srrfFlags);
dwRet = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_QUERY_VALUE, &hSubKey);
if (! dwRet)
{
dwRet = SHQueryValueExW(hSubKey, lpszValue, 0, pwType, pvData, pcbData);
RegCloseKey(hSubKey);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -