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

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

?? iphook.cpp

?? WMD驅動編程,本人收集整理的10多個例子和編程環境配置文檔,特別是8139驅動,加了許多說明,并測試通過.
?? CPP
字號:
///////////////////////////////////////////////////////////////////////////////
//
//	(C) Copyright 1999 - 2000 Mark Roddy
//	All Rights Reserved
//
//	Hollis Technology Solutions
//	94 Dow Road
//	Hollis, NH 03049
//	info@hollistech.com
//
//	Synopsis: 
// 
//
//	Version Information:
//
//	$Header: /iphook/sys/driver/iphook.cpp 4     1/27/00 10:35p Markr $ 
//
///////////////////////////////////////////////////////////////////////////////
#include "iphookKrnl.h"

HTS_DEBUG_THIS_FILE


//
// local functions
//
NTSTATUS
	IpfStartHooking(PVOID context);

NTSTATUS 
	IpfStopHooking(PVOID context);

IP_HOOK_GLOBAL_DATA ipGlobal;


CPP_DRIVER_ENTRY(PDRIVER_OBJECT DriverObject,
                 PUNICODE_STRING RegistryPath)
{
	NTSTATUS Status = STATUS_SUCCESS;

	//
	// setup our standard entry points
	//
	DriverObject->MajorFunction[IRP_MJ_CREATE]         = IpHookCreate;
    DriverObject->MajorFunction[IRP_MJ_CLOSE]          = IpHookClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IpHookDeviceControl;
	DriverObject->DriverUnload = IpHookUnload;
	//
	// before we get too deeply involved in this mess, lets see if the
	// ipfilter driver is actually installed.
	//
	Status = ipGlobal.initDevice();

	if (!NT_SUCCESS(Status)) {

		HtsDebugPrint(HTS_DEBUG_HIGH, "initDevice failed error %x\n", Status);
		return Status;
	}

	Status = ipGlobal.createThread();

	if (!NT_SUCCESS(Status)) {

		HtsDebugPrint(HTS_DEBUG_HIGH, "createThread failed error %x\n", Status);
		return Status;

	}  
	//
	// create a device object that applications can open to control the ip hook driver.
	//
	UNICODE_STRING deviceName;

	RtlInitUnicodeString(&deviceName, IPHOOK_DEV_NAME);

	PDEVICE_OBJECT ourDevice = NULL;

	Status = IoCreateDevice(
				DriverObject,
				0,
				&deviceName,
				IPHOOK_DEVICE_TYPE,
				0,
				FALSE, // well perhaps this should be true.
				&ourDevice);  

	if (!NT_SUCCESS(Status)) {

		//
		// oh well, what can we do?
		//
		HtsDebugPrint(HTS_DEBUG_HIGH, "IoCreateDevice failed status %x\n", Status);

		return Status;
	}

	UNICODE_STRING SymbolicLinkName;

	RtlInitUnicodeString(&SymbolicLinkName, IPHOOK_USER_DEV_NAME);

	//
	// create a symbolic link that exposes our device object to user space.
	//
	Status = IoCreateSymbolicLink(
				&SymbolicLinkName,
				&deviceName);

	if (!NT_SUCCESS(Status)) {
		//
		// we have to delete the device object here
		//
		IoDeleteDevice(ourDevice);

		HtsDebugPrint(HTS_DEBUG_HIGH, "IoCreateSymbolicLink failed status %x\n", Status);
	}

	return Status;
}

void
	IpHookUnload(PDRIVER_OBJECT DriverObject)
{
	HtsDebugPrint(HTS_DEBUG_LOW, "IpHookUnload\n");

	//
	HtsAssert(!ipGlobal.owned()); 
	//
	// delete our symbolic link
	//
	UNICODE_STRING SymbolicLinkName;

	RtlInitUnicodeString(&SymbolicLinkName, IPHOOK_USER_DEV_NAME);


	(void) IoDeleteSymbolicLink( &SymbolicLinkName );

	//
	// delete our device object(s)
	//
	while (DriverObject->DeviceObject) {
		
		IoDeleteDevice(DriverObject->DeviceObject);
	}

}

//
// Create
//
//	If we are going to support a read data interface then
//	we need to do something here to track operations.
//
//
NTSTATUS 
	IpHookCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
	HtsDebugPrint(HTS_DEBUG_LOW, "IpHookCreate\n");

	return STATUS_SUCCESS;
}

