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

📄 list.c

📁 Linux下面截获以态网数据包!是在内核态下面运行的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <linux/module.h> 
#include <linux/config.h> 
#include <linux/init.h> 
#include <linux/netdevice.h> 		/* for dev_base */
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/file.h>
#include <linux/dnotify.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/time.h>
#include <asm/semaphore.h>
#include <asm/unistd.h>

#include "createDir.h"
#include "DomainIPHash.h"
#include "list.h"
#include "Rule.h"
#include "RuleIp.h"
#include "protocol.h"
#include "function.h"

#define	USHORT	unsigned short
#define	ULONG	unsigned long

//#define _LIST_DEBUG

//
//Initialize double list and initialize the FAST_MUTEX
//
//
inline void _InitializeList( PDOUBLE_LIST_HEAD pListHead )
{
	if( pListHead == NULL )
		return;

	pListHead->pHead = pListHead->pTail = NULL;
	pListHead->iNumber = 0;

	init_MUTEX( &pListHead->fastMutex );
}

//
//Insert only one Item to the head of the double list 
//return the old head.if the list is empty, then return NULL
//
inline PDOUBLE_LIST_ITEM _InsertHeadList( PDOUBLE_LIST_HEAD pListHead,
	PDOUBLE_LIST_ITEM pListItem )
{
	if( pListHead == NULL || pListItem == NULL )
		return NULL;
	
	pListItem->pPre = NULL;
	
	down_interruptible( &pListHead->fastMutex );
	if( pListHead->pHead == NULL )
	{
		//first item
		pListItem->pNext = NULL;
		pListHead->pHead = pListHead->pTail = pListItem;
	}
	else
	{
		pListItem->pNext = pListHead->pHead;
		pListHead->pHead->pPre = pListItem;
		pListHead->pHead = pListItem;
	}
	pListHead->iNumber++;
	up( &pListHead->fastMutex );
	
	return NULL;
}

inline PDOUBLE_LIST_ITEM _InsertHeadListNonLock( PDOUBLE_LIST_HEAD pListHead,
	PDOUBLE_LIST_ITEM pListItem )
{
	if( pListHead == NULL || pListItem == NULL )
		return NULL;
	
	pListItem->pPre = NULL;
	
	if( pListHead->pHead == NULL )
	{
		//first item
		pListItem->pNext = NULL;
		pListHead->pHead = pListHead->pTail = pListItem;
	}
	else
	{
		pListItem->pNext = pListHead->pHead;
		pListHead->pHead->pPre = pListItem;
		pListHead->pHead = pListItem;
	}
	pListHead->iNumber++;
	
	return pListHead->pHead->pNext;
	
}

//
//Insert only one Item to the tail of the double list 
//return the old tail, if the list is empty, then return NULL
//
inline PDOUBLE_LIST_ITEM _InsertTailList( PDOUBLE_LIST_HEAD pListHead,
	PDOUBLE_LIST_ITEM pListItem )
{
	if( pListHead == NULL || pListItem == NULL )
		return NULL;
	
	pListItem->pNext = NULL;
	
	down_interruptible( &pListHead->fastMutex );
	if( pListHead->pTail == NULL )
	{
		//first item
		pListItem->pPre = NULL;
		pListHead->pHead = pListHead->pTail = pListItem;
	}
	else
	{
		pListItem->pPre = pListHead->pTail;
		pListHead->pTail->pNext = pListItem;
		pListHead->pTail = pListItem;
	}
	pListHead->iNumber++;
	up( &pListHead->fastMutex );
	
	return pListHead->pTail->pPre;
	
}

