From b944563c7bba2f0700dca448c0cfe35e6fb5e8ff Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Thu, 29 Feb 2024 20:26:01 +0900 Subject: [PATCH] [SHELL32_APITEST] Add SHRestricted testcase (#6558) I have a plan to implement shell32!SHRestricted correctly. JIRA issue: CORE-11515 - Get SHRestricted and SHSettingsChanged procedures from shell32.dll. - Use them and check the results. --- .../rostests/apitests/shell32/CMakeLists.txt | 1 + .../apitests/shell32/SHRestricted.cpp | 108 ++++++++++++++++++ modules/rostests/apitests/shell32/testlist.c | 3 + 3 files changed, 112 insertions(+) create mode 100644 modules/rostests/apitests/shell32/SHRestricted.cpp diff --git a/modules/rostests/apitests/shell32/CMakeLists.txt b/modules/rostests/apitests/shell32/CMakeLists.txt index 0c62b2ed6a0..da5c512640e 100644 --- a/modules/rostests/apitests/shell32/CMakeLists.txt +++ b/modules/rostests/apitests/shell32/CMakeLists.txt @@ -28,6 +28,7 @@ list(APPEND SOURCE SHCreateFileDataObject.cpp SHCreateFileExtractIconW.cpp SHParseDisplayName.cpp + SHRestricted.cpp She.cpp ShellExecCmdLine.cpp ShellExecuteEx.cpp diff --git a/modules/rostests/apitests/shell32/SHRestricted.cpp b/modules/rostests/apitests/shell32/SHRestricted.cpp new file mode 100644 index 00000000000..3a3f18081c0 --- /dev/null +++ b/modules/rostests/apitests/shell32/SHRestricted.cpp @@ -0,0 +1,108 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) + * PURPOSE: Test for SHRestricted + * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) + */ + +#include "shelltest.h" +#include + +#define REGKEY_POLICIES L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies" +#define REGKEY_POLICIES_EXPLORER REGKEY_POLICIES L"\\Explorer" + +typedef DWORD (WINAPI *FN_SHRestricted)(RESTRICTIONS rest); +typedef BOOL (WINAPI *FN_SHSettingsChanged)(LPCVOID unused, LPCVOID inpRegKey); + +#define DELETE_VALUE(hBaseKey) \ + SHDeleteValueW((hBaseKey), REGKEY_POLICIES_EXPLORER, L"NoRun") + +#define SET_VALUE(hBaseKey, value) do { \ + dwValue = (value); \ + SHSetValueW((hBaseKey), REGKEY_POLICIES_EXPLORER, L"NoRun", \ + REG_DWORD, &dwValue, sizeof(dwValue)); \ +} while (0) + +static VOID +TEST_SHRestricted(FN_SHRestricted fnGetValue, FN_SHSettingsChanged fnRefresh) +{ + DWORD dwValue; + + DELETE_VALUE(HKEY_CURRENT_USER); + DELETE_VALUE(HKEY_LOCAL_MACHINE); + + fnRefresh(NULL, NULL); + ok_long(fnGetValue(REST_NORUN), 0); + + SET_VALUE(HKEY_CURRENT_USER, 0); + DELETE_VALUE(HKEY_LOCAL_MACHINE); + + ok_long(fnGetValue(REST_NORUN), 0); + fnRefresh(NULL, NULL); + ok_long(fnGetValue(REST_NORUN), 0); + + SET_VALUE(HKEY_CURRENT_USER, 1); + DELETE_VALUE(HKEY_LOCAL_MACHINE); + + ok_long(fnGetValue(REST_NORUN), 0); + fnRefresh(NULL, NULL); + ok_long(fnGetValue(REST_NORUN), 1); + + DELETE_VALUE(HKEY_CURRENT_USER); + SET_VALUE(HKEY_LOCAL_MACHINE, 0); + + ok_long(fnGetValue(REST_NORUN), 1); + fnRefresh(NULL, NULL); + ok_long(fnGetValue(REST_NORUN), 0); + + DELETE_VALUE(HKEY_CURRENT_USER); + SET_VALUE(HKEY_LOCAL_MACHINE, 1); + + ok_long(fnGetValue(REST_NORUN), 0); + fnRefresh(NULL, NULL); + ok_long(fnGetValue(REST_NORUN), 1); + + SET_VALUE(HKEY_CURRENT_USER, 2); + SET_VALUE(HKEY_LOCAL_MACHINE, 1); + + ok_long(fnGetValue(REST_NORUN), 1); + fnRefresh(NULL, NULL); + ok_long(fnGetValue(REST_NORUN), 1); + + DELETE_VALUE(HKEY_CURRENT_USER); + DELETE_VALUE(HKEY_LOCAL_MACHINE); + + ok_long(fnGetValue(REST_NORUN), 1); + fnRefresh(NULL, NULL); + ok_long(fnGetValue(REST_NORUN), 0); +} + +START_TEST(SHRestricted) +{ + if (IsWindowsVistaOrGreater()) + { + skip("Vista+"); + return; + } + + HMODULE hSHELL32 = LoadLibraryW(L"shell32.dll"); + FN_SHRestricted fnGetValue; + FN_SHSettingsChanged fnRefresh; + + fnGetValue = (FN_SHRestricted)GetProcAddress(hSHELL32, MAKEINTRESOURCEA(100)); + fnRefresh = (FN_SHSettingsChanged)GetProcAddress(hSHELL32, MAKEINTRESOURCEA(244)); + + if (fnGetValue && fnRefresh) + { + TEST_SHRestricted(fnGetValue, fnRefresh); + } + else + { + if (!fnGetValue) + skip("SHRestricted not found\n"); + if (!fnRefresh) + skip("SHSettingsChanged not found\n"); + } + + FreeLibrary(hSHELL32); +} diff --git a/modules/rostests/apitests/shell32/testlist.c b/modules/rostests/apitests/shell32/testlist.c index 265f58a5e83..8e9d64cf5f6 100644 --- a/modules/rostests/apitests/shell32/testlist.c +++ b/modules/rostests/apitests/shell32/testlist.c @@ -38,6 +38,7 @@ extern void func_ShellState(void); extern void func_SHGetAttributesFromDataObject(void); extern void func_SHLimitInputEdit(void); extern void func_SHParseDisplayName(void); +extern void func_SHRestricted(void); const struct test winetest_testlist[] = { @@ -76,5 +77,7 @@ const struct test winetest_testlist[] = { "SHGetAttributesFromDataObject", func_SHGetAttributesFromDataObject }, { "SHLimitInputEdit", func_SHLimitInputEdit }, { "SHParseDisplayName", func_SHParseDisplayName }, + { "SHRestricted", func_SHRestricted }, + { 0, 0 } };