windows-nt/Source/XPSP1/NT/net/homenet/alg/exe/secondarycontrolchannel.cpp
2020-09-26 16:20:57 +08:00

164 lines
3.8 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// CSecondaryControlChannel
//
// SecondaryControlChannel.cpp : Implementation of CSecondaryControlChannel
//
#include "PreComp.h"
#include "AlgController.h"
#include "SecondaryControlChannel.h"
//
// Cancel the redirect when it was created we stored the original demanded addresses & ports
// now we need to reverse(Cancel) them
//
STDMETHODIMP
CSecondaryControlChannel::Cancel()
{
//
// By removing this Channel from the collection of SecondaryChannel
// the Redirect associated with this channel will be cancel(release)
// and ref count decrement.
return g_pAlgController->m_ControlChannelsSecondary.Remove(this);
}
STDMETHODIMP
CSecondaryControlChannel::GetChannelProperties(
ALG_SECONDARY_CHANNEL_PROPERTIES** ppProperties
)
{
HRESULT hr = S_OK;
if (NULL != ppProperties)
{
*ppProperties = reinterpret_cast<ALG_SECONDARY_CHANNEL_PROPERTIES*>(
CoTaskMemAlloc(sizeof(ALG_SECONDARY_CHANNEL_PROPERTIES))
);
if (NULL != *ppProperties)
{
CopyMemory(*ppProperties, &m_Properties, sizeof(ALG_SECONDARY_CHANNEL_PROPERTIES));
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
hr = E_POINTER;
}
return hr;
}
//
//
//
STDMETHODIMP
CSecondaryControlChannel::GetOriginalDestinationInformation(
IN ULONG ulSourceAddress,
IN USHORT usSourcePort,
OUT ULONG* pulOriginalDestinationAddress,
OUT USHORT* pusOriginalDestinationPort,
OUT OPTIONAL IAdapterInfo** ppReceiveAdapter
)
{
MYTRACE_ENTER("CSecondaryControlChannel::GetOriginalDestinationInformation");
if ( pulOriginalDestinationAddress==NULL ||
pusOriginalDestinationPort== NULL
)
{
MYTRACE_ERROR("Invalid argument pass pulOriginalDestinationAddress or pulOriginalDestinationPort", E_INVALIDARG);
return E_INVALIDARG;
}
ULONG nAdapterCookie;
HRESULT hr = g_pAlgController->GetNat()->GetOriginalDestinationInformation(
m_Properties.eProtocol,
m_ulNewDestinationAddress,
m_usNewDestinationPort,
ulSourceAddress,
usSourcePort,
pulOriginalDestinationAddress,
pusOriginalDestinationPort,
&nAdapterCookie
);
if ( FAILED(hr) )
{
MYTRACE_ERROR("GetNat()->GetOriginalDestinationInformation", hr);
return hr;
}
if ( ppReceiveAdapter )
{
hr = g_pAlgController->m_CollectionOfAdapters.GetAdapterInfo(
nAdapterCookie,
ppReceiveAdapter
);
}
return hr;
}
//
// Public method
//
// release associated Redirects
//
HRESULT
CSecondaryControlChannel::CancelRedirects()
{
HRESULT hr;
if ( m_HandleDynamicRedirect )
{
//
// We have a handle to a dynamic redirect so we cancel it using this handle
//
hr = g_pAlgController->GetNat()->CancelDynamicRedirect(m_HandleDynamicRedirect);
}
else
{
//
// Normal redirect cancel using original argument pass to CreateRedirect
//
hr = g_pAlgController->GetNat()->CancelRedirect(
(UCHAR)m_Properties.eProtocol,
m_ulDestinationAddress,
m_usDestinationPort,
m_ulSourceAddress,
m_usSourcePort,
m_ulNewDestinationAddress,
m_usNewDestinationPort,
m_ulNewSourceAddress,
m_usNewSourcePort
);
}
return hr;
}