inline PDOUBLE_LIST_ITEM _InsertTailListNonLock( PDOUBLE_LIST_HEAD pListHead,
	PDOUBLE_LIST_ITEM pListItem )
{
	if( pListHead == NULL || pListItem == NULL )
		return NULL;
	
	pListItem->pPre = pListItem->pNext = NULL;
	
	if( pListHead->pTail == NULL )
	{
		//first item
		pListItem->pPre = NULL;
		pListHead->pHead = pListHead->pTail = pListItem;
	}
	else
	{
		pListItem->pPre = pListHead->pTail;
		pListHead->pTail->pNext = pListItem;
		pListHead->pTail = pListItem;
	}
	pListHead->iNumber++;
	
	return pListHead->pTail->pPre;
	
}

//
//Insert only one Item to the head of the double list 
//return the old head.if the list is empty, then return NULL
//
inline void _InsertHeadListMulti( PDOUBLE_LIST_HEAD pListHead,
	PDOUBLE_LIST_HEAD pInputList )
{
	if( pListHead == NULL || pInputList == NULL )
		return ;
		
	if( pInputList->pHead == NULL || pInputList->pTail == NULL )
		return ;
	
	down_interruptible( &pListHead->fastMutex );
	
	if( pListHead->pHead == NULL )
	{
		//first item
		pListHead->pHead = pInputList->pHead;
		pListHead->pTail = pInputList->pTail;
	}
	else
	{
		pInputList->pTail->pNext = pListHead->pHead;
		pListHead->pHead->pPre = pInputList->pTail;
		
		pListHead->pHead = pInputList->pHead;
	}

	pListHead->iNumber += pInputList->iNumber;
	up( &pListHead->fastMutex );
	
	pInputList->pHead = pInputList->pTail = NULL;
	pInputList->iNumber = 0;
	
	return ;
}

//
//Insert only one Item to the tail of the double list 
//return the old tail, if the list is empty, then return NULL
//
inline void _InsertTailListFromSmtpHashHead( PDOUBLE_LIST_HEAD pListHead,
	PSMTP_HASH_HEAD pInputList )
{
	if( pListHead == NULL || pInputList == NULL )
		return ;
		
	if( pInputList->pHead == NULL || pInputList->pTail == NULL )
		return ;
	
	down_interruptible( &pListHead->fastMutex );
	if( pListHead->pTail == NULL )
	{
		//first item
		pListHead->pHead = pInputList->pHead;
		pListHead->pTail = pInputList->pTail;
	}
	else
	{
		pInputList->pHead->pPre = pListHead->pTail;
		pListHead->pTail->pNext = pInputList->pHead;		
		pListHead->pTail = pInputList->pTail;
		
	}
	pListHead->iNumber += pInputList->iNumber;
	up( &pListHead->fastMutex );
	
	InitializeSmtpHashHead(pInputList);
	
	return;
}


inline void _InsertTailListFromSmtpHashHeadByLong( PSMTP_HASH_HEAD pInputList )
{
	PDOUBLE_LIST_PACKET pItem = NULL;
	
	if( pInputList == NULL )
		return ;

	pItem = (PDOUBLE_LIST_PACKET)pInputList->pHead;
	while( pItem )
	{
		pInputList->pHead = pItem->doubleListItem.pNext;
		PutPacketPool( pItem );
		pItem = (PDOUBLE_LIST_PACKET)pInputList->pHead;
	}

	pItem = (PDOUBLE_LIST_PACKET)pInputList->pSHead;
	while(pItem)
	{
		pInputList->pSHead = pItem->doubleListItem.pNext;
		PutPacketPool( pItem );
		pItem = (PDOUBLE_LIST_PACKET)pInputList->pSHead;
	}

	InitializeSmtpHashHead(pInputList);
	
	return ;
}

