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

📄 driverlist.c

📁 一个截取网络包的驱动。它与DDK文档正是NDIS中间驱动不同
💻 C
字号:
/////////////////////////////////////////////
//		一些集合数组及它们的管理函数
//
//////////////////////////////////////////////




/////////////////////////////////////////////
//		TCPIP绑定句柄集合及管理函数
//

#define	MAX_TCPIPBIND		8
SAdapterHandle *g_pTcpIpBindHandles[MAX_TCPIPBIND];
NDIS_HANDLE	g_TcpIpHandle=NULL;
int g_nTcpIpBindNum=0;

//增加TCPIP绑定句柄
void AddTcpIpBindHandle(SAdapterHandle *pTcpIpBindHandle)
{
	if(g_nTcpIpBindNum<MAX_TCPIPBIND)
	{
		g_pTcpIpBindHandles[g_nTcpIpBindNum++]=pTcpIpBindHandle;
	}
}

//删除TCPIP绑定句柄
void DelTcpIpBindHandle(SAdapterHandle *pTcpIpBindHandle)
{
	int i;
	for(i=0;i<g_nTcpIpBindNum;i++)
	{
		if(g_pTcpIpBindHandles[i]==pTcpIpBindHandle)
		{
			int j;
			for(j=i;j<g_nTcpIpBindNum-1;j++)
			{
				g_pTcpIpBindHandles[j]=g_pTcpIpBindHandles[j+1];
			}

			g_nTcpIpBindNum--;
			DbgPrint("!!!!! DelTcpIpBindHandle\n");
			break;
		}
	}
}

//是否TCPIP绑定句柄
int IsTcpIpBindHandle(SAdapterHandle *pTcpIpBindHandle)
{
	int i;

	for(i=0;i<g_nTcpIpBindNum;i++)
	{
		if(g_pTcpIpBindHandles[i]==pTcpIpBindHandle)
		{
			return 1;
		}
	}

	return 0;
}

///////////////////////////////////////////////////////////////
//		协议句柄集合和NDIS绑定句柄集合及它们各自的管理函数
//

#define	MAX_PROTOHANDLE		32
#define	MAX_ADAPTERHANDLE	128

static SProtoHandle g_ProtoHandles[MAX_PROTOHANDLE];
static SAdapterHandle g_AdapterHandles[MAX_ADAPTERHANDLE];
#ifdef _WIN32_WINNT
static KSPIN_LOCK g_ProtoHandleLock;
static KSPIN_LOCK g_AdapterHandleLock;
#endif

//分配协议句柄
SProtoHandle* AllocProtoHandle()
{
	static int s_nProtoPos;
	int i,nPos;
	SProtoHandle* pProtoHandle=NULL;

#ifdef _WIN32_WINNT
    KIRQL irql;
    KeAcquireSpinLock(&g_ProtoHandleLock, &irql);
#endif

	for(i=0;i<MAX_PROTOHANDLE;i++)
	{
		nPos=s_nProtoPos+i;
		if(nPos>=MAX_PROTOHANDLE) nPos=0;

		if(g_ProtoHandles[nPos].ProtoHandle==NULL)
		{
			pProtoHandle=&g_ProtoHandles[nPos];
			s_nProtoPos=nPos+1;
			break;
		}
	}

#ifdef _WIN32_WINNT
	KeReleaseSpinLock(&g_ProtoHandleLock, irql);
#endif

	return pProtoHandle;
}

//分配NDIS绑定句柄
SAdapterHandle* AllocAdapterHandle(NDIS_HANDLE  ProtocolBindingContext)
{
	static int s_nAdapterPos;
	int i,nPos;
	SAdapterHandle* pAdapterHandle=NULL;

#ifdef _WIN32_WINNT
    KIRQL irql;
    KeAcquireSpinLock(&g_AdapterHandleLock, &irql);
#endif

	for(i=0;i<MAX_ADAPTERHANDLE;i++)
	{
		nPos=s_nAdapterPos+i;
		if(nPos>=MAX_ADAPTERHANDLE) nPos=0;

		if( g_AdapterHandles[nPos].NdisBindingHandle==NULL &&
			g_AdapterHandles[nPos].pNdisBindingHandle==NULL && 
			g_AdapterHandles[nPos].ProtocolBindingContext==NULL)
		{
			pAdapterHandle=&g_AdapterHandles[nPos];
			pAdapterHandle->ProtocolBindingContext=ProtocolBindingContext;
			s_nAdapterPos=nPos+1;
			break;
		}
	}

#ifdef _WIN32_WINNT
	KeReleaseSpinLock(&g_AdapterHandleLock, irql);
#endif

	return pAdapterHandle;
}

//查找协议句柄
SProtoHandle* FindProtoHandle(NDIS_HANDLE ProtoHandle)
{
	SProtoHandle* pProtoHandle=NULL;
	int i;

#ifdef _WIN32_WINNT
    KIRQL irql;
    KeAcquireSpinLock(&g_ProtoHandleLock, &irql);
#endif

	for(i=0;i<MAX_PROTOHANDLE;i++)
	{
		if(g_ProtoHandles[i].ProtoHandle==ProtoHandle)
		{
			pProtoHandle=&g_ProtoHandles[i];
			break;
		}
	}

#ifdef _WIN32_WINNT
	KeReleaseSpinLock(&g_ProtoHandleLock, irql);
#endif

	return pProtoHandle;
}

