//============================================================================ // 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 #include #include } #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 ); }