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

📄 xcommon.cpp

📁 这是一本学习 window编程的很好的参考教材
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//-----------------------------------------------------------
/*
	工程:		费尔个人防火墙
	网址:		http://www.xfilt.com
	电子邮件:	xstudio@xfilt.com
	版权所有 (c) 2002 朱艳辉(费尔安全实验室)

	版权声明:
	---------------------------------------------------
		本电脑程序受著作权法的保护。未经授权,不能使用
	和修改本软件全部或部分源代码。凡擅自复制、盗用或散
	布此程序或部分程序或者有其它任何越权行为,将遭到民
	事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。
	
		凡通过合法途径购买此源程序者(仅限于本人),默认
	授权允许阅读、编译、调试。调试且仅限于调试的需要才
	可以修改本代码,且修改后的代码也不可直接使用。未经
	授权,不允许将本产品的全部或部分代码用于其它产品,
	不允许转阅他人,不允许以任何方式复制或传播,不允许
	用于任何方式的商业行为。	

    ---------------------------------------------------	
*/
//-----------------------------------------------------------
//
// 公用操作函数
//
//

#include "stdafx.h"
#include "xcommon.h"

#ifdef XF_COMMON_FUNCTION

//
// 判断当前操作系统是Win9x还是NT
//
BOOL IsWin9x()
{
	OSVERSIONINFO VerInfo;  
	VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	GetVersionEx(&VerInfo);

	if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
		return TRUE;
	else if(VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT 
		) // && (VerInfo.dwMajorVersion == 4 || VerInfo.dwMajorVersion == 5))
		return FALSE;
	return FALSE;
}

//
// 2002/08/21 add
// 得到当前操作系统版本
//
int GetWindowsVersion()
{
	OSVERSIONINFO VerInfo;  
	VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	GetVersionEx(&VerInfo);

	if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
		return WINDOWS_VERSION_9X;
	else if(VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
	{
		if(VerInfo.dwMajorVersion == 4)
			return WINDOWS_VERSION_NT;
		else if(VerInfo.dwMajorVersion == 5 && VerInfo.dwMinorVersion == 0)
			return WINDOWS_VERSION_2000;
		else 
			return WINDOWS_VERSION_XP;
	}
	return WINDOWS_VERSION_NONE;
}

//
// 将数值IP转化为字符串IP
//
CString WINAPI 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	WINAPI GetBit(BYTE bit, int index, int count)
{
	bit <<= index;
	bit >>= (8 - count);

	return bit;
}

//
// 设置字节中的一位
//
int WINAPI 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;
}

//
// 得到应用程序路径
//
CString WINAPI 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 WINAPI 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 WINAPI GetName(TCHAR *sFilename, BOOL IsIncludeExt) 
{
	TCHAR sDrive[_MAX_DRIVE];
	TCHAR sDir[_MAX_DIR];
	TCHAR sFname[_MAX_FNAME];
	TCHAR sExt[_MAX_EXT];

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

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

	return rVal;
}

