ReactOS 0.4.17-dev-0-g129ef35
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_undoc.h>
13#include <wine/debug.h>
14
16
17static IClassFactory *g_pZoneMgrCF = NULL; /* Internet Zone Manager's Class Factory (cached) */
18CRITICAL_SECTION g_csZoneMgrLock; /* Guards g_pZoneMgrCF (ReactOS only) */
19static HINSTANCE g_hinstZoneMgr = NULL; /* The module of Zone Manager */
20
21static HRESULT
25{
26 HRESULT hr;
27 IClassFactory *pCF;
28
29 if (!g_pZoneMgrCF)
30 {
31 hr = CoGetClassObject(&CLSID_InternetSecurityManager, CLSCTX_INPROC_SERVER, NULL,
32 &IID_IClassFactory, (PVOID *)&pCF);
33 if (FAILED(hr))
34 {
35 *ppv = NULL;
36 return hr;
37 }
38
39 g_pZoneMgrCF = pCF;
40 g_hinstZoneMgr = SHPinDllOfCLSID(&CLSID_InternetSecurityManager);
41 }
42
44}
45
46/*************************************************************************
47 * SHLWAPI_GetCachedZonesManager
48 *
49 * An internal helper that caches the InternetSecurityManager's IClassFactory and
50 * returns an instance of the specified interface.
51 */
52static HRESULT
56{
57 HRESULT hr;
61 return hr;
62}
63
65{
67 if (g_pZoneMgrCF)
68 {
71 }
73 {
76 }
78}
79
80/*************************************************************************
81 * SuperPrivate_ZoneCheckPath
82 *
83 * An internal helper, used in SHRegisterValidateTemplate
84 */
86{
88 HRESULT hr = SHLWAPI_GetCachedZonesManager(&IID_IInternetSecurityManager, (PVOID *)&pISM);
89 if (FAILED(hr))
90 return E_ACCESSDENIED;
91
92 DWORD dwRealZone = URLZONE_UNTRUSTED;
93 hr = pISM->lpVtbl->MapUrlToZone(pISM, pszPath, &dwRealZone, 0);
94 if (SUCCEEDED(hr) && dwRealZone == dwExpectedZone)
95 hr = S_OK;
96 else
98
99 pISM->lpVtbl->Release(pISM);
100 return hr;
101}
102
103/*************************************************************************
104 * ZoneCheckUrlExCacheA [SHLWAPI.232]
105 */
108 _In_ PCSTR pszUrl,
109 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
110 _In_ DWORD cbPolicy,
111 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
112 _In_ DWORD cbContext,
113 _In_ DWORD dwAction,
115 _In_opt_ IInternetSecurityMgrSite *pSecuritySite,
117{
118 WCHAR szUrl[2048];
119 if (!pszUrl)
120 {
121 ERR("pszUrl was NULL\n");
122 return E_INVALIDARG;
123 }
124 SHAnsiToUnicode(pszUrl, szUrl, _countof(szUrl));
125 return ZoneCheckUrlExCacheW(szUrl, pbPolicy, cbPolicy, pbContext, cbContext,
126 dwAction, dwFlags, pSecuritySite, pISM);
127}
128
129/*************************************************************************
130 * ZoneCheckUrlExCacheW [SHLWAPI.233]
131 */
134 _In_ PCWSTR pszUrl,
135 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
136 _In_ DWORD cbPolicy,
137 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
138 _In_ DWORD cbContext,
139 _In_ DWORD dwAction,
141 _In_opt_ IInternetSecurityMgrSite *pSecuritySite,
143{
144 HRESULT hr;
145 IInternetSecurityManager *pWorkISM;
146 DWORD dwPolicyBuf, dwContextBuf;
147
148 if (!pszUrl)
149 {
150 ERR("pszUrl was NULL\n");
151 return E_INVALIDARG;
152 }
153
154 if (pISM && pISM->lpVtbl)
155 hr = pISM->lpVtbl->QueryInterface(pISM, &IID_IInternetSecurityManager, (PVOID *)&pWorkISM);
156 else
157 hr = SHLWAPI_GetCachedZonesManager(&IID_IInternetSecurityManager, (PVOID *)&pWorkISM);
158
159 if (FAILED(hr))
160 {
161 ERR("hr: 0x%lX\n", hr);
162 return hr;
163 }
164
165 if (pSecuritySite)
166 pWorkISM->lpVtbl->SetSecuritySite(pWorkISM, pSecuritySite);
167
168 if (!pbContext)
169 {
170 dwContextBuf = 0;
171 pbContext = (PBYTE)&dwContextBuf;
172 cbContext = sizeof(dwContextBuf);
173 }
174
175 if (!pbPolicy)
176 {
177 dwPolicyBuf = 0;
178 pbPolicy = (PBYTE)&dwPolicyBuf;
179 cbPolicy = sizeof(dwPolicyBuf);
180 }
181
182 hr = pWorkISM->lpVtbl->ProcessUrlAction(pWorkISM, pszUrl, dwAction, pbPolicy, cbPolicy,
183 pbContext, cbContext, dwFlags, 0);
184
185 if (pSecuritySite)
186 pWorkISM->lpVtbl->SetSecuritySite(pWorkISM, NULL);
187
188 pWorkISM->lpVtbl->Release(pWorkISM);
189 return hr;
190}
191
192/*************************************************************************
193 * ZoneCheckPathA [SHLWAPI.226]
194 */
197 _In_ PCSTR pszPath,
198 _In_ DWORD dwAction,
200 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
201{
202 WCHAR szPath[2048];
203 if (!pszPath)
204 {
205 ERR("pszPath was NULL\n");
206 return E_INVALIDARG;
207 }
209 return ZoneCheckPathW(szPath, dwAction, dwFlags, pSecuritySite);
210}
211
212/*************************************************************************
213 * ZoneCheckPathW [SHLWAPI.227]
214 */
217 _In_ PCWSTR pszPath,
218 _In_ DWORD dwAction,
220 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
221{
222 return ZoneCheckUrlW(pszPath, dwAction, dwFlags | PUAF_ISFILE, pSecuritySite);
223}
224
225/*************************************************************************
226 * ZoneCheckUrlA [SHLWAPI.228]
227 */
230 _In_ PCSTR pszUrl,
231 _In_ DWORD dwAction,
233 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
234{
235 WCHAR szUrl[2048];
236 if (!pszUrl)
237 {
238 ERR("pszUrl was NULL\n");
239 return E_INVALIDARG;
240 }
241 SHAnsiToUnicode(pszUrl, szUrl, _countof(szUrl));
242 return ZoneCheckUrlW(szUrl, dwAction, dwFlags, pSecuritySite);
243}
244
245/*************************************************************************
246 * ZoneCheckUrlW [SHLWAPI.229]
247 */
250 _In_ PCWSTR pszUrl,
251 _In_ DWORD dwAction,
253 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
254{
255 return ZoneCheckUrlExW(pszUrl, NULL, 0, NULL, 0, dwAction, dwFlags, pSecuritySite);
256}
257
258/*************************************************************************
259 * ZoneCheckUrlExA [SHLWAPI.230]
260 */
263 _In_ PCSTR pszUrl,
264 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
265 _In_ DWORD cbPolicy,
266 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
267 _In_ DWORD cbContext,
268 _In_ DWORD dwAction,
270 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
271{
272 WCHAR szUrl[2048];
273 if (!pszUrl)
274 {
275 ERR("pszUrl was NULL\n");
276 return E_INVALIDARG;
277 }
278 SHAnsiToUnicode(pszUrl, szUrl, _countof(szUrl));
279 return ZoneCheckUrlExW(szUrl, pbPolicy, cbPolicy, pbContext, cbContext,
280 dwAction, dwFlags, pSecuritySite);
281}
282
283/*************************************************************************
284 * ZoneCheckUrlExW [SHLWAPI.231]
285 */
288 _In_ PCWSTR pszUrl,
289 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
290 _In_ DWORD cbPolicy,
291 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
292 _In_ DWORD cbContext,
293 _In_ DWORD dwAction,
295 _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
296{
297 return ZoneCheckUrlExCacheW(pszUrl, pbPolicy, cbPolicy, pbContext, cbContext,
298 dwAction, dwFlags, pSecuritySite, NULL);
299}
300
301/*************************************************************************
302 * ZoneCheckHost [SHLWAPI.234]
303 */
307 _In_ PCWSTR pszUrl,
308 _In_ DWORD dwAction)
309{
310 return ZoneCheckHostEx(pISM, NULL, 0, NULL, 0, pszUrl, dwAction);
311}
312
313/*************************************************************************
314 * ZoneCheckHostEx [SHLWAPI.235]
315 */
319 _Out_writes_bytes_opt_(cbPolicy) PBYTE pbPolicy,
320 _In_ DWORD cbPolicy,
321 _In_reads_bytes_opt_(cbContext) PBYTE pbContext,
322 _In_ DWORD cbContext,
323 _In_ PCWSTR pszUrl,
324 _In_ DWORD dwAction)
325{
326 DWORD dwPolicyBuf, dwContextBuf;
327
328 if (!pISM || !pszUrl)
329 return E_INVALIDARG;
330
331 if (!pbPolicy)
332 {
333 dwPolicyBuf = 0;
334 pbPolicy = (PBYTE)&dwPolicyBuf;
335 cbPolicy = sizeof(dwPolicyBuf);
336 }
337
338 if (!pbContext)
339 {
340 dwContextBuf = 0;
341 pbContext = (PBYTE)&dwContextBuf;
342 cbContext = sizeof(dwContextBuf);
343 }
344
345 return pISM->lpVtbl->ProcessUrlAction(pISM, pszUrl, dwAction, pbPolicy, cbPolicy,
346 pbContext, cbContext, 0, 0);
347}
#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:573
#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
HMODULE WINAPI SHPinDllOfCLSID(REFIID refiid)
Definition: ordinal.c:2656
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
Definition: string.c:2803
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:53
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:107
HRESULT WINAPI ZoneCheckPathW(_In_ PCWSTR pszPath, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:216
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:287
HRESULT WINAPI ZoneCheckUrlA(_In_ PCSTR pszUrl, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:229
static HINSTANCE g_hinstZoneMgr
Definition: zonechk.c:19
EXTERN_C VOID SHLWAPI_DeleteCachedZonesManager(VOID)
Definition: zonechk.c:64
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:317
HRESULT WINAPI ZoneCheckPathA(_In_ PCSTR pszPath, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:196
static IClassFactory * g_pZoneMgrCF
Definition: zonechk.c:17
CRITICAL_SECTION g_csZoneMgrLock
Definition: zonechk.c:18
static HRESULT SHLWAPI_GetCachedZonesManagerInner(_In_ REFIID riid, _Out_ PVOID *ppv)
Definition: zonechk.c:22
HRESULT WINAPI ZoneCheckUrlW(_In_ PCWSTR pszUrl, _In_ DWORD dwAction, _In_ DWORD dwFlags, _In_opt_ IInternetSecurityMgrSite *pSecuritySite)
Definition: zonechk.c:249
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:262
HRESULT SuperPrivate_ZoneCheckPath(PCWSTR pszPath, DWORD dwExpectedZone)
Definition: zonechk.c:85
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:133
HRESULT WINAPI ZoneCheckHost(_In_ IInternetSecurityManager *pISM, _In_ PCWSTR pszUrl, _In_ DWORD dwAction)
Definition: zonechk.c:305