260 lines
5 KiB
C++
260 lines
5 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
AlgController.cpp : Implementation of CAlgController
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains routines for the ALG Manager module's
|
||
|
private interface to be used only by ICS see rmALG.cpp
|
||
|
|
||
|
Author:
|
||
|
|
||
|
JPDup 10-Nov-2000
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "PreComp.h"
|
||
|
#include "AlgController.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Globals
|
||
|
//
|
||
|
CAlgController* g_pAlgController=NULL; // This is a singleton created by IPNATHLP/NatALG
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// IPNATHLP is ready and is asking the ALG manager to do it's magic and load all the ISV ALGs
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CAlgController::Start(
|
||
|
INat* pINat
|
||
|
)
|
||
|
{
|
||
|
MYTRACE_ENTER("CAlgController::Start");
|
||
|
|
||
|
|
||
|
if ( !pINat )
|
||
|
{
|
||
|
MYTRACE_ERROR("NULL pINat",0);
|
||
|
return E_INVALIDARG;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Cache the INat interface that is given, will be used for the total life time of the ALG manager
|
||
|
//
|
||
|
m_pINat = pINat;
|
||
|
m_pINat->AddRef();
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Create the one and only ALG Public interface will be passed to all ALG module that we host
|
||
|
//
|
||
|
HRESULT hr;
|
||
|
|
||
|
CComObject<CApplicationGatewayServices>* pAlgServices;
|
||
|
CComObject<CApplicationGatewayServices>::CreateInstance(&pAlgServices);
|
||
|
hr = pAlgServices->QueryInterface(
|
||
|
IID_IApplicationGatewayServices,
|
||
|
(void**)&m_pIAlgServices
|
||
|
);
|
||
|
|
||
|
if ( FAILED(hr) )
|
||
|
{
|
||
|
MYTRACE_ERROR("CreateInstance(CApplicationGateway)", hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Cache the ApplicationGatewayService, other call like PrimaryControlChannel etc.. will refer to this singleton
|
||
|
//
|
||
|
g_pAlgController = this;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Load all the ALG's will return S_OK even if some ALG had problem loading
|
||
|
//
|
||
|
m_AlgModules.Load();
|
||
|
|
||
|
return S_OK;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
extern HANDLE g_EventKeepAlive;
|
||
|
|
||
|
//
|
||
|
// CALL by IPNATHLP when the ICS/Firewall SharedAccess service is stoped
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CAlgController::Stop()
|
||
|
{
|
||
|
MYTRACE_ENTER("CAlgController::Stop()")
|
||
|
|
||
|
//
|
||
|
// Release all ALG currently loaded
|
||
|
//
|
||
|
m_AlgModules.Unload();
|
||
|
|
||
|
FreeResources();
|
||
|
|
||
|
//
|
||
|
// Let's stop
|
||
|
//
|
||
|
MYTRACE("Next intruction will signale the g_EventKeepAlive");
|
||
|
SetEvent(g_EventKeepAlive); // see ALG.cpp the WinMain is waiting on the event before exiting the process
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// CComNAT will call this interface when a new adapter is reported
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CAlgController::Adapter_Add(
|
||
|
IN ULONG nCookie, // Internal handle to indentify the Adapter being added
|
||
|
IN short nType
|
||
|
)
|
||
|
{
|
||
|
MYTRACE_ENTER("CAlgController::Adapter_Add")
|
||
|
MYTRACE("Adapter Cookie %d Type %d", nCookie, nType);
|
||
|
|
||
|
|
||
|
#if defined(DBG) || defined(_DEBUG)
|
||
|
|
||
|
if ( nType & eALG_PRIVATE )
|
||
|
MYTRACE("eALG_PRIVATE ADAPTER");
|
||
|
|
||
|
if ( nType & eALG_FIREWALLED )
|
||
|
MYTRACE("eALG_FIREWALLED ADAPTER");
|
||
|
|
||
|
if ( nType & eALG_BOUNDARY )
|
||
|
MYTRACE("eALG_BOUNDARY ADAPTER");
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
m_CollectionOfAdapters.Add(
|
||
|
nCookie,
|
||
|
nType
|
||
|
);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// CComNAT will call this interface when a new adapter is Removed
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CAlgController::Adapter_Remove(
|
||
|
IN ULONG nCookie // Internal handle to indentify the Adapter being removed
|
||
|
)
|
||
|
{
|
||
|
MYTRACE_ENTER("CAlgController::Adapter_Remove")
|
||
|
MYTRACE("Adapter nCookie %d", nCookie);
|
||
|
|
||
|
m_CollectionOfAdapters.Remove(
|
||
|
nCookie
|
||
|
);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// CComNAT will call this interface when a new adapter is modified
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CAlgController::Adapter_Modify(
|
||
|
IN ULONG nCookie // Internal handle to indentify the Adapter being Modified
|
||
|
)
|
||
|
{
|
||
|
MYTRACE_ENTER("CAlgController::Adapter_Modify")
|
||
|
MYTRACE("Adapter nCookie %d", nCookie);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// CComNAT will call this interface when a new adapter is modified
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CAlgController::Adapter_Bind(
|
||
|
IN ULONG nCookie, // Internal handle to indentify the Adapter being Bind
|
||
|
IN ULONG nAdapterIndex,
|
||
|
IN ULONG nAddressCount,
|
||
|
IN DWORD anAddresses[]
|
||
|
)
|
||
|
{
|
||
|
MYTRACE_ENTER("CAlgController::Adapter_Bind")
|
||
|
MYTRACE("Adapter nCookie(%d)=Index(%d), AddressCount %d Address[0] %s", nCookie, nAdapterIndex, nAddressCount, MYTRACE_IP(anAddresses[0]));
|
||
|
|
||
|
m_CollectionOfAdapters.SetAddresses(
|
||
|
nCookie,
|
||
|
nAdapterIndex,
|
||
|
nAddressCount,
|
||
|
anAddresses
|
||
|
);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// CComNat will call this method when a port mapping is modified
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CAlgController::Adapter_PortMappingChanged(
|
||
|
IN ULONG nCookie,
|
||
|
IN UCHAR ucProtocol,
|
||
|
IN USHORT usPort
|
||
|
)
|
||
|
{
|
||
|
MYTRACE_ENTER("CAlgController::Adapter_PortMappingChanged");
|
||
|
MYTRACE("Adapter Cookie %d, Protocol %d, Port %d", nCookie, ucProtocol, usPort);
|
||
|
|
||
|
HRESULT hr =
|
||
|
m_ControlChannelsPrimary.AdapterPortMappingChanged(
|
||
|
nCookie,
|
||
|
ucProtocol,
|
||
|
usPort
|
||
|
);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|