//
// Close
//
//	If we are going to support a read data interface then
//	we need to do something here to track operations.
//
//	On last close terminate hooking if active.
//
NTSTATUS 
	IpHookClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{

	PVOID context = IoGetCurrentIrpStackLocation(Irp)->FileObject;

	HtsDebugPrint(HTS_DEBUG_LOW, "IpHookClose context %x\n", context);

	//
	// ok lets see if the caller owned the interface and do an implicit release if he did.
	//
	if (ipGlobal.IsOwner(context)) {
		//
		// bingo!
		//
		(void) IpfStopHooking(context);
	}


	return STATUS_SUCCESS;
}

//
// DeviceControl
//
//	Provide an interface to start Ip Hooking, stop Ip Hooking.
//
NTSTATUS 
	IpHookDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
	HtsDebugPrint(HTS_DEBUG_LOW, "IpHookDeviceControl\n");
	//
	// get our stack location so we can decode this fellow
	//
	PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);

	//
	// get the control code.
	//
	ULONG controlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;

	NTSTATUS Status = STATUS_SUCCESS;

	switch (controlCode) {

	case START_IP_HOOK:

		Status = IpfStartHooking(IoStack->FileObject);

		break;


	case STOP_IP_HOOK:

		Status = IpfStopHooking(IoStack->FileObject);

		break;

	case HOOK_THIS:

		//
		// see if we are hooking,
		// a stronger test would be to see
		// if this caller owns the interface
		// as in 
		//		ipGlobal.IsOwner(IoStack->FileObject);
		//
		if ( !ipGlobal.owned() ) {
			//
			// bag it
			//
			Status = STATUS_UNSUCCESSFUL;
			break;
		}

		{
			//
			// make sure the buffer makes sense, we will not
			// revalidate later.
			//
			PIPHOOK_BUFFER buffer = (PIPHOOK_BUFFER) MmGetSystemAddressForMdl(Irp->MdlAddress);

			if (!validIpHookBuffer(buffer)) {

				HtsDebugPrint(HTS_DEBUG_LOW, "Invalid Buffer Tag\n");

				return HtsIrpReturn(Irp, STATUS_DATA_ERROR);

			}

			ULONG size = sizeof(IPHOOK_BUFFER) + 
				((buffer->entries - 1) * sizeof(IPHOOK_DATA));

			if (size > IoStack->Parameters.DeviceIoControl.OutputBufferLength) {

				HtsDebugPrint(HTS_DEBUG_LOW, "Invalid buffer length\n");

				return HtsIrpReturn(Irp, STATUS_INFO_LENGTH_MISMATCH);

			}
		}

		IoMarkIrpPending(Irp);

		ipGlobal.queueRequest(Irp);

		return STATUS_PENDING;
		
	default:

		HtsDebugPrint(HTS_DEBUG_HIGH, "Unexpected control code %x\n", controlCode);
		//
		// we don't understand this so get rid of it.
		//		
		Status = STATUS_INVALID_DEVICE_REQUEST;
		break;
	}

	return HtsIrpReturn(Irp, Status);

}


//
// the hooker herself!
//
PF_FORWARD_ACTION 
	IpHookFilter(IN unsigned char *PacketHeader,
				 IN unsigned char *Packet, 
				 IN unsigned int PacketLength, 
				 IN unsigned int RecvInterfaceIndex, 
				 IN unsigned int SendInterfaceIndex, 
				 IN IPAddr RecvLinkNextHop, 
				 IN IPAddr SendLinkNextHop)
{
	PF_FORWARD_ACTION action = PF_PASS;

	__try {
		//
		// is this interface single threaded or multi threaded?
		//
		ULONG sequence = ipGlobal.getSequence();

		HtsDebugPrint(HTS_DEBUG_LOW, "IpHookFilter PacketHeader %x Packet %x PacketLength %x\n",
					  PacketHeader, Packet, PacketLength);

		UCHAR header0 = *PacketHeader; //see what this is		
		//
		// if iph_verlen & 0xf0 != 0x40 we have 
		// something other than an IPV4 packet.
		//
		// if iph_verlen & 0xf0 != 0x60 then not
		// only is this not an IPV4 packet, but it 
		// isn't an IPV6 packet either.
		//

		if ((header0 & 0xf0) == 0x40) {

			PIPHOOK_DATA iphookdata = ipGlobal.getBuffer();
			//
			// ok its IPv4 or reasonably close!
			//
			if (iphookdata) {

				ULARGE_INTEGER ticks;
				
				KeQueryTickCount((PLARGE_INTEGER)&ticks);

				iphookdata->tag = IPHOOK_DATA_TAG;
  
				iphookdata->sequence = sequence; // ? see above ?
				iphookdata->header = *(IPHeader *) PacketHeader;
				iphookdata->timestamp = ticks.QuadPart;
				iphookdata->dataLength = PacketLength;
				if (RecvInterfaceIndex != INVALID_PF_IF_INDEX ) {

					iphookdata->direction = 0;
					iphookdata->nextHop = RecvLinkNextHop;
					iphookdata->ifIndex = RecvInterfaceIndex;

				} else {

					iphookdata->direction = 1;
					iphookdata->nextHop = SendLinkNextHop;
					iphookdata->ifIndex = SendInterfaceIndex;

				}

			} else {

				HtsDebugPrint(HTS_DEBUG_LOW, "IpHookFilter: no buffer\n");
			}
		}
	}

	__except(HTS_EXCEPTION_FILTER ) {

		//
		// cross your fingers and keep going
		//
		HtsDebugPrint(HTS_DEBUG_HIGH, "IpHookFilter continuing from exception");

	}

	return action;
}


