⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acl.cpp

📁 NDIS HOOK实例
💻 CPP
字号:
// Acl.cpp : implementation file
//

#include "stdafx.h"
#include "Property.h"
#include "Acl.h"

//owner add
#include "GuiRes.h"
#include "AclSet.h"
#include "MainSheet.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAcl property page

CAclSet*			dlgAclSet	= NULL;
extern CAclFile		m_AclFile;
extern CPropertyApp theApp;
extern CMainSheet	*dlg;

IMPLEMENT_DYNCREATE(CAcl, CPropertyPage)

// static class member of variable
CListCtrl	CAcl::m_ListAcl;

CAcl::CAcl() : CPropertyPage(CAcl::IDD)
{
	//{{AFX_DATA_INIT(CAcl)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

CAcl::~CAcl()
{
}

void CAcl::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAcl)
	DDX_Control(pDX, IDC_ACL_LIST		, m_ListAcl);
	DDX_Control(pDX, IDC_ACL_RADIO_PASS	, m_RadioPass);
	DDX_Control(pDX, IDC_ACL_RADIO_QUERY, m_RadioQuery);
	DDX_Control(pDX, IDC_ACL_RADIO_DENY	, m_RadioDeny);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAcl, CPropertyPage)
	//{{AFX_MSG_MAP(CAcl)
	ON_BN_CLICKED(IDC_ACL_BUTTON_ADD		, OnAclButtonAdd)
	ON_BN_CLICKED(IDC_ACL_BUTTON_EDIT		, OnAclButtonEdit)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_ACL_LIST	, OnItemchangedAclList)
	ON_NOTIFY(NM_DBLCLK, IDC_ACL_LIST		, OnDblclkAclList)
	ON_NOTIFY(NM_CLICK, IDC_ACL_LIST		, OnClickAclList)
	ON_BN_CLICKED(IDC_ACL_BUTTON_DELETE		, OnAclButtonDelete)
	ON_BN_CLICKED(IDC_ACL_RADIO_DENY		, OnAclRadioDeny)
	ON_BN_CLICKED(IDC_ACL_RADIO_PASS		, OnAclRadioPass)
	ON_BN_CLICKED(IDC_ACL_RADIO_QUERY		, OnAclRadioQuery)
	ON_WM_HELPINFO()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//=============================================================================================
// CAcl message handlers

BOOL CAcl::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();

	InitDlgResource();

	return TRUE;
}

//---------------------------------------------------------------------------------------------
//initialize dialog's resource

void CAcl::InitDlgResource()
{
	SetWindowText(GUI_TAB_ACL);
	SetDlgItemText(IDC_ACL_APPLICATION_SET_LABLE	,GUI_ACL_APPLICATION_SET_LABLE);
	SetDlgItemText(IDC_ACL_RADIO_PASS				,GUI_ACL_RADIO_PASS);
	SetDlgItemText(IDC_ACL_RADIO_QUERY				,GUI_ACL_RADIO_QUERY);
	SetDlgItemText(IDC_ACL_RADIO_DENY				,GUI_ACL_RADIO_DENY);
	SetDlgItemText(IDC_ACL_SET_LABLE				,GUI_ACL_SET_LABLE);
	SetDlgItemText(IDC_ACL_BUTTON_ADD				,GUI_ACL_BUTTON_ADD);
	SetDlgItemText(IDC_ACL_BUTTON_EDIT				,GUI_ACL_BUTTON_EDIT);
	SetDlgItemText(IDC_ACL_BUTTON_DELETE			,GUI_ACL_BUTTON_DELETE);

	InitList(&m_ListAcl);
	
	Refresh();
}

