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.
163 lines
3.9 KiB
163 lines
3.9 KiB
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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;
|
|
}
|