www.pudn.com > 18900_netwall_lite.rar > AddRuleDlg.cpp


// AddRuleDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "netwall.h" 
#include "AddRuleDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAddRuleDlg dialog 
 
 
CAddRuleDlg::CAddRuleDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CAddRuleDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CAddRuleDlg) 
	m_iSrcStartPort = 0; 
	m_iSrcEndPort   = 65540; 
	m_iDstStartPort = 0; 
	m_iDstEndPort   = 65540; 
	m_strMemo       = _T(""); 
	//}}AFX_DATA_INIT 
 
    m_nType   = ADD_RULE; 
    m_pBuffer = NULL; 
    m_pItem   = NULL; 
} 
 
void CAddRuleDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAddRuleDlg) 
	DDX_Control(pDX, IDC_RULE_MEMO,     m_ctlMemo); 
	DDX_Control(pDX, IDC_RULE_USE,      m_ctlUse); 
	DDX_Control(pDX, IDC_RULE_ACTION,   m_ctlAction); 
	DDX_Control(pDX, IDC_RULE_DIRECTION,m_ctlDirection); 
	DDX_Control(pDX, IDC_RULE_PROTOCOL, m_ctlProtocol); 
	DDX_Control(pDX, IDC_DST_END_PORT,  m_ctlDstEndPort); 
	DDX_Control(pDX, IDC_DST_START_PORT,m_ctlDstStartPort); 
	DDX_Control(pDX, IDC_SRC_END_PORT,  m_ctlSrcEndPort); 
	DDX_Control(pDX, IDC_SRC_START_PORT,m_ctlSrcStartPort); 
	DDX_Control(pDX, IDC_DST_END_IP,    m_ctlDstEndIP); 
	DDX_Control(pDX, IDC_DST_START_IP,  m_ctlDstStartIP); 
	DDX_Control(pDX, IDC_SRC_END_IP,    m_ctlSrcEndIP); 
	DDX_Control(pDX, IDC_SRC_START_IP,  m_ctlSrcStartIP); 
	DDX_Text(pDX, IDC_SRC_START_PORT,   m_iSrcStartPort); 
	DDV_MinMaxUInt(pDX, m_iSrcStartPort, 0, 65540); 
	DDX_Text(pDX, IDC_SRC_END_PORT,     m_iSrcEndPort); 
	DDV_MinMaxUInt(pDX, m_iSrcEndPort, 1, 65540); 
	DDX_Text(pDX, IDC_DST_START_PORT,   m_iDstStartPort); 
	DDV_MinMaxUInt(pDX, m_iDstStartPort, 0, 65540); 
	DDX_Text(pDX, IDC_DST_END_PORT,     m_iDstEndPort); 
	DDV_MinMaxUInt(pDX, m_iDstEndPort, 1, 65540); 
	DDX_Text(pDX, IDC_RULE_MEMO,        m_strMemo); 
	DDV_MaxChars(pDX, m_strMemo, 256); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CAddRuleDlg, CDialog) 
	//{{AFX_MSG_MAP(CAddRuleDlg) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAddRuleDlg message handlers 
 
