亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? read.c

?? Windows XP下的抓包程序實現(xiàn)
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy)
 * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the Politecnico di Torino, CACE Technologies 
 * nor the names of its contributors may be used to endorse or promote 
 * products derived from this software without specific prior written 
 * permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#include <stdarg.h>
#include "ntddk.h"
#include <ntiologc.h>
#include <ndis.h>
#include "debug.h"
#include "packet.h"
#include "win_bpf.h"

#include "tme.h"
#include "time_calls.h"

extern struct time_conv G_Start_Time; // from openclos.c

extern ULONG NCpu; //from packet.c

NTSTATUS NPF_Read(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
    POPEN_INSTANCE      Open;
    PIO_STACK_LOCATION  IrpSp;
    PUCHAR				packp;
	ULONG				Input_Buffer_Length;
	UINT				Thead;
	UINT				Ttail;
	UINT				TLastByte;
	PUCHAR				CurrBuff;
	LARGE_INTEGER		CapTime;
	LARGE_INTEGER		TimeFreq;
	struct bpf_hdr		*header;
	KIRQL				Irql;
	PUCHAR				UserPointer;
	ULONG				bytecopy;
	UINT				SizeToCopy;
	UINT				PktLen;
	ULONG				copied,count,current_cpu,av,plen,increment,ToCopy,available;
	CpuPrivateData		*LocalData;
	ULONG				i;
	ULONG				Occupation;

	IF_LOUD(DbgPrint("NPF: Read\n");)

		
	IrpSp = IoGetCurrentIrpStackLocation(Irp);
    Open=IrpSp->FileObject->FsContext;

	//
	// we need to test if the device is still bound to the Network adapter,
	// so we perform a start/stop using binding.
	// This is not critical, since we just want to have a quick way to have the
	// dispatch read fail in case the adapter has been unbound

	if(NPF_StartUsingBinding(Open) == FALSE)
	{
		// The Network adapter has been removed or diasabled
		EXIT_FAILURE(0);
	}
	NPF_StopUsingBinding(Open);

	if (Open->Size == 0)	
	{
		EXIT_FAILURE(0);
	}

	if( Open->mode & MODE_DUMP && Open->DumpFileHandle == NULL ){  
		// this instance is in dump mode, but the dump file has still not been opened
		EXIT_FAILURE(0);
	}
	
	Occupation=0;

	for(i=0;i<NCpu;i++)
		Occupation += (Open->Size - Open->CpuData[i].Free);
	
	//See if the buffer is full enough to be copied
	if( Occupation <= Open->MinToCopy*NCpu || Open->mode & MODE_DUMP )
	{
		if (Open->ReadEvent != NULL)
		{
			//wait until some packets arrive or the timeout expires		
			if(Open->TimeOut.QuadPart != (LONGLONG)IMMEDIATE)
				KeWaitForSingleObject(Open->ReadEvent,
					UserRequest,
					KernelMode,
					TRUE,
					(Open->TimeOut.QuadPart == (LONGLONG)0)? NULL: &(Open->TimeOut));

			KeClearEvent(Open->ReadEvent);
		}		

		if(Open->mode & MODE_STAT)
		{   //this capture instance is in statistics mode
#ifdef NDIS50
			CurrBuff=(PUCHAR)MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
#else
			CurrBuff=(PUCHAR)MmGetSystemAddressForMdl(Irp->MdlAddress);
#endif

			if (CurrBuff == NULL)
			{
				EXIT_FAILURE(0);
			}


			//fill the bpf header for this packet
			header=(struct bpf_hdr*)CurrBuff;
			GET_TIME(&header->bh_tstamp,&G_Start_Time);

			if(Open->mode & MODE_DUMP){
				*(LONGLONG*)(CurrBuff+sizeof(struct bpf_hdr)+16)=Open->DumpOffset.QuadPart;
				header->bh_caplen=24;
				header->bh_datalen=24;
				Irp->IoStatus.Information = 24 + sizeof(struct bpf_hdr);
			}
			else{
				header->bh_caplen=16;
				header->bh_datalen=16;
				header->bh_hdrlen=sizeof(struct bpf_hdr);
				Irp->IoStatus.Information = 16 + sizeof(struct bpf_hdr);
			}

			*(LONGLONG*)(CurrBuff+sizeof(struct bpf_hdr))=Open->Npackets.QuadPart;
			*(LONGLONG*)(CurrBuff+sizeof(struct bpf_hdr)+8)=Open->Nbytes.QuadPart;
			
			//reset the countetrs
			NdisAcquireSpinLock( &Open->CountersLock );
			Open->Npackets.QuadPart=0;
			Open->Nbytes.QuadPart=0;
			NdisReleaseSpinLock( &Open->CountersLock );
			
			Irp->IoStatus.Status = STATUS_SUCCESS;
			IoCompleteRequest(Irp, IO_NO_INCREMENT);
			
			return STATUS_SUCCESS;
		}
		
//
// The MONITOR_MODE (aka TME extensions) is not supported on 
// 64 bit architectures
//
#ifdef __NPF_x86__

		if(Open->mode==MODE_MON)   //this capture instance is in monitor mode
		{   
			PTME_DATA data;
			ULONG cnt;
			ULONG block_size;
			PUCHAR tmp;

#ifdef NDIS50
			UserPointer=MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
#else
			UserPointer=MmGetSystemAddressForMdl(Irp->MdlAddress);
#endif

			if (UserPointer == NULL)
			{
				EXIT_FAILURE(0);
			}

			if ((!IS_VALIDATED(Open->tme.validated_blocks,Open->tme.active_read))||(IrpSp->Parameters.Read.Length<sizeof(struct bpf_hdr)))
			{	
				EXIT_FAILURE(0);
			}
			
			header=(struct bpf_hdr*)UserPointer;
	
			GET_TIME(&header->bh_tstamp,&G_Start_Time);

			
			header->bh_hdrlen=sizeof(struct bpf_hdr);
	

			//moves user memory pointer
			UserPointer+=sizeof(struct bpf_hdr);
			
			//calculus of data to be copied
			//if the user buffer is smaller than data to be copied,
			//only some data will be copied
			data=&Open->tme.block_data[Open->tme.active_read];

			if (data->last_read.tv_sec!=0)
				data->last_read=header->bh_tstamp;
			

			bytecopy=data->block_size*data->filled_blocks;
			
			if ((IrpSp->Parameters.Read.Length-sizeof(struct bpf_hdr))<bytecopy)
				bytecopy=(IrpSp->Parameters.Read.Length-sizeof(struct bpf_hdr))/ data->block_size;
			else 
				bytecopy=data->filled_blocks;

			tmp=data->shared_memory_base_address;
			block_size=data->block_size;
			
			for (cnt=0;cnt<bytecopy;cnt++)
			{
				NdisAcquireSpinLock(&Open->MachineLock);
				RtlCopyMemory(UserPointer,tmp,block_size);
				NdisReleaseSpinLock(&Open->MachineLock);
				tmp+=block_size;
				UserPointer+=block_size;
			}
						
			bytecopy*=block_size;

			header->bh_caplen=bytecopy;
			header->bh_datalen=header->bh_caplen;

			EXIT_SUCCESS(bytecopy+sizeof(struct bpf_hdr));
		}

		Occupation=0;

		for(i=0;i<NCpu;i++)
			Occupation += (Open->Size - Open->CpuData[i].Free);


		if ( Occupation == 0 || Open->mode & MODE_DUMP)
			// The timeout has expired, but the buffer is still empty (or the packets must be written to file).
			// We must awake the application, returning an empty buffer.
		{
			EXIT_SUCCESS(0);
		}
				
	#else // not __NPF_x86__ , so x86-64 or IA64
		if(Open->mode==MODE_MON)   //this capture instance is in monitor mode
		{   
			EXIT_FAILURE(0);
		}
	#endif // __NPF_x86__

	}



//------------------------------------------------------------------------------
	copied=0;
	count=0;
	current_cpu=0;
	available = IrpSp->Parameters.Read.Length;
#ifdef NDIS50
	packp=(PUCHAR)MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
#else
	packp=(PUCHAR)MmGetSystemAddressForMdl(Irp->MdlAddress);
#endif

	if (packp == NULL)
	{
		EXIT_FAILURE(0);
	}

	if (Open->ReadEvent != NULL)
		KeClearEvent(Open->ReadEvent);

	while (count < NCpu) //round robin on the CPUs, if count = NCpu there are no packets left to be copied
	{
		if (available == copied)
		{
			EXIT_SUCCESS(copied);
		}
		
		LocalData = &Open->CpuData[current_cpu];

		if (LocalData->Free < Open->Size)  
		{  //there are some packets in the selected (aka LocalData) buffer
			struct PacketHeader *Header = (struct PacketHeader*)(LocalData->Buffer + LocalData->C);

			if ( Header->SN == Open->ReaderSN)
			{   //check if it the next one to be copied
				plen = Header->header.bh_caplen;
				if (plen + sizeof (struct bpf_hdr) > available - copied)  
				{  //if the packet does not fit into the user buffer, we've ended copying packets
					EXIT_SUCCESS(copied);
				}
				
//				FIX_TIMESTAMPS(&Header->header.bh_tstamp);

				*((struct bpf_hdr*)(&packp[copied]))=Header->header;
				
				copied += sizeof(struct bpf_hdr);
				LocalData->C += sizeof(struct PacketHeader);

				if (LocalData->C == Open->Size)
					LocalData->C = 0;

				if (Open->Size - LocalData->C < plen)
				{
					//the packet is fragmented in the buffer (i.e. it skips the buffer boundary)
					ToCopy = Open->Size - LocalData->C;
					RtlCopyMemory(packp + copied,LocalData->Buffer + LocalData->C,ToCopy);
					RtlCopyMemory(packp + copied + ToCopy,LocalData->Buffer,plen-ToCopy);
					LocalData->C = plen-ToCopy;
				}
				else
				{
					//the packet is not fragmented
					RtlCopyMemory(packp + copied ,LocalData->Buffer + LocalData->C ,plen);
					LocalData->C += plen;
			//		if (c==size)  inutile, contemplato nell "header atomico"
			//			c=0;
				}

				Open->ReaderSN++;
				copied+=Packet_WORDALIGN(plen);

				increment = plen + sizeof(struct PacketHeader);
				if ( Open->Size - LocalData->C < sizeof(struct PacketHeader))
				{   //the next packet would be saved at the end of the buffer, but the NewHeader struct would be fragmented
					//so the producer (--> the consumer) skips to the beginning of the buffer
					increment += Open->Size-LocalData->C;
					LocalData->C=0;
				}
				InterlockedExchangeAdd(&Open->CpuData[current_cpu].Free,increment);
				count=0;
			}
			else
			{
				current_cpu=(current_cpu+1)%NCpu;
				count++;	
			}
		
		}
		else
		{
			current_cpu=(current_cpu+1)%NCpu;
			count++;	
		}
	}
		
	{EXIT_SUCCESS(copied);}

//------------------------------------------------------------------------------

}

