You did not commit that, Joachim Henze did. On Mon, 17 Dec 2018 at 22:28, katahiromz <katayama.hirofumi...@gmail.com> wrote:
> Schweitzer, > > I will revert it tomorrow. > Sorry for inconvenience. > > Best regards > 片山博文MZ > > 2018年12月18日(火) 6:19、Pierre Schweitzer さん(pie...@reactos.org)のメッセージ: > >> 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=6f8cb05cad142a8679872e695f317dc1f9728d55 >> > >> > commit 6f8cb05cad142a8679872e695f317dc1f9728d55 >> > Author: Joachim Henze <joachim.he...@reactos.org> >> > AuthorDate: Mon Dec 17 22:01:49 2018 +0100 >> > Commit: Joachim Henze <joachim.he...@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 ( aria...@xs4all.nl) >> > + * Thomas Weidenmueller <w3s...@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@reactos.org >> http://reactos.org/mailman/listinfo/ros-dev > > _______________________________________________ > Ros-dev mailing list > Ros-dev@reactos.org > http://reactos.org/mailman/listinfo/ros-dev
_______________________________________________ Ros-dev mailing list Ros-dev@reactos.org http://reactos.org/mailman/listinfo/ros-dev