ReactOS 0.4.17-dev-439-g3d86d5e
zonechk.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Shell
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: Implementing ZoneCheck* functions (Internet Zone Manager)
5 * COPYRIGHT: Copyright 2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include <windef.h>
9#include <urlmon.h>
10#include <shlobj.h>
11#define NO_SHLWAPI_REG
12#include <shlwapi.h>
13#include <shlwapi_undoc.h>
14#include <wine/debug.h>
15
17
18static IClassFactory *g_pZoneMgrCF = NULL; /* Internet Zone Manager's Class Factory (cached) */
19CRITICAL_SECTION g_csZoneMgrLock; /* Guards g_pZoneMgrCF (ReactOS only) */
20static HINSTANCE g_hinstZoneMgr = NULL; /* The module of Zone Manager */
21
22static HRESULT
26{
27 HRESULT hr;
28 IClassFactory *pCF;
29
30 if (!g_pZoneMgrCF)
31 {
32 hr = CoGetClassObject(&CLSID_InternetSecurityManager, CLSCTX_INPROC_SERVER, NULL,
33 &IID_IClassFactory, (PVOID *)&pCF);
34 if (FAILED(hr))
35 {
36 *ppv = NULL;
37 return hr;
38 }
39
40 g_pZoneMgrCF = pCF;
41 g_hinstZoneMgr = SHPinDllOfCLSID(&CLSID_InternetSecurityManager);
42 }
43
45}
46
47/*************************************************************************
48 * SHLWAPI_GetCachedZonesManager
49 *
50 * An internal helper that caches the InternetSecurityManager's IClassFactory and
51 * returns an instance of the specified interface.
52 */
53static HRESULT
57{
58 HRESULT hr;
62 return hr;
63}
64
66{
68 if (g_pZoneMgrCF)
69 {
72 }
74 {
77 }
79}
80
81/*************************************************************************
82 * SuperPrivate_ZoneCheckPath
83 *
84 * An internal helper, used in SHRegisterValidateTemplate
85 */
87{
89 HRESULT hr = SHLWAPI_GetCachedZonesManager(&IID_IInternetSecurityManager, (PVOID *)&pISM);
90 if (FAILED(hr))
91 return E_ACCESSDENIED;
92
93 DWORD dwRealZone = URLZONE_UNTRUSTED;
94 hr = pISM->lpVtbl->MapUrlToZone(pISM, pszPath, &dwRealZone, 0);
95 if (SUCCEEDED(hr) && dwRealZone == dwExpectedZone)
96 hr = S_OK;
97 else
99
100 pISM->lpVtbl->Release(pISM);
101 return hr;
102}
103
104/*************************************************************************
105 * ZoneCheckUrlExCacheA [SHLWAPI.232]
106 */
109 _In_ PCSTR pszUrl,
110 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
111 _In_ DWORD cbPolicy,
112 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
113 _In_ DWORD cbContext,
114 _In_ DWORD dwAction,
116 _In_opt_ IInternetSecurityMgrSite *pSecuritySite,
118{
119 WCHAR szUrl[2048];
120 if (!pszUrl)
121 {
122 ERR("pszUrl was NULL\n");
123 return E_INVALIDARG;
124 }
125 SHAnsiToUnicode(pszUrl, szUrl, _countof(szUrl));
126 return ZoneCheckUrlExCacheW(szUrl, pbPolicy, cbPolicy, pbContext, cbContext,
127 dwAction, dwFlags, pSecuritySite, pISM);
128}
129
130/*************************************************************************
131 * ZoneCheckUrlExCacheW [SHLWAPI.233]
132 */
135 _In_ PCWSTR pszUrl,
136 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
137 _In_ DWORD cbPolicy,
138 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
139 _In_ DWORD cbContext,
140 _In_ DWORD dwAction,
142 _In_opt_ IInternetSecurityMgrSite *pSecuritySite,
144{
145 HRESULT hr;
146 IInternetSecurityManager *pWorkISM;
147 DWORD dwPolicyBuf, dwContextBuf;
148
149 if (!pszUrl)
150 {
151 ERR("pszUrl was NULL\n");
152 return E_INVALIDARG;
153 }
154
155 if (pISM && pISM->lpVtbl)
156 hr = pISM->lpVtbl->QueryInterface(pISM, &IID_IInternetSecurityManager, (PVOID *)&pWorkISM);
157 else
158 hr = SHLWAPI_GetCachedZonesManager(&IID_IInternetSecurityManager, (PVOID *)&pWorkISM);
159
160 if (FAILED(hr))
161 {
162 ERR("hr: 0x%lX\n", hr);
163 return hr;
164 }
165
166 if (pSecuritySite)
167 pWorkISM->lpVtbl->SetSecuritySite(pWorkISM, pSecuritySite);
168
169 if (!pbContext)
170 {
171 dwContextBuf = 0;
172 pbContext = (PBYTE)&dwContextBuf;
173 cbContext = sizeof(dwContextBuf);
174 }
175
176 if (!pbPolicy)
177 {
178 dwPolicyBuf = 0;
179 pbPolicy = (PBYTE)&dwPolicyBuf;
180 cbPolicy = sizeof(dwPolicyBuf);
181 }
182
183 hr = pWorkISM->lpVtbl->ProcessUrlAction(pWorkISM, pszUrl, dwAction, pbPolicy, cbPolicy,
184 pbContext, cbContext, dwFlags, 0);
185
186 if (pSecuritySite)
187 pWorkISM->lpVtbl->SetSecuritySite(pWorkISM, NULL);
188
189 pWorkISM->lpVtbl->Release(pWorkISM);
190 return hr;
191}
192
193/*************************************************************************
194 * ZoneCheckPathA [SHLWAPI.226]
195 */
198 _In_ PCSTR pszPath,
199 _In_ DWORD dwAction,
201 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
202{
203 WCHAR szPath[2048];
204 if (!pszPath)
205 {
206 ERR("pszPath was NULL\n");
207 return E_INVALIDARG;
208 }
210 return ZoneCheckPathW(szPath, dwAction, dwFlags, pSecuritySite);
211}
212
213/*************************************************************************
214 * ZoneCheckPathW [SHLWAPI.227]
215 */
218 _In_ PCWSTR pszPath,
219 _In_ DWORD dwAction,
221 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
222{
223 return ZoneCheckUrlW(pszPath, dwAction, dwFlags | PUAF_ISFILE, pSecuritySite);
224}
225
226/*************************************************************************
227 * ZoneCheckUrlA [SHLWAPI.228]
228 */
231 _In_ PCSTR pszUrl,
232 _In_ DWORD dwAction,
234 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
235{
236 WCHAR szUrl[2048];
237 if (!pszUrl)
238 {
239 ERR("pszUrl was NULL\n");
240 return E_INVALIDARG;
241 }
242 SHAnsiToUnicode(pszUrl, szUrl, _countof(szUrl));
243 return ZoneCheckUrlW(szUrl, dwAction, dwFlags, pSecuritySite);
244}
245
246/*************************************************************************
247 * ZoneCheckUrlW [SHLWAPI.229]
248 */
251 _In_ PCWSTR pszUrl,
252 _In_ DWORD dwAction,
254 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
255{
256 return ZoneCheckUrlExW(pszUrl, NULL, 0, NULL, 0, dwAction, dwFlags, pSecuritySite);
257}
258
259/*************************************************************************
260 * ZoneCheckUrlExA [SHLWAPI.230]
261 */
264 _In_ PCSTR pszUrl,
265 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
266 _In_ DWORD cbPolicy,
267 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
268 _In_ DWORD cbContext,
269 _In_ DWORD dwAction,
271 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
272{
273 WCHAR szUrl[2048];
274 if (!pszUrl)
275 {
276 ERR("pszUrl was NULL\n");
277 return E_INVALIDARG;
278 }
279 SHAnsiToUnicode(pszUrl, szUrl, _countof(szUrl));
280 return ZoneCheckUrlExW(szUrl, pbPolicy, cbPolicy, pbContext, cbContext,
281 dwAction, dwFlags, pSecuritySite);
282}
283
284/*************************************************************************
285 * ZoneCheckUrlExW [SHLWAPI.231]
286 */
289 _In_ PCWSTR pszUrl,
290 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
291 _In_ DWORD cbPolicy,
292 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
293 _In_ DWORD cbContext,
294 _In_ DWORD dwAction,
296 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
297{
298 return ZoneCheckUrlExCacheW(pszUrl, pbPolicy, cbPolicy, pbContext, cbContext,
299 dwAction, dwFlags, pSecuritySite, NULL);
300}
301
302/*************************************************************************
303 * ZoneCheckHost [SHLWAPI.234]
304 */
308 _In_ PCWSTR pszUrl,
309 _In_ DWORD dwAction)
310{
311 return ZoneCheckHostEx(pISM, NULL, 0, NULL, 0, pszUrl, dwAction);
312}
313
314/*************************************************************************
315 * ZoneCheckHostEx [SHLWAPI.235]
316 */
320 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
321 _In_ DWORD cbPolicy,
322 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
323 _In_ DWORD cbContext,
324 _In_ PCWSTR pszUrl,
325 _In_ DWORD dwAction)
326{
327 DWORD dwPolicyBuf, dwContextBuf;
328
329 if (!pISM || !pszUrl)
330 return E_INVALIDARG;
331
332 if (!pbPolicy)
333 {
334 dwPolicyBuf = 0;
335 pbPolicy = (PBYTE)&dwPolicyBuf;
336 cbPolicy = sizeof(dwPolicyBuf);
337 }
338
339 if (!pbContext)
340 {
341 dwContextBuf = 0;
342 pbContext = (PBYTE)&dwContextBuf;
343 cbContext = sizeof(dwContextBuf);
344 }
345
346 return pISM->lpVtbl->ProcessUrlAction(pISM, pszUrl, dwAction, pbPolicy, cbPolicy,
347 pbContext, cbContext, 0, 0);
348}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ERR(fmt,...)
Definition: precomp.h:57
#define EXTERN_C
Definition: basetyps.h:12
const GUID IID_IClassFactory
#define E_INVALIDARG
Definition: ddrawi.h:101
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
HRESULT WINAPI DECLSPEC_HOTPATCH CoGetClassObject(REFCLSID rclsid, DWORD clscontext, COSERVERINFO *server_info, REFIID riid, void **obj)
Definition: combase.c:1925
#define FreeLibrary(x)
Definition: compat.h:748
DWORD WINAPI SHAnsiToUnicode(const char *src, WCHAR *dest, int dest_len)
Definition: main.c:1801
HMODULE WINAPI SHPinDllOfCLSID(REFIID refiid)
Definition: ordinal.c:2173
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT CreateInstance([in, unique] IUnknown *pUnkOuter, [in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
HRESULT ProcessUrlAction([in] LPCWSTR pwszUrl, [in] DWORD dwAction, [out, size_is(cbPolicy)] BYTE *pPolicy, [in] DWORD cbPolicy, [in, unique] BYTE *pContext, [in] DWORD cbContext, [in] DWORD dwFlags, [in] DWORD dwReserved)
HRESULT SetSecuritySite([in, unique] IInternetSecurityMgrSite *pSite)
HRESULT MapUrlToZone([in] LPCWSTR pwszUrl, [out] DWORD *pdwZone, [in] DWORD dwFlags)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
LPCWSTR szPath
Definition: env.c:37
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define _Out_writes_bytes_opt_(s)
Definition: no_sal2.h:228
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define _In_reads_bytes_opt_(s)
Definition: no_sal2.h:224
BYTE * PBYTE
Definition: pedump.c:66
short WCHAR
Definition: pedump.c:58
#define REFIID
Definition: guiddef.h:118
#define _countof(array)
Definition: sndvol32.h:70
const uint16_t * PCWSTR
Definition: typedefs.h:57
const char * PCSTR
Definition: typedefs.h:52
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6
#define E_ACCESSDENIED
Definition: winerror.h:4116
static HRESULT SHLWAPI_GetCachedZonesManager(_In_ REFIID riid, _Out_ PVOID *ppv)
Definition: zonechk.c:54
HRESULT WINAPI ZoneCheckUrlExCacheA(_In_ PCSTR pszUrl, _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy, _In_ DWORD cbPolicy, _In_reads_bytes_opt_(cbContext) PBYTE pbContext, _In_ DWORD cbContext, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite, _In_opt_ IInternetSecurityManager *pISM)
Definition: zonechk.c:108
HRESULT WINAPI ZoneCheckPathW(_In_ PCWSTR pszPath, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:217
HRESULT WINAPI ZoneCheckUrlExW(_In_ PCWSTR pszUrl, _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy, _In_ DWORD cbPolicy, _In_reads_bytes_opt_(cbContext) PBYTE pbContext, _In_ DWORD cbContext, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:288
HRESULT WINAPI ZoneCheckUrlA(_In_ PCSTR pszUrl, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:230
static HINSTANCE g_hinstZoneMgr
Definition: zonechk.c:20
EXTERN_C VOID SHLWAPI_DeleteCachedZonesManager(VOID)
Definition: zonechk.c:65
HRESULT WINAPI ZoneCheckHostEx(_In_ IInternetSecurityManager *pISM, _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy, _In_ DWORD cbPolicy, _In_reads_bytes_opt_(cbContext) PBYTE pbContext, _In_ DWORD cbContext, _In_ PCWSTR pszUrl, _In_ DWORD dwAction)
Definition: zonechk.c:318
HRESULT WINAPI ZoneCheckPathA(_In_ PCSTR pszPath, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:197
static IClassFactory * g_pZoneMgrCF
Definition: zonechk.c:18
CRITICAL_SECTION g_csZoneMgrLock
Definition: zonechk.c:19
static HRESULT SHLWAPI_GetCachedZonesManagerInner(_In_ REFIID riid, _Out_ PVOID *ppv)
Definition: zonechk.c:23
HRESULT WINAPI ZoneCheckUrlW(_In_ PCWSTR pszUrl, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:250
HRESULT WINAPI ZoneCheckUrlExA(_In_ PCSTR pszUrl, _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy, _In_ DWORD cbPolicy, _In_reads_bytes_opt_(cbContext) PBYTE pbContext, _In_ DWORD cbContext, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:263
HRESULT SuperPrivate_ZoneCheckPath(PCWSTR pszPath, DWORD dwExpectedZone)
Definition: zonechk.c:86
HRESULT WINAPI ZoneCheckUrlExCacheW(_In_ PCWSTR pszUrl, _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy, _In_ DWORD cbPolicy, _In_reads_bytes_opt_(cbContext) PBYTE pbContext, _In_ DWORD cbContext, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite, _In_opt_ IInternetSecurityManager *pISM)
Definition: zonechk.c:134
HRESULT WINAPI ZoneCheckHost(_In_ IInternetSecurityManager *pISM, _In_ PCWSTR pszUrl, _In_ DWORD dwAction)
Definition: zonechk.c:306