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

📄 xfile.cpp

📁 NDIS HOOK实例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			);

	mAclHeader.ulCustomIPCount += AddCount;
	}
	LeaveCriticalSection(&gCriticalSectionFile);

	ODS2(_T("XFILE: Success Add CustomIP, "),
		DIPToSIP(&mpAclCustomIP[mAclHeader.ulCustomIPCount - 1].ulStartIP));

	return XERR_SUCCESS;
}

int	CAclFile::DelAclIP(XACL_IP *pAclIP, DWORD* pCount, DWORD iIndex)
{
	if(pAclIP == NULL || iIndex >= *pCount)
		return XERR_INVALID_PARAMETER;

	EnterCriticalSection(&gCriticalSectionFile);
	{
	memcpy(pAclIP + iIndex, pAclIP + iIndex + 1, (*pCount - iIndex) * ACL_IP_LENTH);
	*pCount = *pCount - 1 ;
	}
	LeaveCriticalSection(&gCriticalSectionFile);

	ODS(_T("XFILE: Success Del IP aria. "));

	return XERR_SUCCESS;
}

int	CAclFile::DelAcl(XACL *pAcl, DWORD* pCount, DWORD iIndex)
{
	if(pAcl == NULL || iIndex >= *pCount)
		return XERR_INVALID_PARAMETER;

	EnterCriticalSection(&gCriticalSectionFile);
	{
	memcpy(pAcl + iIndex, pAcl + iIndex + 1, (*pCount - iIndex) * ACL_ACL_LENTH);
	*pCount = *pCount - 1 ;
	}
	LeaveCriticalSection(&gCriticalSectionFile);

	ODS(_T("XFILE: Success Del ACL. "));

	return XERR_SUCCESS;
}

//============================================================================================
//Export function

int CAclFile::ReadAcl(BOOL IsDLL, HINSTANCE instance)	//main function
{
	int		iRet	= XERR_SUCCESS;

	if(IsDLL)
		mAppPath		= CAclFile::GetAppPath(IsDLL, instance);
	else
		mAppPath		= CAclFile::GetAppPath();

	if(mAclFile.m_hFile == NULL && (iRet = OpenAcl()) != XERR_SUCCESS)
		return iRet;

	TRY
	{
		FreeMemory();

		mAclFile.SeekToBegin();
		mAclFile.Read(&mAclHeader,ACL_HEADER_LENTH);	//read the header

		if(_tcscmp(mAclHeader.sSignature , ACL_HEADER_SIGNATURE) != 0)
		{
			ODS(_T("XFILE: Invalid signatrue, It's not the XFILTER ACL file."));
			CloseAcl();
			return XERR_FILE_INVALID_SIGNATURE;
		}

		mAclFile.Read(&mAclTime,ACL_TIME_TOTAL_LENTH);	//read the time aria
		mAclFile.Read(&mAclIntranetIP,ACL_IP_LENTH);	//read the intranet ip aria

		if(mAclHeader.ulDistrustIPCount > 0)			//read the distrust ip aria
		{
			mpAclDistrustIP	= new XACL_IP[mAclHeader.ulDistrustIPCount];
			mAclFile.ReadHuge(mpAclDistrustIP,ACL_IP_LENTH * mAclHeader.ulDistrustIPCount);
		}

		if(mAclHeader.ulTrustIPCount	> 0)			//read the trust ip aria
		{
			mpAclTrustIP	= new XACL_IP[mAclHeader.ulTrustIPCount];
			mAclFile.ReadHuge(mpAclTrustIP,ACL_IP_LENTH * mAclHeader.ulTrustIPCount);
		}

		if(mAclHeader.ulCustomIPCount	> 0)			//read the custom ip aria
		{
			mpAclCustomIP	= new XACL_IP[mAclHeader.ulCustomIPCount];
			mAclFile.ReadHuge(mpAclCustomIP,ACL_IP_LENTH * mAclHeader.ulCustomIPCount);
		}

		if(mAclHeader.ulAclCount		> 0)			//read the ACL
		{
			mpAcl			= new XACL[mAclHeader.ulAclCount];
			mAclFile.ReadHuge(mpAcl,ACL_ACL_LENTH * mAclHeader.ulAclCount);
		}
		
		CloseAcl();

		ODS(_T("XFILE: Read xacl.cfg success."));
	}
	CATCH( CFileException, e )
	{
		CloseAcl();

		ODS(_T("XFILE: Read xacl.cfg error."));
		return XERR_FILE_READ_ERROR;
	}
	END_CATCH

	return iRet;
}

int	CAclFile::SaveAcl()
{
	int		iRet;

	if((iRet = WriteAcl(mAppPath + ACL_TEMP_FILE_NAME)) != XERR_SUCCESS)
		return iRet;

	TRY
	{
		CFile::Remove(mAppPath + ACL_FILE_NAME);

		CFile::Rename(mAppPath + ACL_TEMP_FILE_NAME,mAppPath + ACL_FILE_NAME);

		ODS(_T("XFILE: Success remove xacl.cfg and rename xacl.tmp to xacl.cfg"));
	}
	CATCH( CFileException, e )
	{
		ODS(_T("XFILE: Save error."));
		return XERR_FILE_SAVE_ERROR;
	}
	END_CATCH

	return XERR_SUCCESS;
}