void CAcl::Refresh()
{
	m_ListAcl.DeleteAllItems();
	m_RadioPass.SetCheck(FALSE);
	m_RadioQuery.SetCheck(FALSE);
	m_RadioDeny.SetCheck(FALSE);

	for(DWORD i = 0; i < m_AclFile.mAclHeader.ulAclCount; i++)
		ListAddOne(m_AclFile.mpAcl + i, !i);

	m_iType = m_AclFile.GetBit(m_AclFile.mAclHeader.bSet,4,2);	//bit 5, 6

	if(m_iType == 0)
		m_RadioPass	.SetCheck(TRUE);
	else if(m_iType == 1)
		m_RadioQuery.SetCheck(TRUE);
	else if(m_iType == 2)
		m_RadioDeny	.SetCheck(TRUE);
	else
	{
		AfxMessageBox(GUI_ACL_MESSAGE_ACL_FILE_SET_ERROR);
		return;
	}
}

void CAcl::InitList(CListCtrl *mList)
{
	ListView_SetExtendedListViewStyle(mList->m_hWnd	,
		LVS_EX_GRIDLINES  | LVS_EX_FULLROWSELECT
		); 
	mList->InsertColumn(0, GUI_ACL_LIST_ACTION,
		LVCFMT_LEFT, 
		GUI_ACL_LIST_ACTION_SIZE
		);
	mList->InsertColumn(1, GUI_ACL_LIST_APPLICATION	,
		LVCFMT_LEFT, 
		GUI_ACL_LIST_APPLICATION_SIZE + 40
		);
	mList->InsertColumn(2, GUI_ACL_LIST_DIRECTION,
		LVCFMT_LEFT, 
		GUI_ACL_LIST_DIRECTION_SIZE
		);
	mList->InsertColumn(3, GUI_ACL_LIST_REMOTE_NET,
		LVCFMT_LEFT, 
		GUI_ACL_LIST_REMOTE_NET_SIZE+ 30
		);
	mList->InsertColumn(4, GUI_ACL_LIST_ACCESS_TIME,
		LVCFMT_LEFT, 
		GUI_ACL_LIST_ACCESS_TIME_SIZE + 30
		);
	mList->InsertColumn(5, GUI_ACL_LIST_TYPE_PORT,
		LVCFMT_LEFT, 
		GUI_ACL_LIST_TYPE_PORT_SIZE
		);
	mList->InsertColumn(6, GUI_ACL_LIST_APPLICATION_PATH,
		LVCFMT_LEFT,
		GUI_ACL_LIST_APPLICATION_PATH_SIZE + 30
		);
	mList->InsertColumn(7, GUI_ACL_LIST_MEMO,
		LVCFMT_LEFT,
		GUI_ACL_LIST_MEMO_SIZE + 30
		);
}

int CAcl::ListAddOne(void* mpAcl, BOOL isSelected, BOOL isEdit, int EditIndex)
{
	if(m_ListAcl.m_hWnd == NULL)
		return 0;

	XACL*	mAcl	= (XACL*)mpAcl;
	int		iIndex	= m_ListAcl.GetItemCount();

	if(isEdit) 
		iIndex = EditIndex;
	else 
		m_ListAcl.InsertItem(iIndex, GUI_ACTION[mAcl->bAction]);

	m_ListAcl.SetItemText(iIndex, 0, GUI_ACTION[mAcl->bAction]);
	m_ListAcl.SetItemText(iIndex, 1, CAclFile::GetName(mAcl->sApplication));
	m_ListAcl.SetItemText(iIndex, 2, GUI_DIRECTION[mAcl->bDirection]);
	m_ListAcl.SetItemText(iIndex, 3, GUI_NET[mAcl->bRemoteNetType]);
	m_ListAcl.SetItemText(iIndex, 4, GUI_TIME[mAcl->bAccessTimeType]);

	CString tmpStr;
	tmpStr.Format(_T("%s/%u"),GUI_SERVICE_TYPE[mAcl->bServiceType], mAcl->uiServicePort);
	m_ListAcl.SetItemText(iIndex,5,tmpStr);
	m_ListAcl.SetItemText(iIndex,6, CAclFile::GetPath(mAcl->sApplication));
	m_ListAcl.SetItemText(iIndex,7,mAcl->sMemo);

	if(isSelected)
	{
		m_ListAcl.EnsureVisible(iIndex,TRUE);
		m_ListAcl.SetItemState(iIndex,LVIS_SELECTED,LVIS_SELECTED);
	}

	return 0;
}

