mirror of https://github.com/tongzx/nt5src
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.
234 lines
5.3 KiB
234 lines
5.3 KiB
#include "stdafx.h"
|
|
|
|
#include "MyAdapterNotify.h"
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMyAdapterNotify
|
|
//
|
|
|
|
IcqPrx * g_IcqPrxp = NULL;
|
|
|
|
ULONG g_MyPublicIp = 0L;
|
|
|
|
ULONG g_MyPrivateIp = 0L;
|
|
|
|
|
|
//
|
|
// This function will be call when a new adapter is made active
|
|
//
|
|
STDMETHODIMP
|
|
CMyAdapterNotify::AdapterAdded(
|
|
IAdapterInfo* pAdapter
|
|
)
|
|
{
|
|
ULONG AdapterIndex = 0;
|
|
ALG_ADAPTER_TYPE AdapterType ;
|
|
ULONG AddressCount = 0;
|
|
PULONG AddressArrayp = NULL;
|
|
|
|
HRESULT Result = S_OK;
|
|
|
|
ICQ_TRC(TM_IF, TL_TRACE, ("CMyAdapterNotify::AdapterAdded"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//
|
|
// This function will be call when a adapter is remove and/or disable
|
|
//
|
|
STDMETHODIMP
|
|
CMyAdapterNotify::AdapterRemoved(
|
|
IAdapterInfo* pAdapter
|
|
)
|
|
{
|
|
ULONG AdapterIndex = 0;
|
|
ALG_ADAPTER_TYPE AdapterType ;
|
|
ULONG AddressCount = 0;
|
|
PULONG AddressArrayp = NULL;
|
|
|
|
HRESULT Result = S_OK;
|
|
|
|
ICQ_TRC(TM_IF, TL_TRACE, ("CMyAdapterNotify::AdapterRemoved"));
|
|
|
|
Result = pAdapter->GetAdapterIndex(&AdapterIndex);
|
|
|
|
if ( FAILED(Result) )
|
|
{
|
|
ICQ_TRC(TM_IF, TL_ERROR, ("AdapterIndex has failed"));
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
Result = pAdapter->GetAdapterType(&AdapterType);
|
|
|
|
if ( FAILED(Result) )
|
|
{
|
|
ICQ_TRC(TM_IF, TL_ERROR, ("Adapter Type has failed"));
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
Result = pAdapter->GetAdapterAddresses(&AddressCount,
|
|
&AddressArrayp);
|
|
|
|
if ( FAILED(Result) )
|
|
{
|
|
ICQ_TRC(TM_IF, TL_ERROR, ("Adapter Addresses has failed"));
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
//
|
|
// Create a report on the gathered information
|
|
//
|
|
ICQ_TRC(TM_IF, TL_TRACE,
|
|
(" Interface FW %u: BD %u: PV %u ",
|
|
ALG_IFC_FW(AdapterType),
|
|
ALG_IFC_BOUNDARY(AdapterType),
|
|
ALG_IFC_PRIVATE(AdapterType))
|
|
);
|
|
|
|
ICQ_TRC(TM_IF, TL_TRACE,
|
|
("Interface index: %u addr count %u",
|
|
AdapterIndex, AddressCount));
|
|
|
|
for(ULONG i = 0; i < AddressCount; i++)
|
|
{
|
|
ICQ_TRC(TM_IF, TL_TRACE,
|
|
("Adapter Address[%u] is %s",
|
|
i,
|
|
INET_NTOA(AddressArrayp[i]))
|
|
);
|
|
}
|
|
|
|
//
|
|
// Remove ICQ PROXY HERE
|
|
//
|
|
if( (ALG_IFC_FW(AdapterType) ||
|
|
ALG_IFC_BOUNDARY(AdapterType)) )
|
|
{
|
|
ASSERT( g_IcqPrxp != NULL );
|
|
|
|
STOP_COMPONENT( g_IcqPrxp );
|
|
|
|
DEREF_COMPONENT( g_IcqPrxp, eRefInitialization );
|
|
}
|
|
else
|
|
{
|
|
g_MyPrivateIp = 0;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//
|
|
// This function will be call when a adapter is modified
|
|
//
|
|
STDMETHODIMP
|
|
CMyAdapterNotify::AdapterModified(
|
|
IAdapterInfo* pAdapter
|
|
)
|
|
{
|
|
ULONG AdapterIndex = 0;
|
|
ALG_ADAPTER_TYPE AdapterType ;
|
|
ULONG AddressCount = 0;
|
|
PULONG AddressArrayp = NULL;
|
|
|
|
HRESULT Result = S_OK;
|
|
|
|
ICQ_TRC(TM_IF, TL_TRACE, ("CMyAdapterNotify::AdapterModified"));
|
|
|
|
Result = pAdapter->GetAdapterIndex(&AdapterIndex);
|
|
|
|
if ( FAILED(Result) )
|
|
{
|
|
ICQ_TRC(TM_IF, TL_ERROR, ("AdapterIndex has failed"));
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
Result = pAdapter->GetAdapterType(&AdapterType);
|
|
|
|
if ( FAILED(Result) )
|
|
{
|
|
ICQ_TRC(TM_IF, TL_ERROR, ("Adapter Type has failed"));
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
Result = pAdapter->GetAdapterAddresses(&AddressCount,
|
|
&AddressArrayp);
|
|
|
|
if ( FAILED(Result) )
|
|
{
|
|
ICQ_TRC(TM_IF, TL_ERROR, ("Adapter Addresses has failed"));
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
//
|
|
// Create a report on the gathered information
|
|
//
|
|
ICQ_TRC(TM_IF, TL_TRACE,
|
|
(" Interface FW %u: BD %u: PV %u ",
|
|
ALG_IFC_FW(AdapterType),
|
|
ALG_IFC_BOUNDARY(AdapterType),
|
|
ALG_IFC_PRIVATE(AdapterType))
|
|
);
|
|
|
|
ICQ_TRC(TM_IF, TL_TRACE,
|
|
("Interface index: %u addr count %u",
|
|
AdapterIndex, AddressCount));
|
|
|
|
for(ULONG i = 0; i < AddressCount; i++)
|
|
{
|
|
ICQ_TRC(TM_IF, TL_TRACE,
|
|
("Adapter Address[%u] is %s",
|
|
i,
|
|
INET_NTOA(AddressArrayp[i]))
|
|
);
|
|
}
|
|
|
|
//
|
|
// Initialize the ICQ Proxy here with the appropriate IP
|
|
//
|
|
if( (ALG_IFC_FW(AdapterType) || ALG_IFC_BOUNDARY(AdapterType)) &&
|
|
(AddressCount > 0) &&
|
|
(AddressArrayp != NULL)
|
|
)
|
|
{
|
|
ASSERT( g_IcqPrxp is NULL );
|
|
|
|
NEW_OBJECT( g_IcqPrxp, IcqPrx );
|
|
|
|
if(g_IcqPrxp is NULL)
|
|
{
|
|
ASSERT(FALSE);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Use the first IP on the List of IPs belonging to this
|
|
// Interface
|
|
//
|
|
Result = g_IcqPrxp->RunIcq99Proxy(AddressArrayp[0]);
|
|
|
|
if(Result)
|
|
{
|
|
ICQ_TRC(TM_IF, TL_ERROR, ("** !! ICQ PRX RUN FAILED !! **"));
|
|
}
|
|
}
|
|
}
|
|
else if( (AddressCount > 0) && (AddressArrayp != NULL) )
|
|
{
|
|
ICQ_TRC(TM_IF, TL_ERROR, ("** !! ICQ PRX WONT RUN !! **"));
|
|
|
|
g_MyPrivateIp = AddressArrayp[0];
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|