Author: akhaldi
Date: Sun Jun 8 17:51:38 2014
New Revision: 63561
URL:
http://svn.reactos.org/svn/reactos?rev=63561&view=rev
Log:
[SHELL32]
* Introduce vista.c to copy RegLoadMUIString related functions. If you think you're
having a deja-vu, you are (r58809).
* Use SHCopyKeyW instead of RegCopyTreeW and mark that it doesn't copy the security
attributes of the keys.
CORE-8174
Added:
trunk/reactos/dll/win32/shell32/vista.c (with props)
Modified:
trunk/reactos/dll/win32/shell32/CMakeLists.txt
trunk/reactos/dll/win32/shell32/openwithmenu.cpp
Modified: trunk/reactos/dll/win32/shell32/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/CMakeLis…
==============================================================================
--- trunk/reactos/dll/win32/shell32/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/CMakeLists.txt [iso-8859-1] Sun Jun 8 17:51:38 2014
@@ -77,6 +77,7 @@
add_library(shell32 SHARED
${SOURCE}
+ vista.c
shell32.rc
${CMAKE_CURRENT_BINARY_DIR}/shell32_stubs.c
${CMAKE_CURRENT_BINARY_DIR}/shell32.def)
Modified: trunk/reactos/dll/win32/shell32/openwithmenu.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/openwith…
==============================================================================
--- trunk/reactos/dll/win32/shell32/openwithmenu.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/openwithmenu.cpp [iso-8859-1] Sun Jun 8 17:51:38
2014
@@ -754,14 +754,15 @@
}
/* Copy static verbs from Classes\Applications key */
- LONG Result = RegCopyTreeW(hSrcKey, NULL, hDestKey);
+ /* FIXME: SHCopyKey does not copy the security attributes of the keys */
+ LSTATUS Result = SHCopyKeyW(hSrcKey, NULL, hDestKey, 0);
RegCloseKey(hDestKey);
RegCloseKey(hSrcKey);
RegCloseKey(hKey);
if (Result != ERROR_SUCCESS)
{
- ERR("RegCopyTreeW failed\n");
+ ERR("SHCopyKeyW failed\n");
return FALSE;
}
Added: trunk/reactos/dll/win32/shell32/vista.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/vista.c?…
==============================================================================
--- trunk/reactos/dll/win32/shell32/vista.c (added)
+++ trunk/reactos/dll/win32/shell32/vista.c [iso-8859-1] Sun Jun 8 17:51:38 2014
@@ -0,0 +1,220 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS system libraries
+ * FILE: Copied from advapi32/reg/reg.c
+ * PURPOSE: Registry functions
+ * PROGRAMMER: Ariadne ( ariadne(a)xs4all.nl)
+ * Thomas Weidenmueller <w3seek(a)reactos.com>
+ * UPDATE HISTORY:
+ * Created 01/11/98
+ * 19990309 EA Stubs
+ * 20050502 Fireball imported some stuff from WINE
+ */
+
+/* FIXME: This file should go away once we properly handle Vista+ APIs */
+
+#include <stdarg.h>
+
+#define WIN32_NO_STATUS
+#define _INC_WINDOWS
+#define COM_NO_WINDOWS_H
+
+#include <windef.h>
+#include <winbase.h>
+#include <winreg.h>
+#include <winuser.h>
+#define NTOS_MODE_USER
+#include <ndk/rtlfuncs.h>
+
+#include <wine/debug.h>
+#include <wine/unicode.h>
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
+
+/******************************************************************************
+ * load_string [Internal]
+ *
+ * This is basically a copy of user32/resource.c's LoadStringW. Necessary to
+ * avoid importing user32, which is higher level than advapi32. Helper for
+ * RegLoadMUIString.
+ */
+static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
+{
+ HGLOBAL hMemory;
+ HRSRC hResource;
+ WCHAR *pString;
+ int idxString;
+
+ /* Negative values have to be inverted. */
+ if (HIWORD(resId) == 0xffff)
+ resId = (UINT)(-((INT)resId));
+
+ /* Load the resource into memory and get a pointer to it. */
+ hResource = FindResourceW(hModule, MAKEINTRESOURCEW(LOWORD(resId >> 4) + 1),
(LPWSTR)RT_STRING);
+ if (!hResource) return 0;
+ hMemory = LoadResource(hModule, hResource);
+ if (!hMemory) return 0;
+ pString = LockResource(hMemory);
+
+ /* Strings are length-prefixed. Lowest nibble of resId is an index. */
+ idxString = resId & 0xf;
+ while (idxString--) pString += *pString + 1;
+
+ /* If no buffer is given, return length of the string. */
+ if (!pwszBuffer) return *pString;
+
+ /* Else copy over the string, respecting the buffer size. */
+ cMaxChars = (*pString < cMaxChars) ? *pString : (cMaxChars - 1);
+ if (cMaxChars >= 0)
+ {
+ memcpy(pwszBuffer, pString+1, cMaxChars * sizeof(WCHAR));
+ pwszBuffer[cMaxChars] = L'\0';
+ }
+
+ return cMaxChars;
+}
+
+/************************************************************************
+ * RegLoadMUIStringW
+ *
+ * @implemented
+ */
+LONG WINAPI
+RegLoadMUIStringW(IN HKEY hKey,
+ IN LPCWSTR pszValue OPTIONAL,
+ OUT LPWSTR pszOutBuf,
+ IN DWORD cbOutBuf,
+ OUT LPDWORD pcbData OPTIONAL,
+ IN DWORD Flags,
+ IN LPCWSTR pszDirectory OPTIONAL)
+{
+ DWORD dwValueType, cbData;
+ LPWSTR pwszTempBuffer = NULL, pwszExpandedBuffer = NULL;
+ LONG result;
+
+ /* Parameter sanity checks. */
+ if (!hKey || !pszOutBuf)
+ return ERROR_INVALID_PARAMETER;
+
+ if (pszDirectory && *pszDirectory)
+ {
+ FIXME("BaseDir parameter not yet supported!\n");
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ /* Check for value existence and correctness of it's type, allocate a buffer and
load it. */
+ result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType, NULL,
&cbData);
+ if (result != ERROR_SUCCESS) goto cleanup;
+ if (!(dwValueType == REG_SZ || dwValueType == REG_EXPAND_SZ) || !cbData)
+ {
+ result = ERROR_FILE_NOT_FOUND;
+ goto cleanup;
+ }
+ pwszTempBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
+ if (!pwszTempBuffer)
+ {
+ result = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
+ }
+ result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType,
(LPBYTE)pwszTempBuffer, &cbData);
+ if (result != ERROR_SUCCESS) goto cleanup;
+
+ /* Expand environment variables, if appropriate, or copy the original string over.
*/
+ if (dwValueType == REG_EXPAND_SZ)
+ {
+ cbData = ExpandEnvironmentStringsW(pwszTempBuffer, NULL, 0) * sizeof(WCHAR);
+ if (!cbData) goto cleanup;
+ pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
+ if (!pwszExpandedBuffer)
+ {
+ result = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
+ }
+ ExpandEnvironmentStringsW(pwszTempBuffer, pwszExpandedBuffer, cbData);
+ }
+ else
+ {
+ pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
+ memcpy(pwszExpandedBuffer, pwszTempBuffer, cbData);
+ }
+
+ /* If the value references a resource based string, parse the value and load the
string.
+ * Else just copy over the original value. */
+ result = ERROR_SUCCESS;
+ if (*pwszExpandedBuffer != L'@') /* '@' is the prefix for resource
based string entries. */
+ {
+ lstrcpynW(pszOutBuf, pwszExpandedBuffer, cbOutBuf / sizeof(WCHAR));
+ }
+ else
+ {
+ WCHAR *pComma = wcsrchr(pwszExpandedBuffer, L',');
+ UINT uiStringId;
+ HMODULE hModule;
+
+ /* Format of the expanded value is 'path_to_dll,-resId' */
+ if (!pComma || pComma[1] != L'-')
+ {
+ result = ERROR_BADKEY;
+ goto cleanup;
+ }
+
+ uiStringId = _wtoi(pComma+2);
+ *pComma = L'\0';
+
+ hModule = LoadLibraryExW(pwszExpandedBuffer + 1, NULL,
LOAD_LIBRARY_AS_DATAFILE);
+ if (!hModule || !load_string(hModule, uiStringId, pszOutBuf, cbOutBuf /
sizeof(WCHAR)))
+ result = ERROR_BADKEY;
+ FreeLibrary(hModule);
+ }
+
+cleanup:
+ HeapFree(GetProcessHeap(), 0, pwszTempBuffer);
+ HeapFree(GetProcessHeap(), 0, pwszExpandedBuffer);
+ return result;
+}
+
+/************************************************************************
+ * RegLoadMUIStringA
+ *
+ * @implemented
+ */
+LONG WINAPI
+RegLoadMUIStringA(IN HKEY hKey,
+ IN LPCSTR pszValue OPTIONAL,
+ OUT LPSTR pszOutBuf,
+ IN DWORD cbOutBuf,
+ OUT LPDWORD pcbData OPTIONAL,
+ IN DWORD Flags,
+ IN LPCSTR pszDirectory OPTIONAL)
+{
+ UNICODE_STRING valueW, baseDirW;
+ WCHAR *pwszBuffer;
+ DWORD cbData = cbOutBuf * sizeof(WCHAR);
+ LONG result;
+
+ valueW.Buffer = baseDirW.Buffer = pwszBuffer = NULL;
+ if (!RtlCreateUnicodeStringFromAsciiz(&valueW, pszValue) ||
+ !RtlCreateUnicodeStringFromAsciiz(&baseDirW, pszDirectory) ||
+ !(pwszBuffer = HeapAlloc(GetProcessHeap(), 0, cbData)))
+ {
+ result = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
+ }
+
+ result = RegLoadMUIStringW(hKey, valueW.Buffer, pwszBuffer, cbData, NULL, Flags,
+ baseDirW.Buffer);
+
+ if (result == ERROR_SUCCESS)
+ {
+ cbData = WideCharToMultiByte(CP_ACP, 0, pwszBuffer, -1, pszOutBuf, cbOutBuf,
NULL, NULL);
+ if (pcbData)
+ *pcbData = cbData;
+ }
+
+cleanup:
+ HeapFree(GetProcessHeap(), 0, pwszBuffer);
+ RtlFreeUnicodeString(&baseDirW);
+ RtlFreeUnicodeString(&valueW);
+
+ return result;
+}
Propchange: trunk/reactos/dll/win32/shell32/vista.c
------------------------------------------------------------------------------
svn:eol-style = native