openDecal/Native/DenAgent/URLCallback.h
erik d1442e3747 Initial commit: Complete open-source Decal rebuild
All 5 phases of the open-source Decal rebuild:

Phase 1: 14 decompiled .NET projects (Interop.*, Adapter, FileService, DecalUtil)
Phase 2: 10 native DLLs rewritten as C# COM servers with matching GUIDs
  - DecalDat, DHS, SpellFilter, DecalInput, DecalNet, DecalFilters
  - Decal.Core, DecalControls, DecalRender, D3DService
Phase 3: C++ shims for Inject.DLL (D3D9 hooking) and LauncherHook.DLL
Phase 4: DenAgent WinForms tray application
Phase 5: WiX installer and build script

25 C# projects building with 0 errors.
Native C++ projects require VS 2022 + Windows SDK (x86).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:27:56 +01:00

203 lines
5.4 KiB
C++

// URLCallback.h : Declaration of the cURLCallback
#ifndef __URLCALLBACK_H_
#define __URLCALLBACK_H_
#include "resource.h" // main symbols
#include "DownloadDlg.h"
/////////////////////////////////////////////////////////////////////////////
// cURLCallback
class ATL_NO_VTABLE cURLCallback :
public CComObjectRootEx<CComSingleThreadModel>,
public IBindStatusCallback,
public IServiceProvider,
public IInternetSecurityManager,
public IInternetHostSecurityManager,
public ICodeInstall
{
public:
cURLCallback()
{
}
~cURLCallback()
{
}
BEGIN_COM_MAP(cURLCallback)
COM_INTERFACE_ENTRY(IBindStatusCallback)
COM_INTERFACE_ENTRY(IServiceProvider)
COM_INTERFACE_ENTRY(IInternetSecurityManager)
COM_INTERFACE_ENTRY(IInternetHostSecurityManager)
COM_INTERFACE_ENTRY(ICodeInstall)
COM_INTERFACE_ENTRY(IWindowForBindingUI)
END_COM_MAP()
CComPtr< IBinding > m_pBinding;
CComPtr< IInternetZoneManager > m_pZone;
DWORD m_dwOldPolicy;
cDownloadDlg *m_pDlg;
// Helper functions for setting up a transfer
void start( REFCLSID clsid, LPCWSTR szURL, DWORD dwMajor, DWORD dwMinor );
void stop();
void resetZone();
public:
// IBindStatusCallback
STDMETHOD(GetBindInfo)( DWORD *pgrfBINDF, BINDINFO *pbindinfo );
STDMETHOD(GetPriority)( LONG *pnPriority )
{
*pnPriority = THREAD_PRIORITY_NORMAL;
return S_OK;
}
STDMETHOD(OnDataAvailable)( DWORD, DWORD, FORMATETC *, STGMEDIUM * )
{
return E_NOTIMPL;
}
STDMETHOD(OnLowResource)(DWORD)
{
return E_NOTIMPL;
}
STDMETHOD(OnObjectAvailable)( REFIID iid, IUnknown *pUnk );
STDMETHOD(OnProgress)( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText );
STDMETHOD(OnStartBinding)( DWORD dwReserved, IBinding *pBinding );
STDMETHOD(OnStopBinding)( HRESULT hr, LPCWSTR szStatusText );
// IServiceProvider
STDMETHOD(QueryService)(REFGUID sid,REFIID iid,void **ppvItf)
{
return static_cast< IServiceProvider * >( this )->QueryInterface( iid, ppvItf );
}
// IInternetSecurityManager
CComPtr< IInternetSecurityMgrSite > m_pSecuritySite;
STDMETHOD(SetSecuritySite)(IInternetSecurityMgrSite*pSite)
{
m_pSecuritySite = pSite;
return S_OK;
}
STDMETHOD(GetSecuritySite)(IInternetSecurityMgrSite **ppSite)
{
return m_pSecuritySite->QueryInterface( ppSite );
}
STDMETHOD(MapUrlToZone)(LPCWSTR,DWORD*pdwZone,DWORD)
{
// All URLs are on the local machine - most trusted
*pdwZone = URLZONE_LOCAL_MACHINE;
return S_OK;
}
STDMETHOD(GetSecurityId)(LPCWSTR,BYTE*,DWORD*,DWORD)
{
return INET_E_DEFAULT_ACTION;
}
STDMETHOD(ProcessUrlAction)(
/* [in] */ LPCWSTR pwszUrl,
/* [in] */ DWORD dwAction,
/* [size_is][out] */ BYTE *pPolicy,
/* [in] */ DWORD cbPolicy,
/* [in] */ BYTE *pContext,
/* [in] */ DWORD cbContext,
/* [in] */ DWORD dwFlags,
/* [in] */ DWORD dwReserved = 0)
{
if( cbPolicy == sizeof( DWORD ) )
{
// Set everything to allow
*reinterpret_cast< DWORD * >( pPolicy ) = URLPOLICY_ALLOW;
return S_OK;
}
return INET_E_DEFAULT_ACTION;
}
STDMETHOD(QueryCustomPolicy)(LPCWSTR,REFGUID,BYTE**,DWORD*,BYTE*,DWORD,DWORD)
{
return INET_E_DEFAULT_ACTION;
}
STDMETHOD(SetZoneMapping)(DWORD,LPCWSTR,DWORD)
{
return INET_E_DEFAULT_ACTION;
}
STDMETHOD(GetZoneMappings)(DWORD,IEnumString**,DWORD)
{
return INET_E_DEFAULT_ACTION;
}
// IInternetHostSecurityManager
STDMETHOD(GetSecurityId)( BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved)
{
static LPCTSTR strSecurity = _T( "None:localhost+My Computer" );
::strcpy( reinterpret_cast< char * >( pbSecurityId ), strSecurity );
*pcbSecurityId = ::_tcslen( strSecurity );
return S_OK;
}
STDMETHOD(ProcessUrlAction)(
/* [in] */ DWORD dwAction,
/* [size_is][out] */ BYTE __RPC_FAR *pPolicy,
/* [in] */ DWORD cbPolicy,
/* [in] */ BYTE __RPC_FAR *pContext,
/* [in] */ DWORD cbContext,
/* [in] */ DWORD dwFlags,
/* [in] */ DWORD dwReserved)
{
switch( dwAction )
{
case URLACTION_DOWNLOAD_UNSIGNED_ACTIVEX:
*reinterpret_cast< DWORD * >( pPolicy ) = URLPOLICY_QUERY;
return S_OK;
}
if( cbPolicy == sizeof( DWORD ) )
{
// Set everything to allow
*reinterpret_cast< DWORD * >( pPolicy ) = URLPOLICY_ALLOW;
return S_OK;
}
return INET_E_DEFAULT_ACTION;
}
virtual HRESULT STDMETHODCALLTYPE QueryCustomPolicy(
/* [in] */ REFGUID guidKey,
/* [size_is][size_is][out] */ BYTE __RPC_FAR *__RPC_FAR *ppPolicy,
/* [out] */ DWORD __RPC_FAR *pcbPolicy,
/* [in] */ BYTE __RPC_FAR *pContext,
/* [in] */ DWORD cbContext,
/* [in] */ DWORD dwReserved)
{
return INET_E_DEFAULT_ACTION;
}
// ICodeInstall
virtual HRESULT STDMETHODCALLTYPE OnCodeInstallProblem(
/* [in] */ ULONG ulStatusCode,
/* [unique][in] */ LPCWSTR szDestination,
/* [unique][in] */ LPCWSTR szSource,
/* [in] */ DWORD dwReserved)
{
return S_OK;
}
// IWindowForBindingUI
virtual HRESULT STDMETHODCALLTYPE GetWindow(
/* [in] */ REFGUID rguidReason,
/* [out] */ HWND __RPC_FAR *phwnd);
};
#endif //__URLCALLBACK_H_