BOOL CAddRuleDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog();	     
 
	// Initialization Protocol ComboBox 
	m_ctlProtocol.ResetContent(); 
    //m_ctlProtocol.SetItemData(m_ctlProtocol.AddString(_T("全部")), 0);     
    m_ctlProtocol.SetItemData(m_ctlProtocol.AddString(_T("TCP")),  IPPROTO_TCP); 
    m_ctlProtocol.SetItemData(m_ctlProtocol.AddString(_T("UDP")),  IPPROTO_UDP); 
    m_ctlProtocol.SetItemData(m_ctlProtocol.AddString(_T("ICMP")), IPPROTO_ICMP); 
    m_ctlProtocol.SetItemData(m_ctlProtocol.AddString(_T("IGMP")), IPPROTO_IGMP); 
    m_ctlProtocol.SetItemData(m_ctlProtocol.AddString(_T("ARP")),  PROTOCOL_ARP); 
    m_ctlProtocol.SetCurSel(0); 
 
    // Initialization Direction ComboBox 
    m_ctlDirection.ResetContent(); 
    m_ctlDirection.SetItemData(m_ctlDirection.AddString(_T("进")),  NETWALL_DIRECTION_IN); 
    m_ctlDirection.SetItemData(m_ctlDirection.AddString(_T("出")),  NETWALL_DIRECTION_OUT); 
    m_ctlDirection.SetItemData(m_ctlDirection.AddString(_T("双向")),NETWALL_DIRECTION_BOTH); 
    m_ctlDirection.SetCurSel(0); 
     
    // Initialization Action ComboBox 
    m_ctlAction.ResetContent(); 
    m_ctlAction.SetItemData(m_ctlAction.AddString(_T("通过")), NETWALL_ACTION_PASS); 
    m_ctlAction.SetItemData(m_ctlAction.AddString(_T("拒绝")), NETWALL_ACTION_DROP); 
    m_ctlAction.SetItemData(m_ctlAction.AddString(_T("日志")), NETWALL_ACTION_LOG);     
    m_ctlAction.SetCurSel(0); 
     
    if (MODIFY_RULE == m_nType) 
    { 
        ASSERT(m_pItem); 
        RULE_ITEM * pItem = m_pItem; 
         
        // Protocol 
        for (UINT i = 0; i < (UINT)m_ctlProtocol.GetCount(); i++) 
        { 
            if (m_ctlProtocol.GetItemData(i) == pItem->iProto) 
            { 
                m_ctlProtocol.SetCurSel(i); 
                break; 
            } 
        } 
                 
        // Direction 
        for (i = 0; i < (UINT)m_ctlDirection.GetCount(); i++) 
        { 
            if (m_ctlDirection.GetItemData(i) == pItem->ucDirection) 
            { 
                m_ctlDirection.SetCurSel(i); 
                break; 
            } 
        } 
                 
        // Action 
        for (i = 0; i < (UINT)m_ctlAction.GetCount(); i++) 
        { 
            if (m_ctlAction.GetItemData(i) == pItem->ucAction) 
            { 
                m_ctlAction.SetCurSel(i); 
                break; 
            } 
        } 
                 
        // Use         
        if (0 == pItem->bUse)m_ctlUse.SetCheck(1); 
                 
        // Source Start IP 
        m_ctlSrcStartIP.SetAddress(pItem->ulSrcStartIp); 
                 
        // Source End IP 
        m_ctlSrcEndIP.SetAddress(pItem->ulSrcEndIp); 
                 
        // Source StartPort 
        m_iSrcStartPort = pItem->usSrcStartPort; 
                 
        // Source End Port 
        m_iSrcEndPort = pItem->usSrcEndPort; 
                 
        // Destination Start IP 
        m_ctlDstStartIP.SetAddress(pItem->ulDestStartIp); 
                 
        // Destination End IP 
        m_ctlDstEndIP.SetAddress(pItem->ulDestEndIp); 
         
        // Destination Start Port 
        m_iDstStartPort = pItem->usDestStartPort; 
                 
        // Destination End Port 
        m_iDstEndPort = pItem->usDestEndPort; 
                 
        // Description 
        m_strMemo = _T(pItem->chMsg); 
         
        UpdateData(FALSE); 
    } 
 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CAddRuleDlg::OnOK()  
{ 
	UpdateData(); 
 
    BYTE    b1, b2, b3, b4; 
    CString strError = _T(""); 
 
    do 
    {     
        // Source Start IP 
        if (m_ctlSrcStartIP.IsBlank()) 
        { 
            strError = _T("请输入源起始地址!"); 
            m_ctlSrcStartIP.SetFieldFocus(0); 
            break; 
        } 
                 
        int nonBlankCount = m_ctlSrcStartIP.GetAddress(b1, b2, b3, b4); 
        if (4 != nonBlankCount) 
        { 
            strError = _T("输入的源起始地址不正确!"); 
            m_ctlSrcStartIP.SetFieldFocus(0); 
            break; 
        } 
 
        // Source End IP 
        if (m_ctlSrcEndIP.IsBlank()) 
        { 
            strError = _T("请输入源结束地址!"); 
            m_ctlSrcEndIP.SetFieldFocus(0); 
            break; 
        } 
        nonBlankCount = m_ctlSrcEndIP.GetAddress(b1, b2, b3, b4); 
        if (4 != nonBlankCount) 
        { 
            strError = _T("输入的源结束地址不正确!"); 
            m_ctlSrcEndIP.SetFieldFocus(0); 
            break; 
        } 
 
        // Source Port 
        if (m_iSrcStartPort > m_iSrcEndPort) 
        { 
            strError = _T("输入的源起始端口必须小于或等于源结束端口!"); 
            m_ctlSrcStartPort.SetFocus(); 
            break; 
        } 
 
        // Destination Start IP 
        if (m_ctlDstStartIP.IsBlank()) 
        { 
            strError = _T("请输入目的起始地址!"); 
            m_ctlDstStartIP.SetFieldFocus(0); 
            break; 
        } 
        nonBlankCount = m_ctlDstStartIP.GetAddress(b1, b2, b3, b4); 
        if (4 != nonBlankCount) 
        { 
            strError = _T("输入的目的起始地址不正确!"); 
            m_ctlDstStartIP.SetFieldFocus(0); 
            break; 
        } 
         
        // Destination End IP 
        if (m_ctlDstEndIP.IsBlank()) 
        { 
            strError = _T("请输入目的结束地址!"); 
            m_ctlDstEndIP.SetFieldFocus(0); 
            break; 
        } 
        nonBlankCount = m_ctlDstEndIP.GetAddress(b1, b2, b3, b4); 
        if (4 != nonBlankCount) 
        { 
            strError = _T("输入的目的结束地址不正确!"); 
            m_ctlDstEndIP.SetFieldFocus(0); 
            break; 
        } 
         
        // Destination Port 
        if (m_iDstStartPort > m_iDstEndPort) 
        { 
            strError = _T("输入的目的起始端口必须小于或等于目的结束端口!");             
            m_ctlDstStartPort.SetFocus(); 
            m_ctlDstStartPort.SetSel(0, -1); 
            break; 
        } 
 
    } while (FALSE); 
 
    // Error Dealwith 
    if (! strError.IsEmpty() && strError.GetLength() > 0) 
    { 
        AfxMessageBox(strError); 
        return; 
    } 
 
    // Create A Rule Item 
    UINT  nMemoLen = 0;     
    if (! m_strMemo.IsEmpty() && 1 < m_strMemo.GetLength()) 
    { 
        nMemoLen = m_strMemo.GetLength(); 
    } 
     
    try 
    {   
        DWORD dwRuleSize = sizeof(RULE_ITEM) + nMemoLen; 
         
        m_pBuffer = new BYTE[dwRuleSize]; 
     
        ASSERT(m_pBuffer); 
 
        RtlZeroMemory(m_pBuffer, dwRuleSize); 
        RULE_ITEM * pItem = (PRULE_ITEM)m_pBuffer; 
     
        // Base member 
        pItem->cbSize      = dwRuleSize; 
        pItem->iProto      = m_ctlProtocol.GetItemData(m_ctlProtocol.GetCurSel()); 
        pItem->ucDirection = (UCHAR)m_ctlDirection.GetItemData(m_ctlDirection.GetCurSel()); 
        pItem->ucAction    = (UCHAR)m_ctlAction.GetItemData(m_ctlAction.GetCurSel()); 
        pItem->bUse        = m_ctlUse.GetCheck() == 1 ? 0 : 1; 
 
        // Source member 
        m_ctlSrcStartIP.GetAddress(b1, b2, b3, b4);         
        pItem->ulSrcStartIp = b1 << 24 | b2 << 16 | b3 << 8 | b4; 
         
        m_ctlSrcEndIP.GetAddress(b1, b2, b3, b4);         
        pItem->ulSrcEndIp = b1 << 24 | b2 << 16 | b3 << 8 | b4; 
        if (0 == pItem->ulSrcEndIp) 
        { 
            pItem->ulSrcEndIp = 0xFFFFFFFF; 
        } 
 
        pItem->usSrcStartPort = m_iSrcStartPort; 
        pItem->usSrcEndPort   = m_iSrcEndPort; 
        if (0 == pItem->usSrcEndPort) 
        { 
            pItem->usSrcEndPort = 0xFFFF; 
        } 
 
        // Destination member 
        m_ctlDstStartIP.GetAddress(b1, b2, b3, b4);         
        pItem->ulDestStartIp = b1 << 24 | b2 << 16 | b3 << 8 | b4; 
     
        m_ctlDstEndIP.GetAddress(b1, b2, b3, b4);         
        pItem->ulDestEndIp = b1 << 24 | b2 << 16 | b3 << 8 | b4;     
        if (0 == pItem->ulDestEndIp) 
        { 
            pItem->ulDestEndIp = 0xFFFFFFFF; 
        } 
 
        pItem->usDestStartPort = m_iSrcStartPort; 
        pItem->usDestEndPort   = m_iSrcEndPort; 
        if (0 == pItem->usDestEndPort) 
        { 
            pItem->usDestEndPort = 0xFFFF; 
        } 
     
        // Memo member 
        if (! m_strMemo.IsEmpty()) 
        {         
            _tcsncpy(&pItem->chMsg[0], m_strMemo, m_strMemo.GetLength()); 
        } 
    } 
    catch (...) 
    { 
        AfxMessageBox(_T("设置规则出现异常!")); 
 
        if (NULL != m_pBuffer) 
        { 
            delete []m_pBuffer; 
            m_pBuffer = NULL; 
        } 
    } 
     
	CDialog::OnOK(); 
}