void CAcl::OnAclButtonAdd() 
{
	if(!GetDlgItem(IDC_ACL_BUTTON_ADD)->IsWindowEnabled()) 
		return;

	if(InitAddAcl(_T("")) != 0)
		return;

	GetOwner()->GetDlgItem(ID_APPLY_NOW)->EnableWindow(TRUE);
}

int CAcl::InitAddAcl(TCHAR* sPathName, BOOL EnableComboApplication) 
{
	if(MAX_ACL != 0 && m_AclFile.mAclHeader.ulAclCount >= MAX_ACL)
	{
		AfxMessageBox(GUI_ACL_MESSAGE_MAX_ACL);
		return -1;
	}

	XACL m_tmpAcl;

	m_tmpAcl.bAccessTimeType	= ACL_TIME_TYPE_ALL;
	m_tmpAcl.bAction			= ACL_ACTION_PASS;
	m_tmpAcl.bDirection			= ACL_DIRECTION_IN_OUT;
	m_tmpAcl.bRemoteNetType		= ACL_NET_TYPE_ALL;
	m_tmpAcl.bServiceType		= ACL_SERVICE_TYPE_ALL;
	_tcscpy(m_tmpAcl.sApplication, _T(""));
	_tcscpy(m_tmpAcl.sMemo		, _T(""));
	m_tmpAcl.uiServicePort		= ACL_SERVICE_PORT_ALL;
	m_tmpAcl.ulAclID			= 0;
	
	CAclSet::m_EnableComboApplication	= EnableComboApplication;
	CAclSet::m_tmpAcl					= m_tmpAcl;
	CAclSet::m_sPathName				= sPathName;

	int iRet = ShowDlg();

	if(iRet == IDCANCEL)
		return IDCANCEL;

	m_tmpAcl = CAclSet::m_tmpAcl;

	if(m_AclFile.AddAcl(&m_tmpAcl,1) != 0)
	{
		AfxMessageBox(GUI_ACL_MESSAGE_ADD_ACL_ERROR);
		return -1;
	}

	if(m_ListAcl.m_hWnd != NULL)
		ListAddOne(&CAclSet::m_tmpAcl,TRUE);

	return 0;
}

BOOL WINAPI CAcl::AddAclQuery(TCHAR* sPathName, BOOL EnableComboApplication)
{
	ODS("XFILTER.EXE: AddAclQuery");

	int iRet = InitAddAcl(sPathName, EnableComboApplication);

	if(iRet != 0)
		return FALSE;

	if(m_AclFile.SaveAcl() != XERR_SUCCESS)
	{
		AfxMessageBox(GUI_ACL_MESSAGE_SAVE_ACL_ERROR);
		return FALSE;
	}

	if(!theApp.InitDllData())
	{
		AfxMessageBox(GUI_ACL_MESSAGE_INIT_DLL_DATA_ERROR);
		return FALSE;
	}

	if(dlg != NULL)
		dlg->GetDlgItem(ID_APPLY_NOW)->EnableWindow(FALSE);

	return TRUE;
}

void CAcl::OnAclButtonEdit() 
{
	if(!GetDlgItem(IDC_ACL_BUTTON_EDIT)->IsWindowEnabled())
		return;

	if(m_iListIndex < 0) 
		return;

	CAclSet::m_tmpAcl = m_AclFile.mpAcl[m_iListIndex];
	CAclSet::m_EnableComboApplication = TRUE;

	int iRet = ShowDlg();

	if(iRet == IDCANCEL) 
		return;

	m_AclFile	.mpAcl[m_iListIndex] = CAclSet::m_tmpAcl;
	ListAddOne	(&CAclSet::m_tmpAcl,FALSE,TRUE,m_iListIndex);
	GetOwner()	-> GetDlgItem(ID_APPLY_NOW) -> EnableWindow(TRUE);
}

