Schweitzer,
I will revert it tomorrow.
Sorry for inconvenience.
Best regards
片山博文MZ
2018年12月18日(火) 6:19、Pierre Schweitzer さん(pierre(a)reactos.xn--org)-8c4c2qua7d5ouj:
Hi,
I definitely don't like that commit, nor appreciate the way it was done.
If we read CORE-15412 carefully, we have three developers (namely:
Thomas, Mark, Giannis) expressing that they are again this revert, and
thus this commit.
Then, why was it pushed to HEAD?
Cheers,
Pierre
Le 17/12/2018 à 22:02, Joachim Henze a écrit :
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6f8cb05cad142a8679872…
> commit
6f8cb05cad142a8679872e695f317dc1f9728d55
> Author: Joachim Henze <Joachim.Henze(a)reactos.org>
> AuthorDate: Mon Dec 17 22:01:49 2018 +0100
> Commit: Joachim Henze <Joachim.Henze(a)reactos.org>
> CommitDate: Mon Dec 17 22:01:49 2018 +0100
> [DESK][SHELL32] Allow Desk.cpl to
run standalone on WinXP/2003 again
CORE-15412
> addendum to 0.4.10-dev-502-g
> d559ca9c982f9766acc5db3ea887ef2bc27acdff
> That copy-paste was done once
intentionally to keep our imports
similar to 2003.
It's worth reading the conversation in PR
#748: Getequ seems to be
ok with this.
> The ideal solution most likely
would be to instead *statically*
> link against RegLoadMUIStringW() from advapi32_vista when
WINNT=0x502.
For now the stuff runs again at least.
I left the func existing in advapi32_vista.dll.
---
dll/cpl/desk/CMakeLists.txt | 6 +-
dll/cpl/desk/desk.h | 9 ++
dll/cpl/desk/muireg.c | 144 ++++++++++++++++++++++++++
dll/win32/shell32/CMakeLists.txt | 3 +-
dll/win32/shell32/vista.c | 218
+++++++++++++++++++++++++++++++++++++++
> 5 files changed, 375 insertions(+), 5 deletions(-)
> diff --git
a/dll/cpl/desk/CMakeLists.txt b/dll/cpl/desk/CMakeLists.txt
> index 24d9bb1e60..ae7fb83825 100644
> --- a/dll/cpl/desk/CMakeLists.txt
> +++ b/dll/cpl/desk/CMakeLists.txt
> @@ -2,9 +2,6 @@
> add_definitions(-D_WIN32)
> spec2def(desk.cpl desk.spec)
>
-remove_definitions(-D_WIN32_WINNT=0x502)
> -add_definitions(-D_WIN32_WINNT=0x600)
> -
> list(APPEND SOURCE
> advmon.c
> appearance.c
> @@ -23,6 +20,7 @@ list(APPEND SOURCE
> general.c
> draw.c
> theme.c
> + muireg.c
> desk.h)
> file(GLOB desk_rc_deps
resources/*.*)
> @@ -36,6 +34,6 @@ add_library(desk SHARED
> set_module_type(desk cpl UNICODE)
> target_link_libraries(desk uuid)
> -add_importlibs(desk user32 advapi32 advapi32_vista gdi32 comctl32
comdlg32 ole32 setupapi shell32 shlwapi uxtheme gdiplus msvcrt kernel32
ntdll)
+add_importlibs(desk user32 advapi32 gdi32
comctl32 comdlg32 ole32
setupapi shell32 shlwapi uxtheme gdiplus msvcrt kernel32
ntdll)
add_pch(desk desk.h SOURCE)
add_cd_file(TARGET desk DESTINATION reactos/system32 FOR all)
diff --git a/dll/cpl/desk/desk.h b/dll/cpl/desk/desk.h
index 3bb02f3a74..3c479251cf 100644
--- a/dll/cpl/desk/desk.h
+++ b/dll/cpl/desk/desk.h
@@ -122,4 +122,13 @@ HPSXA WINAPI
SHCreatePropSheetExtArrayEx(HKEY,LPCWSTR,UINT,IDataObject*);
INT_PTR CALLBACK
AdvGeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
lParam);
> +LONG
> +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);
> +
> #endif /* _DESK_H */
> diff --git a/dll/cpl/desk/muireg.c b/dll/cpl/desk/muireg.c
> new file mode 100644
> index 0000000000..8754b43655
> --- /dev/null
> +++ b/dll/cpl/desk/muireg.c
> @@ -0,0 +1,144 @@
> +#include "desk.h"
> +
+/******************************************************************************
+ * 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
+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;
+}
diff --git a/dll/win32/shell32/CMakeLists.txt
b/dll/win32/shell32/CMakeLists.txt
index 08933dda35..78ee1af531 100644
--- a/dll/win32/shell32/CMakeLists.txt
+++ b/dll/win32/shell32/CMakeLists.txt
@@ -102,6 +102,7 @@ add_library(shell32 SHARED
wine/shellstring.c
wine/shlmenu.c
wine/shpolicy.c
+ vista.c
shell32.rc
${CMAKE_CURRENT_BINARY_DIR}/shell32_stubs.c
${CMAKE_CURRENT_BINARY_DIR}/shell32.def)
@@ -113,7 +114,7 @@ set_source_files_properties(shell32.rc PROPERTIES
OBJECT_DEPENDS ${CMAKE_CURRENT
set_module_type(shell32 win32dll UNICODE)
target_link_libraries(shell32 shellmenu shelldesktop atlnew wine uuid
recyclebin)
add_delay_importlibs(shell32 powrprof shdocvw
devmgr winspool.drv winmm
mpr uxtheme ole32 oleaut32 userenv browseui version
fmifs)
-add_importlibs(shell32 advapi32 advapi32_vista
gdi32 user32 comctl32
comdlg32 shlwapi msvcrt kernel32 ntdll)
+add_importlibs(shell32 advapi32 gdi32 user32
comctl32 comdlg32 shlwapi
msvcrt kernel32 ntdll)
add_dependencies(shell32 stdole2) #
shell32_shldisp.tlb needs
stdole2.tlb
> add_pch(shell32 precomp.h SOURCE)
> add_cd_file(TARGET shell32 DESTINATION reactos/system32 FOR all)
> diff --git a/dll/win32/shell32/vista.c b/dll/win32/shell32/vista.c
> new file mode 100644
> index 0000000000..9f1a8335a3
> --- /dev/null
> +++ b/dll/win32/shell32/vista.c
> @@ -0,0 +1,218 @@
> +/*
> + * 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
> + */
> +
> +#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;
> +}
--
Pierre Schweitzer <pierre at reactos.org>
System & Network Administrator
Senior Kernel Developer
ReactOS Deutschland e.V.
_______________________________________________
Ros-dev mailing list
Ros-dev(a)reactos.org
http://reactos.org/mailman/listinfo/ros-dev