void CAclFile::CloseAcl()
{
	if(mAclFile.m_hFile != NULL)
	{
		mAclFile.Close();
		mAclFile.m_hFile = NULL;
	}

	ODS(_T("XFILE: Success close the acl file."));
}

int	CAclFile::AddAcl(void *pAddAcl, int AddAclCount, int AclType)
{
	switch(AclType)
	{
	case ACL_TYPE_ACL:
		return AddAclAcl((XACL*)pAddAcl,AddAclCount);

	case ACL_TYPE_DISTRUST_IP:
		return AddDistrustIP((XACL_IP*)pAddAcl,AddAclCount);

	case ACL_TYPE_TRUST_IP:
		return AddTrustIP((XACL_IP*)pAddAcl,AddAclCount);

	case ACL_TYPE_CUSTOM_IP:
		return AddCustomIP((XACL_IP*)pAddAcl,AddAclCount);

	default:
		return XERR_INVALID_PARAMETER;
	}

	return XERR_SUCCESS;
}

int	CAclFile::DelAcl(int iIndex, int AclType)
{
	switch(AclType)
	{
	case ACL_TYPE_ACL:
		return DelAcl(mpAcl, &mAclHeader.ulAclCount, iIndex);

	case ACL_TYPE_DISTRUST_IP:
		return DelAclIP(mpAclDistrustIP, &mAclHeader.ulDistrustIPCount, iIndex);

	case ACL_TYPE_TRUST_IP:
		return DelAclIP(mpAclTrustIP, &mAclHeader.ulTrustIPCount, iIndex);

	case ACL_TYPE_CUSTOM_IP:
		return DelAclIP(mpAclCustomIP, &mAclHeader.ulCustomIPCount, iIndex);

	default:
		return XERR_INVALID_PARAMETER;
	}

	return XERR_SUCCESS;
}

int	CAclFile::FreeMemory()
{
	if(mpAcl)
	{
		delete[](mpAcl);
		mpAcl				= NULL;
	}

	if(mpAclDistrustIP)
	{
		delete[](mpAclDistrustIP);
		mpAclDistrustIP		= NULL;
	}

	if(mpAclTrustIP)
	{
		delete[](mpAclTrustIP);
		mpAclTrustIP		= NULL;
	}

	if(mpAclCustomIP)
	{
		delete[](mpAclCustomIP);
		mpAclCustomIP		= NULL;
	}

	ODS(_T("XFILE: Success delete[] the ACL and IP aria memory."));

	return XERR_SUCCESS;
}

CString CAclFile::DIPToSIP(DWORD* pIP)
{
	if(pIP == NULL)
		return _T("");

	CString	s;
	BYTE	*b = (BYTE*)pIP;
	s.Format(_T("%d.%d.%d.%d"),b[3],b[2],b[1],b[0]);

	return s;
}

/*---------------------------------------------------------------------------------------------
	index from 0 start, for example:
	index:				0 1 2 3 4 5 6 7
	Binary value:		0 0 0 0 0 0 0 0
*/
int	CAclFile::GetBit(BYTE bit, int index, int count)
{
	bit <<= index;
	bit >>= (8 - count);

	return bit;
}

int CAclFile::SetBit(BYTE* bit, int index, BOOL isTrue)
{
	BYTE bOr = 0xFF,bAnd = 0x00;

	bOr <<= index;
	bOr >>= 7;
	bOr <<= (7 - index);
	bAnd = ~bOr;

	if(isTrue)
		*bit = *bit | bOr;
	else
		*bit = *bit & bAnd;

	return 0;
}

//============================================================================================
//static function

CString CAclFile::GetAppPath(BOOL IsDLL, HINSTANCE instance, BOOL IsFullPathName) 
{
	TCHAR sFilename[_MAX_PATH];
	TCHAR sDrive[_MAX_DRIVE];
	TCHAR sDir[_MAX_DIR];
	TCHAR sFname[_MAX_FNAME];
	TCHAR sExt[_MAX_EXT];

	if(IsDLL)
		GetModuleFileName(instance, sFilename, _MAX_PATH);
	else
		GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH);

	if(IsFullPathName)
		return sFilename;

	_tsplitpath(sFilename, sDrive, sDir, sFname, sExt);

	CString rVal(CString(sDrive) + CString(sDir));
	int nLen = rVal.GetLength();

	if (rVal.GetAt(nLen-1) != _T('\\'))
		rVal += _T("\\");

	return rVal;
}

CString CAclFile::GetPath(TCHAR *sFilename) 
{
	TCHAR sDrive[_MAX_DRIVE];
	TCHAR sDir[_MAX_DIR];
	TCHAR sFname[_MAX_FNAME];
	TCHAR sExt[_MAX_EXT];

	_tsplitpath(sFilename, sDrive, sDir, sFname, sExt);

	CString rVal(CString(sDrive) + CString(sDir));
	int nLen = rVal.GetLength();

	if (rVal.GetAt(nLen-1) != _T('\\'))
		rVal += _T("\\");

	return rVal;
}  

CString CAclFile::GetName(TCHAR *sFilename) 
{
	TCHAR sDrive[_MAX_DRIVE];
	TCHAR sDir[_MAX_DIR];
	TCHAR sFname[_MAX_FNAME];
	TCHAR sExt[_MAX_EXT];

	_tsplitpath(sFilename, sDrive, sDir, sFname, sExt);

	CString rVal;
	rVal.Format(_T("%s%s"), sFname, sExt);

	return rVal;
}  

⌨️ 快捷键说明

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