📄 xcommon.cpp
字号:
//-----------------------------------------------------------
/*
工程: 费尔个人防火墙
网址: 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 + -