//查找NDIS绑定句柄
SAdapterHandle* FindAdapterHandle(NDIS_HANDLE ProtocolBindingContext)
{
	SAdapterHandle* pAdapterHandle=NULL;
	int i;

#ifdef _WIN32_WINNT
    KIRQL irql;
    KeAcquireSpinLock(&g_AdapterHandleLock, &irql);
#endif

	for(i=0;i<MAX_ADAPTERHANDLE;i++)
	{
		if(g_AdapterHandles[i].ProtocolBindingContext==ProtocolBindingContext)
		{
			pAdapterHandle=&g_AdapterHandles[i];
			break;
		}
	}

#ifdef _WIN32_WINNT
	KeReleaseSpinLock(&g_AdapterHandleLock, irql);
#endif

	return pAdapterHandle;
}

//删除NDIS绑定句柄
void DelAdapterHandle(NDIS_HANDLE NdisBindingHandle)
{
	int i;

#ifdef _WIN32_WINNT
    KIRQL irql;
    KeAcquireSpinLock(&g_AdapterHandleLock, &irql);
#endif

	for(i=0;i<MAX_ADAPTERHANDLE;i++)
	{
		if(g_AdapterHandles[i].NdisBindingHandle==NdisBindingHandle)
		{
			DbgPrint("!!!!!DelAdapterHandle\n");
			DelTcpIpBindHandle(&g_AdapterHandles[i]);
			memset(&g_AdapterHandles[i],0,sizeof(SAdapterHandle));
			break;
		}
	}

#ifdef _WIN32_WINNT
	KeReleaseSpinLock(&g_AdapterHandleLock, irql);
#endif
}

//删除协议句柄
void DelProtoHandle(NDIS_HANDLE ProtoHandle)
{
	int i;

#ifdef _WIN32_WINNT
    KIRQL irql;
    KeAcquireSpinLock(&g_ProtoHandleLock, &irql);
#endif

	if(g_TcpIpHandle==ProtoHandle)
	{
		DbgPrint("!!!!!W2K_NdisDeregisterProtocol TcpIp\n");
		g_nTcpIpBindNum=0;
	}

	for(i=0;i<MAX_PROTOHANDLE;i++)
	{
		if(g_ProtoHandles[i].ProtoHandle==ProtoHandle)
		{
			DbgPrint("!!!!!DelProtoHandle\n");
			memset(&g_ProtoHandles[i],0,sizeof(SProtoHandle));
			break;
		}
	}

#ifdef _WIN32_WINNT
	KeReleaseSpinLock(&g_ProtoHandleLock, irql);
#endif
}

///////////////////////////////////////////////////////////////
//		上线MAC或正请求上线MAC集合及管理函数
//

int	g_maccount=0;		//当前记录上线MAC数
SMac g_macs[MAX_MAC];	//上线MAC集合

//查找某上线MAC或正请求上线MAC,返回不为空则成功,否则失败
SMac* FindMac(UCHAR mac[],int *pPos)
{
	int begin,end;

	if(g_maccount==0) return 0;

	begin=0;
	end=g_maccount-1;
	*pPos=(begin+end)/2;

	while(end>begin)
	{
		int cmp=memcmp(mac,g_macs[*pPos].mac,6);
		if(cmp>0)
		{
			begin=(*pPos)+1;
			*pPos=(begin+end)/2;
		}
		else if(cmp<0)
		{
			end=(*pPos)-1;
			*pPos=(begin+end)/2;
		}
		else
		{
			return &g_macs[*pPos];
		}
	}

	if(memcmp(mac,g_macs[*pPos].mac,6)==0) return &g_macs[*pPos];
	return NULL;
}

//增加某上线MAC或正请求上线MAC,返回不为空则成功,否则失败
//bSetOKTime表示是否设置确认其上线的时间
SMac* AddMac(UCHAR mac[],ULONG ip,BOOLEAN bSetOKTime)
{
	int n,nPos=0;

	SMac *pMac=FindMac(mac,&nPos);
	if(pMac)
	{
		pMac->ip=ip;
		if(bSetOKTime) pMac->oktime=GetSystemTime();
		return pMac;
	}

	if(g_maccount==0)
	{
		nPos=0;
		goto add;
	}

	if(g_maccount>=MAX_MAC)
	{
		ULONG uCurTime=GetSystemTime();
		for(nPos=MAX_MAC-1;nPos>=0;nPos--)
		{
			if(!MAC_OK(uCurTime,&g_macs[nPos]))
			{
				for(n=nPos;n<g_maccount-1;n++)
				{
					memcpy(&g_macs[n],&g_macs[n+1],sizeof(SMac));
				}
				g_maccount--;
				break;
			}
		}
		return 0;
	}

	if(memcmp(mac,g_macs[nPos].mac,6)>0) nPos++;

	for(n=g_maccount-1;n>=nPos;n--)
	{
		memcpy(&g_macs[n+1],&g_macs[n],sizeof(SMac));
	}

add:
	memcpy(g_macs[nPos].mac,mac,6);
	g_macs[nPos].chktime=0;
	g_macs[nPos].ip=ip;
	g_macs[nPos].oktime=bSetOKTime ? GetSystemTime() : 0;
	g_maccount++;

	return &g_macs[nPos];
}

//删除某上线MAC或正请求上线MAC
void DelMac(UCHAR mac[])
{
	int nPos,n;
	if(!FindMac(mac,&nPos)) return;
	for(n=nPos;n<g_maccount-1;n++)
	{
		memcpy(&g_macs[n],&g_macs[n+1],sizeof(SMac));
	}
	g_maccount--;
}

⌨️ 快捷键说明

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