//
// 制作一个安全属性文件,在CreateFileMapping时使用
//
SECURITY_ATTRIBUTES *GetSecurityAttributes()
{
	static BOOL bIsInitialize = FALSE;
	static SECURITY_ATTRIBUTES SecurityAttributes;
	static SECURITY_DESCRIPTOR SecurityDescriptor;

	OSVERSIONINFO VerInfo;  
	VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	GetVersionEx(&VerInfo);
	if(VerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
		return NULL;

	if(bIsInitialize) return &SecurityAttributes;

	if(!InitializeSecurityDescriptor(&SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION)
		|| !SetSecurityDescriptorDacl(&SecurityDescriptor, TRUE, NULL, FALSE))
		return NULL;

	SecurityAttributes.nLength = sizeof(SecurityAttributes); 
	SecurityAttributes.lpSecurityDescriptor	= &SecurityDescriptor;
	SecurityAttributes.bInheritHandle = FALSE; 

	bIsInitialize = TRUE;

	return &SecurityAttributes;
}


HANDLE m_DriverHandle = NULL;

//
// 打开nDisHK.VXD或nDisHK.SYS
//
HANDLE XF_OpenDriver()
{
	if(m_DriverHandle != NULL)
		return m_DriverHandle;

	m_DriverHandle = CreateFile(DRIVER_NAME,
          GENERIC_READ | GENERIC_WRITE,
          0,
          0,
          CREATE_NEW,
          FILE_ATTRIBUTE_NORMAL,
          0
          );

	if(m_DriverHandle == (HANDLE)0xFFFFFFFF)
		m_DriverHandle = NULL;

	return m_DriverHandle;
}

//
// 通知驱动程序增加SPI过滤的端口
//
//BOOL XF_AddSpiPort(WORD wPort)
//{
//	HANDLE hHandle = XF_OpenDriver();
//	if(hHandle == NULL)
//		return FALSE;
//
//	DWORD dwByteCount = 0;
//	BOOL result = DeviceIoControl(hHandle, 
//					IOCTL_NDISHK_ADD_SPI_PORT,  
//					&wPort,					
//					sizeof(wPort),	
//					NULL,				
//					0,						
//					&dwByteCount,					
//					NULL					
//					);
//	return result;
//}
//
////
//// 通知驱动程序删除SPI过滤的端口
////
//BOOL XF_DeleteSpiPort(WORD wPort)
//{
//	HANDLE hHandle = XF_OpenDriver();
//	if(hHandle == NULL)
//		return FALSE;
//
//	DWORD dwByteCount = 0;
//	BOOL result = DeviceIoControl(hHandle, 
//					IOCTL_NDISHK_DELETE_SPI_PORT,  
//					&wPort,	
//					sizeof(wPort),	
//					NULL,				
//					0,						
//					&dwByteCount,					
//					NULL					
//					);
//	return result;
//}

//
// 通知驱动程序保存PKF.EXE的进程句柄
//
BOOL XF_SetPKFHandle()
{
	HANDLE hHandle = XF_OpenDriver();
	if(hHandle == NULL)
		return FALSE;

	DWORD dwByteCount = 0;
	BOOL result = DeviceIoControl(hHandle, 
					IOCTL_NDISHK_SET_PKF_HANDLE,  
					NULL,	
					0,	
					NULL,				
					0,						
					&dwByteCount,					
					NULL					
					);
	return result;
}

//
// 设置驱动程序的过滤模式
//
BOOL XF_SetFilterMode(BOOL bFilterMode)
{
	HANDLE hHandle = XF_OpenDriver();
	if(hHandle == NULL)
		return FALSE;

	DWORD dwFilterMode = bFilterMode;
	DWORD dwByteCount = 0;
	BOOL result = DeviceIoControl(hHandle, 
					IOCTL_NDISHK_SET_FILTER_MODE,  
					&dwFilterMode,	
					sizeof(dwFilterMode),	
					NULL,				
					0,						
					&dwByteCount,					
					NULL					
					);
	return result;
}

//
// 从驱动程序获取封包缓冲区地址
//
BOOL XF_ReadBufferPoint(PPACKET_BUFFER_POINT pBufferPoint)
{
	HANDLE hHandle = XF_OpenDriver();
	if(hHandle == NULL)
		return FALSE;

	DWORD dwByteCount = 0;
	BOOL result = DeviceIoControl(hHandle, 
					IOCTL_NDISHK_GET_BUFFER_POINT,  
					NULL,					
					0,	
					pBufferPoint,				
					sizeof(PACKET_BUFFER_POINT),						
					&dwByteCount,					
					NULL					
					);

#ifdef DEBUG
	char buf[256];
	sprintf(buf, "Result: %d, MaxCount:%d, pPacket:0x%08X, ReadIndex:%d, WriteIndex:%d\n"
		, result
		, pBufferPoint->MaxCount
		, pBufferPoint->pPacket 
		, pBufferPoint->ReadIndex
		, pBufferPoint->WriteIndex
		);
	OutputDebugString(buf);
#endif

	return result;
}

//
// 从驱动程序获取当前连线的数据缓冲区
//
BOOL XF_ReadDirectionPoint(PDIRECTION_POINT pDirectionPoint)
{
	HANDLE hHandle = XF_OpenDriver();
	if(hHandle == NULL)
		return FALSE;

	DWORD dwByteCount = 0;
	BOOL result = DeviceIoControl(hHandle, 
					IOCTL_NDISHK_GET_DIRECTION_POINT,  
					NULL,					
					0,	
					pDirectionPoint,				
					sizeof(DIRECTION_POINT),						
					&dwByteCount,					
					NULL					
					);

#ifdef DEBUG
	char buf[256];
	sprintf(buf, "Result: %d, DirectionCount:%d, pDirection:0x%08X, pDelete:0x%08X\n"
		, result
		, pDirectionPoint->DirectionCount 
		, pDirectionPoint->pDirection
		, pDirectionPoint->pDelete 
		);
	OutputDebugString(buf);
#endif

	return result;
}

//
// 通知驱动程序增加网上邻居名字记录
//
BOOL XF_AddNetBiosName(char* pName, int nLenth)
{
	HANDLE hHandle = XF_OpenDriver();
	if(hHandle == NULL)
		return FALSE;

	DWORD dwByteCount = 0;
	BOOL result =  DeviceIoControl(hHandle, 
						IOCTL_NDISHK_ADD_NETBIOS_NAME,  
						pName,					
						nLenth,	
						NULL,				
						0,						
						&dwByteCount,					
						NULL					
						);

	return result;
}

PNAME_LIST	m_pFirstNameList = NULL;

//
// 从驱动程序得到网上邻居名字记录的地址
//
PNAME_LIST XF_GetNameList()
{
	HANDLE hHandle = XF_OpenDriver();
	if(hHandle == NULL)
		return FALSE;

	if(m_pFirstNameList != NULL)
		return m_pFirstNameList;

	DWORD dwByteCount = 0;
	BOOL result =  DeviceIoControl(hHandle, 
						IOCTL_NDISHK_GET_NETBIOS_NAME,  
						NULL,					
						0,	
						&m_pFirstNameList,				
						sizeof(m_pFirstNameList),						
						&dwByteCount,					
						NULL					
						);
	return m_pFirstNameList;
}

//
// 从驱动程序得到网上邻居名字的所有记录
//
DWORD XF_GetNameListEx(char* pBuffer, DWORD nSize)
{
	HANDLE hHandle = XF_OpenDriver();
	if(hHandle == NULL)
		return FALSE;

	DWORD dwByteCount = 0;
	BOOL result =  DeviceIoControl(hHandle, 
						IOCTL_NDISHK_GET_NETBIOS_NAME_LIST,  
						NULL,					
						0,	
						pBuffer,				
						nSize,						
						&dwByteCount,					
						NULL					
						);
	return dwByteCount;
}

//
// 调用驱动程序从网上邻居的名字得到IP
//
DWORD XF_GetIpFromName(char* Name)
{
	HANDLE hHandle = XF_OpenDriver();
	if(hHandle == NULL)
		return FALSE;

	DWORD dwIp = 0;
	DWORD dwByteCount = 0;
	BOOL result =  DeviceIoControl(hHandle, 
						IOCTL_NDISHK_GET_IP_FROM_NAME,  
						Name,					
						strlen(Name) + 1,	
						&dwIp,				
						sizeof(dwIp),						
						&dwByteCount,					
						NULL					
						);
	return dwIp;
}

//
// 调用驱动程序从IP得到网上邻居的名字
//
BOOL XF_GetNameFromIp(DWORD dwIp, char* Name)
{
	HANDLE hHandle = XF_OpenDriver();
	if(hHandle == NULL)
		return FALSE;

	DWORD dwByteCount = 0;
	BOOL result =  DeviceIoControl(hHandle, 
						IOCTL_NDISHK_GET_NAME_FROM_IP,  
						&dwIp,					
						sizeof(dwIp),	
						Name,				
						sizeof(Name),						
						&dwByteCount,					
						NULL					
						);
	return result;
}

//
// 2002/08/21 add
// call nDisHK.sys to refresh hook send
//
BOOL XF_RefreshHookSend()
{

⌨️ 快捷键说明

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