//
//Insert only one Item to the tail of the double list 
//return the old tail, if the list is empty, then return NULL
//
inline void _InsertTailListMulti( PDOUBLE_LIST_HEAD pListHead,
	PDOUBLE_LIST_HEAD pInputList )
{
	if( pListHead == NULL || pInputList == NULL )
		return ;
		
	if( pInputList->pHead == NULL || pInputList->pTail == NULL )
		return ;
	
	down_interruptible( &pListHead->fastMutex );
	if( pListHead->pTail == NULL )
	{
		//first item
		pListHead->pHead = pInputList->pHead;
		pListHead->pTail = pInputList->pTail;
	}
	else
	{
		pInputList->pHead->pPre = pListHead->pTail;
		pListHead->pTail->pNext = pInputList->pHead;		
		pListHead->pTail = pInputList->pTail;
		
	}
	pListHead->iNumber += pInputList->iNumber;
	up( &pListHead->fastMutex );	
	pInputList->pHead = pInputList->pTail = NULL;
	pInputList->iNumber = 0;
	
	return ;
}

inline PDOUBLE_LIST_ITEM _RemoveHeadList( PDOUBLE_LIST_HEAD pListHead )
{
	PDOUBLE_LIST_ITEM pTemp = NULL;
	
	if( pListHead == NULL )
		return NULL;
	if( pListHead->pHead == NULL )
		return NULL;
		
	down_interruptible( &pListHead->fastMutex );
	pTemp = pListHead->pHead;
	if( pTemp == NULL )
	{
		up( &pListHead->fastMutex );
		return pTemp;
	}
	
	if( pListHead->pHead == pListHead->pTail )
	{
		pListHead->pHead = pListHead->pTail = NULL;
	}
	else
	{
		pListHead->pHead = pTemp->pNext;
		pListHead->pHead->pPre = NULL;
	}
	pListHead->iNumber--;
	up( &pListHead->fastMutex );
	
	return pTemp;
}

inline PDOUBLE_LIST_ITEM _RemoveItemNonLock( PDOUBLE_LIST_HEAD pListHead,
		PDOUBLE_LIST_ITEM pItem)
{
	PDOUBLE_LIST_ITEM pTemp = NULL;
	
	if( pListHead == NULL || pItem == NULL )
		return NULL;
	if( pListHead->pHead == NULL )
		return NULL;
		
	if( IS_FROM_SMTP_CLIENT( ((PSMTP_HASH_HEAD)pItem)->smtpPop3Type ) )
		SetUserAndPass( (PSMTP_HASH_HEAD)pItem );
	
	if( pItem == pListHead->pHead && pItem == pListHead->pTail )
	{
		pListHead->pHead = pListHead->pTail = NULL;
	}
	else if( pItem == pListHead->pHead )
	{
		pListHead->pHead = pItem->pNext;
		pItem->pNext->pPre = NULL;
	}
	else if( pItem == pListHead->pTail )
	{
		pListHead->pTail = pItem->pPre;
		pItem->pPre->pNext = NULL;		
	}
	else
	{
		pItem->pPre->pNext = pItem->pNext;
		pItem->pNext->pPre = pItem->pPre;
	}
	
	pItem->pPre = pItem->pNext = NULL;
	pListHead->iNumber--;
	
	return pTemp;
}

inline PSMTP_HASH_HEAD _RemoveItemFromHashHead( PSMTP_HASH_HEAD pListHead )
{
	UINT MmLen;
	PSMTP_HASH_HEAD pTemp = NULL;
	
	MmLen = sizeof(SMTP_HASH_HEAD);	
	
	if( pListHead == NULL)
		return NULL;
	
	if( pListHead->pHead == NULL )
		return NULL;
		
	if( IS_FROM_SMTP_CLIENT( pListHead->smtpPop3Type ) )	
		SetUserAndPass( pListHead );
	
	pTemp = (SMTP_HASH_HEAD *)ALLOCATE_HASHHEAD( GFP_ATOMIC, MmLen);
	if( pTemp == NULL )
	{
		printk( "Allocate Pool PDOUBLE_LIST_HEAD fail in _RemoveItemNonHashHead()\r\n" );
		return NULL;
	}
			
	memcpy( pTemp, pListHead, MmLen );
	pTemp->pTail = pTemp->pSeq;	
	pTemp->iNumber = pTemp->iSeqCount;
	

⌨️ 快捷键说明

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