Leaked source code of windows server 2003
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.
 
 
 
 
 
 

771 lines
21 KiB

//============================================================================
// Copyright(c) 1996, Microsoft Corporation
//
// File: ipadd.cpp
//
// History:
// 08/30/96 Ram Cherala Created
//
// Implementation of IP Filter Add/Edit dialog code
//============================================================================
#include "stdafx.h"
#include "rtrfiltr.h"
#include "ipfltr.h"
#include "ipadd.h"
extern "C" {
#include <winsock.h>
#include <fltdefs.h>
#include <iprtinfo.h>
}
#include "ipaddr.h"
#include "rtradmin.hm"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static enum {
PROTOCOL_TCP = 0,
PROTOCOL_TCP_ESTABLISHED,
PROTOCOL_UDP,
PROTOCOL_ICMP,
PROTOCOL_ANY,
PROTOCOL_OTHER,
};
static UINT g_aPROTOCOLS[][2] = {
{IDS_PROTOCOL_TCP, PROTOCOL_TCP},
{IDS_PROTOCOL_TCP_ESTABLISHED, PROTOCOL_TCP_ESTABLISHED},
{IDS_PROTOCOL_UDP, PROTOCOL_UDP},
{IDS_PROTOCOL_ICMP, PROTOCOL_ICMP},
{IDS_PROTOCOL_ANY, PROTOCOL_ANY},
{IDS_PROTOCOL_OTHER, PROTOCOL_OTHER},
};
#define IDS_ICMP_ECHO 1
#define IDS_ICMP_REDIRECT 2
#if 0
// TODO sample ICMP types - need to update with actual list
static UINT g_aICMPTYPE[][2] = {
{1, IDS_ICMP_ECHO},
{2, IDS_ICMP_REDIRECT}
};
#endif
HRESULT MultiEnableWindow(HWND hWndParent, BOOL fEnable, UINT first, ...)
{
UINT nCtrlId = first;
HWND hWndCtrl;
va_list marker;
va_start(marker, first);
while (nCtrlId != 0)
{
hWndCtrl = ::GetDlgItem(hWndParent, nCtrlId);
Assert(hWndCtrl);
if (hWndCtrl)
::EnableWindow(hWndCtrl, fEnable);
// get the next item
nCtrlId = va_arg(marker, UINT);
}
va_end(marker);
return hrOK;
}
/////////////////////////////////////////////////////////////////////////////
// CIpFltrAddEdit dialog
CIpFltrAddEdit::CIpFltrAddEdit(CWnd* pParent,
FilterListEntry ** ppFilterEntry,
DWORD dwFilterType)
: CBaseDialog(CIpFltrAddEdit::IDD, pParent),
m_ppFilterEntry( ppFilterEntry ),
m_dwFilterType ( dwFilterType )
{
//{{AFX_DATA_INIT(CIpFltrAddEdit)
m_sProtocol = _T("");
m_sSrcPort = _T("");
m_sDstPort = _T("");
//}}AFX_DATA_INIT
// SetHelpMap(m_dwHelpMap);
}
void CIpFltrAddEdit::DoDataExchange(CDataExchange* pDX)
{
CBaseDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CIpFltrAddEdit)
DDX_Control(pDX, IDC_AEIP_ST_DEST_PORT, m_stDstPort);
DDX_Control(pDX, IDC_AEIP_ST_SRC_PORT, m_stSrcPort);
DDX_Control(pDX, IDC_AEIP_CB_SRC_PORT, m_cbSrcPort);
DDX_Control(pDX, IDC_AEIP_CB_DEST_PORT, m_cbDstPort);
DDX_Control(pDX, IDC_AEIP_CB_PROTOCOL, m_cbProtocol);
DDX_CBString(pDX, IDC_AEIP_CB_PROTOCOL, m_sProtocol);
DDV_MaxChars(pDX, m_sProtocol, 32);
DDX_CBString(pDX, IDC_AEIP_CB_SRC_PORT, m_sSrcPort);
DDV_MaxChars(pDX, m_sSrcPort, 16);
DDX_CBString(pDX, IDC_AEIP_CB_DEST_PORT, m_sDstPort);
DDV_MaxChars(pDX, m_sDstPort, 16);
DDX_Check(pDX, IDC_AEIP_CB_SOURCE, m_bSrc);
DDX_Check(pDX, IDC_AEIP_CB_DEST, m_bDst);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CIpFltrAddEdit, CBaseDialog)
//{{AFX_MSG_MAP(CIpFltrAddEdit)
ON_CBN_SELCHANGE(IDC_AEIP_CB_PROTOCOL, OnSelchangeProtocol)
ON_BN_CLICKED(IDC_AEIP_CB_SOURCE, OnCbSourceClicked)
ON_BN_CLICKED(IDC_AEIP_CB_DEST, OnCbDestClicked)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
DWORD CIpFltrAddEdit::m_dwHelpMap[] =
{
// IDC_AEIP_ST_SOURCE, HIDC_AEIP_ST_SOURCE,
// IDC_AEIP_CB_SOURCE, HIDC_AEIP_CB_SOURCE,
// IDC_AEIP_ST_SOURCE_ADDRESS, HIDC_AEIP_ST_SOURCE_ADDRESS,
// IDC_AEIP_EB_SOURCE_ADDRESS, HIDC_AEIP_EB_SOURCE_ADDRESS,
// IDC_AEIP_ST_SOURCE_MASK, HIDC_AEIP_ST_SOURCE_MASK,
// IDC_AEIP_EB_SOURCE_MASK, HIDC_AEIP_EB_SOURCE_MASK,
// IDC_AEIP_ST_DEST, HIDC_AEIP_ST_DEST,
// IDC_AEIP_CB_DEST, HIDC_AEIP_CB_DEST,
// IDC_AEIP_ST_DEST_ADDRESS, HIDC_AEIP_ST_DEST_ADDRESS,
// IDC_AEIP_EB_DEST_ADDRESS, HIDC_AEIP_EB_DEST_ADDRESS,
// IDC_AEIP_ST_DEST_MASK, HIDC_AEIP_ST_DEST_MASK,
// IDC_AEIP_EB_DEST_MASK, HIDC_AEIP_EB_DEST_MASK,
// IDC_AEIP_ST_PROTOCOL, HIDC_AEIP_ST_PROTOCOL,
// IDC_AEIP_CB_PROTOCOL, HIDC_AEIP_CB_PROTOCOL,
// IDC_AEIP_ST_SRC_PORT, HIDC_AEIP_ST_SRC_PORT,
// IDC_AEIP_CB_SRC_PORT, HIDC_AEIP_CB_SRC_PORT,
// IDC_AEIP_ST_DEST_PORT, HIDC_AEIP_ST_DEST_PORT,
// IDC_AEIP_CB_DEST_PORT, HIDC_AEIP_CB_DEST_PORT,
0,0,
};
/////////////////////////////////////////////////////////////////////////////
// CIpFltrAddEdit message handlers
//-----------------------------------------------------------------------------
// Function: CIpFltrAddEdit::OnSelchangeProtocol
//
// Handles 'CBN_SELCHANGE' notification from Protocols combo box
//------------------------------------------------------------------------------
void CIpFltrAddEdit::OnSelchangeProtocol()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CWnd * hWnd;
CString cStr;
// if tcp or udp, then enable src/dest port
// if icmp, rename strings and enable type/code
// if Other enable src port
// if Any disable everything
switch(QueryCurrentProtocol()) {
case PROTOCOL_TCP:
case PROTOCOL_TCP_ESTABLISHED:
case PROTOCOL_UDP:
VERIFY(cStr.LoadString(IDS_SRC_PORT));
m_stSrcPort.SetWindowText(cStr);
VERIFY(cStr.LoadString(IDS_DST_PORT));
m_stDstPort.SetWindowText(cStr);
m_cbSrcPort.ShowWindow(SW_SHOW);
m_cbDstPort.ShowWindow(SW_SHOW);
m_stSrcPort.ShowWindow(SW_SHOW);
m_stDstPort.ShowWindow(SW_SHOW);
break;
case PROTOCOL_ICMP:
VERIFY(cStr.LoadString(IDS_ICMP_TYPE));
m_stSrcPort.SetWindowText(cStr);
VERIFY(cStr.LoadString(IDS_ICMP_CODE));
m_stDstPort.SetWindowText(cStr);
m_cbSrcPort.ShowWindow(SW_SHOW);
m_cbDstPort.ShowWindow(SW_SHOW);
m_stSrcPort.ShowWindow(SW_SHOW);
m_stDstPort.ShowWindow(SW_SHOW);
break;
case PROTOCOL_ANY:
m_cbSrcPort.ShowWindow(SW_HIDE);
m_cbDstPort.ShowWindow(SW_HIDE);
VERIFY(hWnd = GetDlgItem(IDC_AEIP_ST_SRC_PORT));
hWnd->ShowWindow(SW_HIDE);
VERIFY(hWnd = GetDlgItem(IDC_AEIP_ST_DEST_PORT));
hWnd->ShowWindow(SW_HIDE);
break;
case PROTOCOL_OTHER:
VERIFY(cStr.LoadString(IDS_OTHER_PROTOCOL));
m_stSrcPort.SetWindowText(cStr);
m_cbSrcPort.ShowWindow(SW_SHOW);
m_stSrcPort.ShowWindow(SW_SHOW);
m_cbDstPort.ShowWindow(SW_HIDE);
VERIFY(hWnd = GetDlgItem(IDC_AEIP_ST_DEST_PORT));
hWnd->ShowWindow(SW_HIDE);
break;
}
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::OnInitDialog
//
// Handles 'WM_INITDIALOG' notification from the dialog
//------------------------------------------------------------------------------
BOOL CIpFltrAddEdit::OnInitDialog()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString st;
CBaseDialog::OnInitDialog();
// determine if a new filter is being added or if an
// existing filter is being modified.
m_bEdit = ( *m_ppFilterEntry != NULL );
st.LoadString(m_bEdit ? IDS_IP_EDIT_FILTER : IDS_IP_ADD_FILTER);
SetWindowText(st);
// create the IP controls
m_ipSrcAddress.Create(m_hWnd, IDC_AEIP_EB_SOURCE_ADDRESS);
m_ipSrcMask.Create(m_hWnd, IDC_AEIP_EB_SOURCE_MASK);
IpAddr_ForceContiguous((HWND) m_ipSrcMask);
m_ipDstAddress.Create(m_hWnd, IDC_AEIP_EB_DEST_ADDRESS);
m_ipDstMask.Create(m_hWnd, IDC_AEIP_EB_DEST_MASK);
IpAddr_ForceContiguous((HWND) m_ipDstMask);
// disable IP controls by default
CheckDlgButton(IDC_AEIP_CB_SOURCE, FALSE);
OnCbSourceClicked();
CheckDlgButton(IDC_AEIP_CB_DEST, FALSE);
OnCbDestClicked();
CString sProtocol;
// fill up the protocol combo box with list of protocols
UINT count = sizeof(g_aPROTOCOLS)/sizeof(g_aPROTOCOLS[0]);
for ( UINT i = 0; i < count; i++ ) {
sProtocol.LoadString(g_aPROTOCOLS[i][0]);
UINT item = m_cbProtocol.AddString(sProtocol);
m_cbProtocol.SetItemData(item, g_aPROTOCOLS[i][1]);
if( g_aPROTOCOLS[i][1] == PROTOCOL_ANY )
{
m_cbProtocol.SetCurSel(item);
}
}
// Fill in the controls if the user is editing a filter
if(m_bEdit)
{
FilterListEntry * pfle = *m_ppFilterEntry;
if( pfle->dwSrcAddr == 0 &&
pfle->dwSrcMask == 0 )
{
m_bSrc = FALSE;
CheckDlgButton( IDC_AEIP_CB_SOURCE, 0);
}
else
{
m_bSrc = TRUE;
CheckDlgButton( IDC_AEIP_CB_SOURCE, 1);
m_ipSrcAddress.SetAddress(INET_NTOA(pfle->dwSrcAddr));
m_ipSrcMask.SetAddress(INET_NTOA(pfle->dwSrcMask));
GetDlgItem(IDC_AEIP_EB_SOURCE_ADDRESS)->EnableWindow(TRUE);
GetDlgItem(IDC_AEIP_EB_SOURCE_MASK)->EnableWindow(TRUE);
}
if( pfle->dwDstAddr == 0 &&
pfle->dwDstMask == 0 )
{
m_bDst = FALSE;
CheckDlgButton( IDC_AEIP_CB_DEST, 0);
}
else
{
m_bDst = TRUE;
CheckDlgButton( IDC_AEIP_CB_DEST, 1);
m_ipDstAddress.SetAddress(INET_NTOA(pfle->dwDstAddr));
m_ipDstMask.SetAddress(INET_NTOA(pfle->dwDstMask));
GetDlgItem(IDC_AEIP_EB_DEST_ADDRESS)->EnableWindow(TRUE);
GetDlgItem(IDC_AEIP_EB_DEST_MASK)->EnableWindow(TRUE);
}
if ( pfle->dwProtocol == FILTER_PROTO_ANY )
{
SetProtocolSelection(IDS_PROTOCOL_ANY);
}
else if ( pfle->dwProtocol == FILTER_PROTO_ICMP )
{
SetProtocolSelection(IDS_PROTOCOL_ICMP);
m_cbSrcPort.SetWindowText(GetIcmpTypeString( pfle->wSrcPort));
m_cbDstPort.SetWindowText(GetIcmpCodeString( pfle->wDstPort));
}
else if ( pfle->dwProtocol == FILTER_PROTO_TCP )
{
if(pfle->fLateBound & TCP_ESTABLISHED_FLAG)
{
SetProtocolSelection(IDS_PROTOCOL_TCP_ESTABLISHED);
}
else
{
SetProtocolSelection(IDS_PROTOCOL_TCP);
}
m_cbSrcPort.SetWindowText(GetPortString( pfle->dwProtocol, pfle->wSrcPort));
m_cbDstPort.SetWindowText(GetPortString( pfle->dwProtocol, pfle->wDstPort));
}
else if ( pfle->dwProtocol == FILTER_PROTO_UDP )
{
SetProtocolSelection(IDS_PROTOCOL_UDP);
m_cbSrcPort.SetWindowText(GetPortString( pfle->dwProtocol, pfle->wSrcPort));
m_cbDstPort.SetWindowText(GetPortString( pfle->dwProtocol, pfle->wDstPort));
}
else
{
WCHAR buffer[16+1];
SetProtocolSelection(IDS_PROTOCOL_OTHER);
m_cbSrcPort.SetWindowText(_itow(pfle->dwProtocol, buffer, 10) );
}
}
// enable/disable controls based on filter type
if (m_dwFilterType == FILTER_PERUSER_OUT)
{
MultiEnableWindow(GetSafeHwnd(), FALSE,
IDC_AEIP_CB_SOURCE,
IDC_AEIP_ST_SOURCE_ADDRESS,
IDC_AEIP_EB_SOURCE_ADDRESS,
IDC_AEIP_ST_SOURCE_MASK,
IDC_AEIP_EB_SOURCE_MASK,
0);
}
else if (m_dwFilterType == FILTER_PERUSER_IN)
{
MultiEnableWindow(GetSafeHwnd(), FALSE,
IDC_AEIP_CB_DEST,
IDC_AEIP_ST_DEST_ADDRESS,
IDC_AEIP_EB_DEST_ADDRESS,
IDC_AEIP_ST_DEST_MASK,
IDC_AEIP_EB_DEST_MASK,
0);
}
// enable disable controls depending on selection
OnSelchangeProtocol();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::SetProtocolSelection
//
// Select the proper Protocol in the protocol
//------------------------------------------------------------------------------
void CIpFltrAddEdit::SetProtocolSelection( UINT idProto )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString cStr;
if(!cStr.LoadString(idProto))
{
AfxMessageBox(_T("Error loading resource"));
}
m_cbProtocol.GetItemData(m_cbProtocol.GetCurSel());
UINT item = m_cbProtocol.FindStringExact(-1, cStr);
if(item != CB_ERR)
m_cbProtocol.SetCurSel(item);
else
m_cbProtocol.SetCurSel(0);
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::GetIcmpTypeString
//
// returns a CString representing ICMP type (if known) or a string version
// of the Type number.
//------------------------------------------------------------------------------
CString CIpFltrAddEdit::GetIcmpTypeString( WORD dwPort )
{
WCHAR buffer[16];
CString s = _T("");
// look through our list of ICMP types and if we know the type, load
// the corresponding string, else convert the port number to string
// and return the string.
#if 0
UINT count = sizeof(g_aICMPTYPE)/sizeof(g_aICMPTYPE[0]);
for(UINT i = 0; i < count; i++)
{
if(g_aICMPTYPE[i][0] == dwPort)
{
VERIFY(s.LoadString(g_aICMPTYPE[i][1]));
return (s);
}
}
#endif
return (CString((LPWSTR)_itow(dwPort, buffer, 10)));
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::GetIcmpCodeString
//
// returns a CString representing ICMP code (if known) or a string version
// of the Code number.
//------------------------------------------------------------------------------
CString CIpFltrAddEdit::GetIcmpCodeString( WORD dwPort )
{
WCHAR buffer[16];
return (CString((LPWSTR)_itow(dwPort, buffer, 10)));
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::GetPortString
//
// returns a CString representing port type (eg., FTP, ECHO) (if known) or a string
// version of the port number
//------------------------------------------------------------------------------
CString CIpFltrAddEdit::GetPortString( DWORD dwProtocol, WORD dwPort )
{
WCHAR buffer[16];
return (CString((LPWSTR)_itow(dwPort, buffer, 10)));
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::GetPortNumber
//
// converts the port string name to port number and returns it
//------------------------------------------------------------------------------
WORD CIpFltrAddEdit::GetPortNumber( DWORD dwProtocol, CString& cStr)
{
return ((WORD)(_wtoi((const wchar_t *)cStr.GetBuffer(10))));
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::GetIcmpType
//
// returns a number version of the ICMP type string
//------------------------------------------------------------------------------
WORD CIpFltrAddEdit::GetIcmpType( CString& cStr)
{
return ((WORD)(_wtoi((const wchar_t *)cStr.GetBuffer(10))));
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::GetIcmpCode
//
// returns a number version of the ICMP code string
//------------------------------------------------------------------------------
WORD CIpFltrAddEdit::GetIcmpCode( CString& cStr)
{
return ((WORD)(_wtoi((const wchar_t *)cStr.GetBuffer(10))));
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::OnOK
//
// handles 'BN_CLICKED' notification from "OK" button
//------------------------------------------------------------------------------
void CIpFltrAddEdit::OnOK()
{
FilterListEntry * pfle = new FilterListEntry;
if ( !pfle )
{
AfxMessageBox( IDS_ERROR_NO_MEMORY );
return;
}
ZeroMemory( pfle, sizeof(FilterListEntry) );
//
// Error breakout loop.
//
do {
CString sAddr;
//
// if source network filter is specified, verify and
// save data.
//
if ( m_bSrc = IsDlgButtonChecked(IDC_AEIP_CB_SOURCE) )
{
if(m_ipSrcAddress.GetAddress(sAddr) != 4)
{
AfxMessageBox(IDS_ENTER_SRC_ADDRESS);
::SetFocus((HWND)m_ipSrcAddress);
break;
}
pfle->dwSrcAddr = INET_ADDR(sAddr);
if( m_ipSrcMask.GetAddress(sAddr) != 4)
{
AfxMessageBox(IDS_ENTER_SRC_MASK);
::SetFocus((HWND)m_ipSrcMask);
break;
}
pfle->dwSrcMask = INET_ADDR(sAddr);
if ((pfle->dwSrcAddr & pfle->dwSrcMask) != pfle->dwSrcAddr)
{
AfxMessageBox(IDS_INVALID_SRC_MASK);
::SetFocus((HWND)m_ipSrcMask);
break;
}
}
else
{
pfle->dwSrcAddr = 0;
pfle->dwSrcMask = 0;
}
//
// if destination network filter is specified,
// verify and save data.
//
if ( m_bDst = IsDlgButtonChecked(IDC_AEIP_CB_DEST) )
{
if(m_ipDstAddress.GetAddress(sAddr) != 4)
{
AfxMessageBox(IDS_ENTER_DST_ADDRESS);
::SetFocus((HWND)m_ipDstAddress);
break;
}
pfle->dwDstAddr = INET_ADDR(sAddr);
if(m_ipDstMask.GetAddress(sAddr) != 4)
{
AfxMessageBox(IDS_ENTER_DST_MASK);
::SetFocus((HWND)m_ipDstMask);
break;
}
pfle->dwDstMask = INET_ADDR(sAddr);
if ((pfle->dwDstAddr & pfle->dwDstMask) != pfle->dwDstAddr)
{
AfxMessageBox(IDS_INVALID_DST_MASK);
::SetFocus((HWND)m_ipDstMask);
break;
}
}
else
{
pfle->dwDstAddr = 0;
pfle->dwDstMask = 0;
}
//
// verify and save protocol specific data
//
CString cStr = _T("");
CString cStr2 = _T("");
int index;
switch(QueryCurrentProtocol()) {
case PROTOCOL_TCP:
pfle->dwProtocol = FILTER_PROTO_TCP;
m_cbSrcPort.GetWindowText(cStr);
pfle->wSrcPort = GetPortNumber(PROTOCOL_TCP, cStr);
m_cbDstPort.GetWindowText(cStr);
pfle->wDstPort = GetPortNumber(PROTOCOL_TCP, cStr);
break;
case PROTOCOL_TCP_ESTABLISHED:
pfle->dwProtocol = FILTER_PROTO_TCP;
pfle->fLateBound |= TCP_ESTABLISHED_FLAG;
m_cbSrcPort.GetWindowText(cStr);
pfle->wSrcPort = GetPortNumber(PROTOCOL_TCP_ESTABLISHED, cStr);
m_cbDstPort.GetWindowText(cStr);
pfle->wDstPort = GetPortNumber(PROTOCOL_TCP_ESTABLISHED, cStr);
break;
case PROTOCOL_UDP:
pfle->dwProtocol = FILTER_PROTO_UDP;
m_cbSrcPort.GetWindowText(cStr);
pfle->wSrcPort = GetPortNumber(PROTOCOL_UDP, cStr);
m_cbDstPort.GetWindowText(cStr);
pfle->wDstPort = GetPortNumber(PROTOCOL_UDP, cStr);
break;
case PROTOCOL_ICMP:
pfle->dwProtocol = FILTER_PROTO_ICMP;
m_cbSrcPort.GetWindowText(cStr);
m_cbDstPort.GetWindowText(cStr2);
// Windows NT bugs: 83110
// Default is 0xFF if none of the fields have data
if (cStr.IsEmpty() && cStr2.IsEmpty())
{
pfle->wSrcPort = FILTER_ICMP_TYPE_ANY;
pfle->wDstPort = FILTER_ICMP_CODE_ANY;
}
else
{
pfle->wSrcPort = GetIcmpType(cStr);
pfle->wDstPort = GetIcmpCode(cStr2);
}
break;
case PROTOCOL_ANY:
pfle->dwProtocol = FILTER_PROTO_ANY;
pfle->wSrcPort = pfle->wDstPort = 0;
break;
case PROTOCOL_OTHER:
m_cbSrcPort.GetWindowText(cStr);
pfle->dwProtocol = FILTER_PROTO(_wtoi((const wchar_t*)cStr.GetBuffer(16+1)));
if(pfle->dwProtocol == 0)
{
AfxMessageBox(IDS_ENTER_OTHER_PROTOCOL);
::SetFocus((HWND)m_cbSrcPort);
delete pfle;
return;
}
pfle->wSrcPort = pfle->wDstPort = 0;
break;
default:
AfxMessageBox( IDS_ERROR_SETTING_BLOCK );
delete pfle;
return;
}
//
// if this is a new filter, add it to m_ppFilterEntry
//
if (!*m_ppFilterEntry)
{
*m_ppFilterEntry = pfle;
}
else
{
FilterListEntry *pfleDst = *m_ppFilterEntry;
pfleDst-> dwSrcAddr = pfle-> dwSrcAddr;
pfleDst-> dwSrcMask = pfle-> dwSrcMask;
pfleDst-> dwDstAddr = pfle-> dwDstAddr;
pfleDst-> dwDstMask = pfle-> dwDstMask;
pfleDst-> dwProtocol = pfle-> dwProtocol;
pfleDst-> wSrcPort = pfle-> wSrcPort;
pfleDst-> wDstPort = pfle-> wDstPort;
pfleDst-> fLateBound = pfle-> fLateBound;
delete pfle;
}
// end the dialog
CBaseDialog::OnOK();
return;
}while(FALSE);
//
// error condition
//
delete pfle;
return;
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::OnCancel
//
// handles 'BN_CLICKED' notification from the Cancel button
//------------------------------------------------------------------------------
void CIpFltrAddEdit::OnCancel()
{
CBaseDialog::OnCancel();
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::GetIcmpTypeString
//
// Handles BN_CLICKED notification from "Source network" checkbox
//------------------------------------------------------------------------------
void CIpFltrAddEdit::OnCbSourceClicked()
{
m_bSrc = IsDlgButtonChecked(IDC_AEIP_CB_SOURCE);
GetDlgItem(IDC_AEIP_EB_SOURCE_ADDRESS)->EnableWindow( m_bSrc );
GetDlgItem(IDC_AEIP_EB_SOURCE_MASK)->EnableWindow( m_bSrc );
}
//------------------------------------------------------------------------------
// Function: CIpFltrAddEdit::GetIcmpTypeString
//
// Handles BN_CLICKED notification from "Destination network" checkbox
//------------------------------------------------------------------------------
void CIpFltrAddEdit::OnCbDestClicked()
{
m_bDst = IsDlgButtonChecked(IDC_AEIP_CB_DEST);
GetDlgItem(IDC_AEIP_EB_DEST_ADDRESS)->EnableWindow( m_bDst );
GetDlgItem(IDC_AEIP_EB_DEST_MASK)->EnableWindow( m_bDst );
}