NTSTATUS
	IpfStartHooking(PVOID context)
{
	HtsDebugPrint(HTS_DEBUG_LOW, "IpfStartHooking context %x owner %x\n",
				  PsGetCurrentThread(),
				  ipGlobal.owner());

	if (FALSE == ipGlobal.setOwner(context)) {
		//
		// some other thread owns the interface,
		// bail out
		//
		HtsDebugPrint(HTS_DEBUG_LOW, "In Use\n");

		return STATUS_CONNECTION_IN_USE; 

	} 
	//
	// we own the interface! now try to start it up
	//
	PF_SET_EXTENSION_HOOK_INFO extensionHook = { IpHookFilter, };

	KEVENT event;

	KeInitializeEvent(&event, NotificationEvent, FALSE);

	IO_STATUS_BLOCK IoStatus;

	PIRP Irp = 
		IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,
									  ipGlobal.getIpDevice(),
									  (PVOID) &extensionHook,
									  sizeof(PF_SET_EXTENSION_HOOK_INFO),
									  NULL,
									  0,
									  FALSE,
									  &event,
									  &IoStatus);

	if (!Irp) {
		//
		// we need to free up the interface!
		//
		HtsDebugPrint(HTS_DEBUG_HIGH, "IoBuildDeviceIoControlRequest no IRP!\n");

		ipGlobal.freeOwner(context);

		return STATUS_INSUFFICIENT_RESOURCES;

	}

	//
	// ok now send our IRP to the filter driver
	//
	NTSTATUS Status = IoCallDriver(ipGlobal.getIpDevice(), Irp);

	if (Status == STATUS_PENDING) {

		NTSTATUS WaitStatus = KeWaitForSingleObject(&event, UserRequest, KernelMode, FALSE, NULL);

		if (WaitStatus 	!= STATUS_SUCCESS ) {
			//
			// bummer!
			//
			HtsDebugPrint(HTS_DEBUG_HIGH, "KeWaitForSingleObject failed status %x\n", WaitStatus);
			//
			// we need to free up the interface!
			//		
			ipGlobal.freeOwner(context);

			return WaitStatus;
		}
	}

	Status = IoStatus.Status;

	if (!NT_SUCCESS(Status)) {
		//
		// we need to free up the interface!
		//		
		ipGlobal.freeOwner(context);
	}

	HtsDebugPrint(HTS_DEBUG_LOW, "IpfStartHooking returns %x\n", Status);
	
	return Status;

}


//
// NB failure modes here other than the caller isn't the owning thread are
// truly bogus. Only a cursory attempt is made to deal with them. Basically the 
// strategy is to propogate the failure back to the caller but leave the 
// filter interface in place.
//
NTSTATUS
	IpfStopHooking(PVOID context)
{
	HtsDebugPrint(HTS_DEBUG_LOW, "IpfStopHooking context %x owner %x\n",
				  context,
				  ipGlobal.owner());

	//
	// see if this is even legitimate
	//
	if (ipGlobal.IsOwner(context) == FALSE) {

		return STATUS_INVALID_OWNER;
	}
	//
	// ok so it is us, and we is the thread, so we can only be here ONCE
	// so we are already serialized, so everything is groovey. Except other
	// threads could open the hook device after we release ownership,
	// and new reads could arrive (but not on this thread.)
	//
	//
	// we own the interface! now try to start it up
	//
	PF_SET_EXTENSION_HOOK_INFO extensionHook = { (PacketFilterExtensionPtr) NULL, };

	KEVENT event;

	KeInitializeEvent(&event, NotificationEvent, FALSE);

	IO_STATUS_BLOCK IoStatus;

	PIRP Irp = 
		IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,
									  ipGlobal.getIpDevice(),
									  (PVOID) &extensionHook,
									  sizeof(PF_SET_EXTENSION_HOOK_INFO),
									  NULL,
									  0,
									  FALSE,
									  &event,
									  &IoStatus);

	if (!Irp) {

		HtsDebugPrint(HTS_DEBUG_HIGH,  "IoBuildDeviceIoControlRequest No IRP\n");
		
		return STATUS_INSUFFICIENT_RESOURCES;

	}

	//
	// ok now send our IRP to the filter driver
	//
	NTSTATUS Status = IoCallDriver(ipGlobal.getIpDevice(), Irp);

	if (Status == STATUS_PENDING) {

		NTSTATUS WaitStatus = KeWaitForSingleObject(&event, UserRequest, KernelMode, FALSE, NULL);


		if (WaitStatus 	!= STATUS_SUCCESS ) {

			HtsDebugPrint(HTS_DEBUG_HIGH, "KeWaitForSingleObject failed status %x\n", WaitStatus);
			//
			// bummer!
			//
			return WaitStatus;
		}
	}

	Status = IoStatus.Status;

	if (NT_SUCCESS(Status)) {
		//
		// we need to free up the interface!
		//
		ipGlobal.freeOwner(context);
	}

	HtsDebugPrint(HTS_DEBUG_LOW, "IpfStopHooking return %x\n", Status);

	return Status;

}

//
// IP_HOOK_GLOBAL_DATA and associates, LLC
//

VOID
GlobalCancel(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
	KIRQL irql = Irp->CancelIrql;

	IoReleaseCancelSpinLock(irql);

	PVOID context;

	ipGlobal.lock(context);
	//
	// this irp is in our queue
	//
	RemoveEntryList(&Irp->Tail.Overlay.ListEntry);

	HtsIrpReturn(Irp, STATUS_CANCELLED);

	ipGlobal.unlock(context);

}
///////////////////////////////////////////////////////////////////////////////
// 
// Change History Log
//
// $Log: /iphook/sys/driver/iphook.cpp $
// 
// 4     1/27/00 10:35p Markr
// Prepare to release!
//
///////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线视频一区二区| 福利一区二区在线| 粉嫩av亚洲一区二区图片| 91小视频在线| 国产人成亚洲第一网站在线播放 | 石原莉奈在线亚洲三区| 精品一区二区三区免费播放| 色婷婷av一区二区三区大白胸| 日韩精品一区二区三区老鸭窝 | 久久综合色综合88| 午夜精品福利一区二区三区av| 国产91精品精华液一区二区三区 | 成人av网站在线观看免费| 日韩欧美国产电影| 亚洲成人福利片| 一本一道综合狠狠老| 亚洲一二三区在线观看| 成人午夜视频在线观看| 精品国产欧美一区二区| 蜜臀91精品一区二区三区| 91久久精品日日躁夜夜躁欧美| 国产精品三级久久久久三级| 国产在线观看一区二区| 日韩欧美视频在线| 麻豆专区一区二区三区四区五区| 欧美日韩dvd在线观看| 一区二区三区小说| 一本一本久久a久久精品综合麻豆| 国产丝袜在线精品| 国产成人8x视频一区二区| 精品福利一二区| 久久超碰97中文字幕| 欧美r级在线观看| 久久er99热精品一区二区| 日韩三级视频在线看| 久久精品噜噜噜成人av农村| 日韩一区二区在线播放| 久久99国产精品成人| 亚洲精品一区二区三区香蕉| 国产一区二区剧情av在线| 久久久久久9999| 成人自拍视频在线| 亚洲人成在线观看一区二区| 色狠狠av一区二区三区| 一区二区三区日本| 欧美久久久影院| 久久99在线观看| 欧美国产一区二区| 日本精品视频一区二区三区| 亚洲制服丝袜一区| 91精品国产一区二区三区蜜臀| 麻豆久久久久久久| 国产亚洲一区二区三区在线观看| 国产99精品国产| 亚洲乱码中文字幕综合| 欧美一区二区在线视频| 韩国一区二区在线观看| 欧美国产禁国产网站cc| 欧美天堂亚洲电影院在线播放| 视频一区二区不卡| 国产欧美一区二区三区网站| 色香蕉久久蜜桃| 老色鬼精品视频在线观看播放| 久久精品综合网| 欧美日韩免费视频| 国产一区二区按摩在线观看| 亚洲蜜臀av乱码久久精品 | 99国内精品久久| 视频在线观看一区| 中文一区在线播放| 欧美日韩第一区日日骚| 大尺度一区二区| 午夜精品成人在线视频| 国产亚洲欧美激情| 欧美日韩不卡在线| 不卡高清视频专区| 免费成人结看片| 亚洲欧美激情小说另类| 日韩精品综合一本久道在线视频| 99久久婷婷国产综合精品电影| 日韩高清不卡一区二区三区| 国产精品女人毛片| 久久综合九色综合97婷婷女人 | 日韩精品一区二区在线观看| 色综合视频一区二区三区高清| 精品一区二区三区香蕉蜜桃| 亚洲一二三专区| 国产精品黄色在线观看| 久久综合久久99| 日韩午夜激情视频| 欧美日韩美女一区二区| eeuss鲁片一区二区三区在线看| 免费欧美高清视频| 亚洲国产毛片aaaaa无费看| 国产欧美视频在线观看| 日韩三级视频在线观看| 欧美男男青年gay1069videost| 99免费精品在线观看| 国产精品一区在线观看乱码 | 91精品国产综合久久久久久久久久| 成人免费毛片aaaaa**| 紧缚捆绑精品一区二区| 首页欧美精品中文字幕| 亚洲午夜视频在线观看| 亚洲女同一区二区| 中文字幕永久在线不卡| 国产亲近乱来精品视频| 久久久久99精品一区| 精品国产一区二区三区不卡| 91精品麻豆日日躁夜夜躁| 欧美日韩国产高清一区二区三区 | 亚洲女性喷水在线观看一区| 国产精品电影院| 国产精品美女久久久久aⅴ| 久久久久国产免费免费| 国产日韩精品一区| 中文文精品字幕一区二区| 中文字幕精品综合| 国产精品白丝在线| 亚洲综合图片区| 午夜精品久久久久久久99水蜜桃 | 欧美日韩国产综合一区二区三区| 一本色道综合亚洲| 欧美午夜一区二区三区免费大片| 欧美亚洲高清一区| 欧美顶级少妇做爰| 日韩欧美高清dvd碟片| 久久亚洲精华国产精华液 | 国产精品一区2区| www.色精品| 欧美视频在线不卡| 制服丝袜在线91| 久久日一线二线三线suv| 国产婷婷色一区二区三区四区| 国产精品久久久久一区二区三区 | 日韩激情在线观看| 国产自产视频一区二区三区| 国产精品18久久久久久vr| av在线不卡免费看| 欧美性色黄大片手机版| 日韩一卡二卡三卡国产欧美| 26uuu另类欧美亚洲曰本| 国产精品青草久久| 亚洲第一激情av| 国产美女娇喘av呻吟久久| 99免费精品视频| 91精品国产乱码久久蜜臀| 国产日韩欧美综合在线| 亚洲免费观看在线视频| 美腿丝袜亚洲一区| 99视频精品在线| 日韩女优制服丝袜电影| 亚洲欧美影音先锋| 美女视频网站黄色亚洲| 波多野结衣精品在线| 91精品国产色综合久久ai换脸 | 日韩视频免费观看高清完整版| 精品国产一区二区三区久久影院| 亚洲欧洲av色图| 国产一区三区三区| 欧美日韩一区在线观看| 欧美国产精品专区| 男人的天堂久久精品| 99久久婷婷国产综合精品电影| 欧美一区二区私人影院日本| 日本中文在线一区| 99re66热这里只有精品3直播| 9191久久久久久久久久久| 国产精品久久久久国产精品日日| 奇米影视一区二区三区| 在线视频观看一区| 国产嫩草影院久久久久| 蜜桃av噜噜一区二区三区小说| www.成人网.com| 久久天天做天天爱综合色| 亚洲成a天堂v人片| 色一情一伦一子一伦一区| 国产日产欧产精品推荐色 | av不卡免费在线观看| 精品国产乱码久久久久久夜甘婷婷| 一区二区三区久久| 91亚洲精品乱码久久久久久蜜桃| 精品卡一卡二卡三卡四在线| 天天射综合影视| 欧美伊人久久久久久午夜久久久久| 国产日韩亚洲欧美综合| 国产自产视频一区二区三区| 欧美一级专区免费大片| 日韩精品亚洲专区| 欧美放荡的少妇| 丝瓜av网站精品一区二区| 欧美日韩一区二区三区四区| 中文字幕一区二区三区色视频 | 欧美日韩国产综合视频在线观看 | 国产欧美一区二区精品忘忧草| 久久精品国产99久久6| 在线不卡中文字幕| 日韩福利视频导航| 欧美一区二区免费视频| 蜜臀av一区二区在线观看|