1 /*
2 * PROJECT: ReactOS API tests
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Test for SHRestricted
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7
8 #include "shelltest.h"
9 #include <versionhelpers.h>
10
11 #define REGKEY_POLICIES L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies"
12 #define REGKEY_POLICIES_EXPLORER REGKEY_POLICIES L"\\Explorer"
13
14 typedef DWORD (WINAPI *FN_SHRestricted)(RESTRICTIONS rest);
15 typedef BOOL (WINAPI *FN_SHSettingsChanged)(LPCVOID unused, LPCVOID inpRegKey);
16
17 #define DELETE_VALUE(hBaseKey) \
18 SHDeleteValueW((hBaseKey), REGKEY_POLICIES_EXPLORER, L"NoRun")
19
20 #define SET_VALUE(hBaseKey, value) do { \
21 dwValue = (value); \
22 SHSetValueW((hBaseKey), REGKEY_POLICIES_EXPLORER, L"NoRun", \
23 REG_DWORD, &dwValue, sizeof(dwValue)); \
24 } while (0)
25
26 static VOID
TEST_SHRestricted(FN_SHRestricted fnGetValue,FN_SHSettingsChanged fnRefresh)27 TEST_SHRestricted(FN_SHRestricted fnGetValue, FN_SHSettingsChanged fnRefresh)
28 {
29 DWORD dwValue;
30
31 DELETE_VALUE(HKEY_CURRENT_USER);
32 DELETE_VALUE(HKEY_LOCAL_MACHINE);
33
34 fnRefresh(NULL, NULL);
35 ok_long(fnGetValue(REST_NORUN), 0);
36
37 SET_VALUE(HKEY_CURRENT_USER, 0);
38 DELETE_VALUE(HKEY_LOCAL_MACHINE);
39
40 ok_long(fnGetValue(REST_NORUN), 0);
41 fnRefresh(NULL, NULL);
42 ok_long(fnGetValue(REST_NORUN), 0);
43
44 SET_VALUE(HKEY_CURRENT_USER, 1);
45 DELETE_VALUE(HKEY_LOCAL_MACHINE);
46
47 ok_long(fnGetValue(REST_NORUN), 0);
48 fnRefresh(NULL, NULL);
49 ok_long(fnGetValue(REST_NORUN), 1);
50
51 DELETE_VALUE(HKEY_CURRENT_USER);
52 SET_VALUE(HKEY_LOCAL_MACHINE, 0);
53
54 ok_long(fnGetValue(REST_NORUN), 1);
55 fnRefresh(NULL, NULL);
56 ok_long(fnGetValue(REST_NORUN), 0);
57
58 DELETE_VALUE(HKEY_CURRENT_USER);
59 SET_VALUE(HKEY_LOCAL_MACHINE, 1);
60
61 ok_long(fnGetValue(REST_NORUN), 0);
62 fnRefresh(NULL, NULL);
63 ok_long(fnGetValue(REST_NORUN), 1);
64
65 SET_VALUE(HKEY_CURRENT_USER, 2);
66 SET_VALUE(HKEY_LOCAL_MACHINE, 1);
67
68 ok_long(fnGetValue(REST_NORUN), 1);
69 fnRefresh(NULL, NULL);
70 ok_long(fnGetValue(REST_NORUN), 1);
71
72 DELETE_VALUE(HKEY_CURRENT_USER);
73 DELETE_VALUE(HKEY_LOCAL_MACHINE);
74
75 ok_long(fnGetValue(REST_NORUN), 1);
76 fnRefresh(NULL, NULL);
77 ok_long(fnGetValue(REST_NORUN), 0);
78 }
79
START_TEST(SHRestricted)80 START_TEST(SHRestricted)
81 {
82 if (IsWindowsVistaOrGreater())
83 {
84 skip("Vista+");
85 return;
86 }
87
88 HMODULE hSHELL32 = LoadLibraryW(L"shell32.dll");
89 FN_SHRestricted fnGetValue;
90 FN_SHSettingsChanged fnRefresh;
91
92 fnGetValue = (FN_SHRestricted)GetProcAddress(hSHELL32, MAKEINTRESOURCEA(100));
93 fnRefresh = (FN_SHSettingsChanged)GetProcAddress(hSHELL32, MAKEINTRESOURCEA(244));
94
95 if (fnGetValue && fnRefresh)
96 {
97 TEST_SHRestricted(fnGetValue, fnRefresh);
98 }
99 else
100 {
101 if (!fnGetValue)
102 skip("SHRestricted not found\n");
103 if (!fnRefresh)
104 skip("SHSettingsChanged not found\n");
105 }
106
107 FreeLibrary(hSHELL32);
108 }
109