int CAcl::ShowDlg()
{
	EnableMenu(FALSE);

	dlgAclSet	= new CAclSet;

	int iRet	= dlgAclSet->DoModal();

	delete		dlgAclSet;
	dlgAclSet	= NULL;

	EnableMenu(TRUE);

	return iRet;
}

UINT CAcl::EnableMenu(UINT bEnable)
{
	theApp.m_EnablePacketMonitor = bEnable;
	theApp.m_EnableQueryLog		 = bEnable;
	theApp.m_EnableAcl			 = bEnable;
	theApp.m_EnableSystemSet	 = bEnable;
	theApp.m_EnableAbout		 = bEnable;

	if(!CAclSet::m_EnableComboApplication)
	{
		theApp.m_EnableExit			= bEnable;
		theApp.m_EnableContolFrame	= bEnable;
	}

	return bEnable;
}

void CAcl::OnItemchangedAclList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	*pResult = 0;

	if((m_iListIndex = pNMListView->iItem) == -1) 
		return;

	EnableButton(TRUE);
}

void CAcl::EnableButton(BOOL bEnable)
{
	GetDlgItem(IDC_ACL_BUTTON_EDIT)		->EnableWindow(bEnable);
	GetDlgItem(IDC_ACL_BUTTON_DELETE)	->EnableWindow(bEnable);
}

void CAcl::OnDblclkAclList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

	if((m_iListIndex = pNMListView->iItem) != -1) 
		OnAclButtonEdit();

	*pResult = 0;
}

void CAcl::OnClickAclList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

	if((m_iListIndex = pNMListView->iItem) == -1) 
		EnableButton(FALSE);

	*pResult = 0;
}

void CAcl::OnAclButtonDelete() 
{
	if(!GetDlgItem(IDC_ACL_BUTTON_DELETE)->IsWindowEnabled())
		return;

	if(m_iListIndex < 0)
		return;

	int tmpIndex = m_iListIndex;

	m_AclFile.DelAcl(m_iListIndex, ACL_TYPE_ACL);
	m_ListAcl.DeleteItem(m_iListIndex);
	GetOwner()->GetDlgItem(ID_APPLY_NOW)->EnableWindow(TRUE);
	if(m_ListAcl.GetItemCount() <= 0)
	{
		EnableButton(FALSE);
		return;
	}

	if(tmpIndex == m_ListAcl.GetItemCount())	
		tmpIndex -- ;

	m_ListAcl.SetItemState(tmpIndex, LVIS_SELECTED, LVIS_SELECTED);
}

void CAcl::OnAclRadioDeny() 
{
	SetType(2, TRUE, FALSE); //binary 10
}

void CAcl::OnAclRadioPass() 
{
	SetType(0, FALSE, FALSE); //binary 00
}

void CAcl::OnAclRadioQuery() 
{
	SetType(1, FALSE, TRUE); //binary 01
}

BOOL CAcl::SetType(int type, BOOL bit4, BOOL bit5)
{
	if(type == m_iType)		
		return FALSE;

	m_AclFile.SetBit(&m_AclFile.mAclHeader.bSet, 4, bit4);
	m_AclFile.SetBit(&m_AclFile.mAclHeader.bSet, 5, bit5);
	m_iType = type;
	GetOwner()->GetDlgItem(ID_APPLY_NOW)->EnableWindow(TRUE);

	return TRUE;
}

BOOL CAcl::OnHelpInfo(HELPINFO* pHelpInfo) 
{
	theApp.WinHelp(6, HH_HELP_CONTEXT);

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -