Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

259 lines
5.0 KiB

/*++
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;
}