NDIS_STATUS NPF_tap (IN NDIS_HANDLE ProtocolBindingContext,IN NDIS_HANDLE MacReceiveContext,
                        IN PVOID HeaderBuffer,IN UINT HeaderBufferSize,IN PVOID LookaheadBuffer,
                        IN UINT LookaheadBufferSize,IN UINT PacketSize)
{
    POPEN_INSTANCE      Open;
    PNDIS_PACKET        pPacket;
    ULONG               SizeToTransfer;
    NDIS_STATUS         Status;
    UINT                BytesTransfered;
    ULONG               BufferLength;
    PMDL                pMdl1,pMdl2;
	LARGE_INTEGER		CapTime;
	LARGE_INTEGER		TimeFreq;
	UINT				fres;
	USHORT				NPFHdrSize;

	CpuPrivateData		*LocalData;
	ULONG				Cpu;
	struct PacketHeader	*Header;
	ULONG				ToCopy;
	ULONG				increment;
	ULONG				i;
	BOOLEAN				ShouldReleaseBufferLock;

    IF_VERY_LOUD(DbgPrint("NPF: tap\n");)
	IF_VERY_LOUD(DbgPrint("HeaderBufferSize=%u, LookAheadBuffer=%p, LookaheadBufferSize=%u, PacketSize=%u\n", 
	HeaderBufferSize,
	LookaheadBuffer,
	LookaheadBufferSize,
	PacketSize);)

	Open= (POPEN_INSTANCE)ProtocolBindingContext;
	
    Cpu = KeGetCurrentProcessorNumber();
	LocalData = &Open->CpuData[Cpu];

	LocalData->Received++;
	IF_LOUD(DbgPrint("Received on CPU %d \t%d\n",Cpu,LocalData->Received);)
//	Open->Received++;		// Number of packets received by filter ++

	NdisAcquireSpinLock(&Open->MachineLock);

	//
	//Check if the lookahead buffer follows the mac header.
	//If the data follow the header (i.e. there is only a buffer) a normal bpf_filter() is
	//executed on the packet.
	//Otherwise if there are 2 separate buffers (this could be the case of LAN emulation or
	//things like this) bpf_filter_with_2_buffers() is executed.
	//
	if((UINT)((PUCHAR)LookaheadBuffer-(PUCHAR)HeaderBuffer) != HeaderBufferSize)
		fres=bpf_filter_with_2_buffers((struct bpf_insn*)(Open->bpfprogram),
									   HeaderBuffer,
									   LookaheadBuffer,
									   HeaderBufferSize,
									   PacketSize+HeaderBufferSize,
									   LookaheadBufferSize+HeaderBufferSize,
									   &Open->mem_ex,
									   &Open->tme,
									   &G_Start_Time);
	
	
	else 
//
// the jit filter is available on x86 (32 bit) only
//
#ifdef __NPF_x86__

		if(Open->Filter != NULL)
		{
			if (Open->bpfprogram != NULL)
			{
				fres=Open->Filter->Function(HeaderBuffer,
									PacketSize+HeaderBufferSize,
									LookaheadBufferSize+HeaderBufferSize);
			}
			else
				fres = -1;
		}
		else
#endif //__NPF_x86__
			fres=bpf_filter((struct bpf_insn*)(Open->bpfprogram),
 		                HeaderBuffer,
 						PacketSize+HeaderBufferSize,
						LookaheadBufferSize+HeaderBufferSize,
						&Open->mem_ex,
						&Open->tme,
						&G_Start_Time);

	NdisReleaseSpinLock(&Open->MachineLock);

//
// The MONITOR_MODE (aka TME extensions) is not supported on 
// 64 bit architectures
//
#ifdef __NPF_x86__
	if(Open->mode==MODE_MON)
	// we are in monitor mode
	{
		if (fres==1) 
		{
			if (Open->ReadEvent != NULL)
			{
				KeSetEvent(Open->ReadEvent,0,FALSE);	
			}
		}
		return NDIS_STATUS_NOT_ACCEPTED;

	}
#endif

	if(fres==0)
	{
		// Packet not accepted by the filter, ignore it.
		return NDIS_STATUS_NOT_ACCEPTED;
	}

	//if the filter returns -1 the whole packet must be accepted
	if(fres == -1 || fres > PacketSize+HeaderBufferSize)
		fres = PacketSize+HeaderBufferSize; 

	if(Open->mode & MODE_STAT)
	{
	// we are in statistics mode
		NdisAcquireSpinLock( &Open->CountersLock );

		Open->Npackets.QuadPart++;
		

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品亚洲专区| 亚洲精品福利视频网站| 国产成人福利片| 国产高清在线精品| 岛国一区二区三区| 91农村精品一区二区在线| 91成人免费网站| 欧美一二三四在线| 久久久777精品电影网影网| 久久综合九色综合欧美98| 亚洲国产高清在线| 午夜电影久久久| 成人免费毛片嘿嘿连载视频| www.爱久久.com| 欧美精品久久99久久在免费线| 在线观看亚洲成人| 欧美r级电影在线观看| 国产日韩欧美不卡在线| 亚洲一区二区视频在线观看| 美女看a上一区| 在线观看亚洲精品视频| 2017欧美狠狠色| 偷拍亚洲欧洲综合| zzijzzij亚洲日本少妇熟睡| 欧美人与性动xxxx| 中文字幕一区免费在线观看| 日韩精品欧美成人高清一区二区| 国产成人精品一区二区三区四区| 欧美日韩一二三| 亚洲欧美另类图片小说| 国产精品白丝jk白祙喷水网站| 91蜜桃在线免费视频| 欧美激情一区三区| 国产麻豆视频一区二区| 日韩免费观看2025年上映的电影| 日韩美女视频19| 91丨porny丨在线| 中文字幕一区二区不卡| 成人激情视频网站| 国产精品丝袜在线| 成年人网站91| 亚洲欧洲一区二区在线播放| 色综合久久久久久久久| 日本国产一区二区| 中文字幕日韩一区二区| www.综合网.com| 亚洲综合色噜噜狠狠| 91成人免费在线| 五月综合激情网| 欧美xxx久久| 国产精品1区2区3区在线观看| 欧美成人高清电影在线| 国产一二精品视频| 日韩美女啊v在线免费观看| 91久久一区二区| 麻豆成人在线观看| 国产亚洲欧美色| 91看片淫黄大片一级在线观看| 亚洲欧洲性图库| 欧美成人一区二区三区| 成人黄页毛片网站| 日本成人超碰在线观看| 久久免费偷拍视频| 欧美日韩一区二区三区四区 | 国产精品国产三级国产三级人妇| 91在线视频播放| 久久se精品一区二区| 自拍偷拍国产精品| 日韩欧美国产一区二区在线播放| 国产成人夜色高潮福利影视| 亚洲一区自拍偷拍| 国产精品区一区二区三区| 日韩一区二区三区av| 色综合中文字幕国产 | 成人免费毛片高清视频| 男人的天堂久久精品| 一区二区日韩电影| 中文字幕日韩一区二区| 日本一区二区三区在线不卡| 7777精品伊人久久久大香线蕉完整版| jvid福利写真一区二区三区| 狠狠色丁香婷婷综合| 日韩 欧美一区二区三区| 亚洲综合区在线| 亚洲高清三级视频| 亚洲一区二区三区小说| 亚洲国产精品一区二区www在线 | 高清视频一区二区| 国产91色综合久久免费分享| 激情综合色播五月| 国产精品自拍毛片| 国产成人av在线影院| 91猫先生在线| 精品视频一区三区九区| 欧美一区二区在线看| 欧美一级一区二区| 国产日韩欧美制服另类| 欧美综合在线视频| 777a∨成人精品桃花网| 久久综合九色综合97婷婷女人| 精品久久久三级丝袜| 国产无遮挡一区二区三区毛片日本| 国产三级精品在线| 亚洲综合免费观看高清完整版在线| |精品福利一区二区三区| 香港成人在线视频| 国产成人日日夜夜| 欧美少妇一区二区| 久久精品视频在线看| 亚洲美女偷拍久久| 国产精品香蕉一区二区三区| 91香蕉视频污在线| 久久新电视剧免费观看| 亚洲国产精品久久久久婷婷884| 麻豆精品视频在线观看| a亚洲天堂av| 国产日本欧洲亚洲| 日本vs亚洲vs韩国一区三区二区| 成人一区二区三区| 精品久久国产老人久久综合| 亚洲成人av一区二区| 91在线观看成人| 国产精品亲子伦对白| 极品美女销魂一区二区三区免费| 欧美三级一区二区| 艳妇臀荡乳欲伦亚洲一区| 不卡一区中文字幕| 久久久午夜精品理论片中文字幕| 欧美日韩国产影片| 久久综合久久综合久久| 国产精品视频yy9299一区| 一区二区三区视频在线看| 国产成人精品亚洲午夜麻豆| 国产性色一区二区| 成人午夜私人影院| 国产清纯白嫩初高生在线观看91| 麻豆成人久久精品二区三区红| 欧美一区二区三区视频免费播放| 丝瓜av网站精品一区二区 | 日韩一区二区电影在线| 午夜精品久久久久久久| 欧美高清精品3d| 激情综合色综合久久综合| 欧美极品少妇xxxxⅹ高跟鞋| kk眼镜猥琐国模调教系列一区二区 | 欧美丝袜第三区| 日韩制服丝袜先锋影音| 精品国产免费人成电影在线观看四季| 久久99热狠狠色一区二区| 国产亚洲一区二区三区在线观看| 国产不卡一区视频| 婷婷综合五月天| 中文字幕的久久| 欧美日韩和欧美的一区二区| 裸体歌舞表演一区二区| 国产精品传媒视频| 日韩精品一区二区三区视频播放 | 国产成人免费视频网站| 亚洲国产美女搞黄色| 国产亚洲短视频| 欧美一级久久久| 色综合久久久久久久久| 国产成人免费在线观看不卡| 亚洲午夜视频在线观看| 中文字幕亚洲电影| 久久精品一区蜜桃臀影院| 欧美日韩精品系列| 色88888久久久久久影院野外| 国产精品一区二区在线播放| 日韩电影在线免费观看| 亚洲国产精品视频| 一区二区视频免费在线观看| 亚洲国产精品激情在线观看| 91精品一区二区三区久久久久久| 在线视频欧美精品| 色欧美片视频在线观看在线视频| 国产精品1区二区.| 国产精品一二三四| 不卡视频在线看| 91亚洲精品一区二区乱码| 波多野结衣91| 欧美影院精品一区| 欧美日韩国产免费| 欧美一区二区成人| 久久综合九色综合欧美98| 久久久久久久久久久久久久久99| 久久久亚洲午夜电影| 亚洲手机成人高清视频| 亚洲一区二区三区四区在线观看 | 国产午夜精品一区二区三区视频| 日韩欧美一卡二卡| 国产精品乱人伦一区二区| 亚洲美女淫视频| 麻豆精品视频在线观看视频| 国产成人综合在线观看| 91片在线免费观看| 精品卡一卡二卡三卡四在线| 中文字幕成人av| 美日韩一区二区| 欧美视频一区二区在线观看|