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

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

?? sfilter.c

?? 網程絡過濾驅動,可以截獲網絡封包!對其進行分析攔截!
?? C
?? 第 1 頁 / 共 5 頁
字號:

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /
// 
//				IRP Handling Routines
// 
// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /


NTSTATUS
SfPassThrough(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	)
/*++

Routine Description:

	This routine is the main dispatch routine for the general purpose file
	system driver.  It simply passes requests onto the next driver in the
	stack, which is presumably a disk file system.

Arguments:

	DeviceObject - Pointer to the device object for this driver.

	Irp - Pointer to the request packet representing the I/O request.

Return Value:

	The function value is the status of the operation.

Note:

	A note to file system filter implementers:  
		This routine actually "passes" through the request by taking this
		driver out of the IRP stack.  If the driver would like to pass the
		I/O request through, but then also see the result, then rather than
		taking itself out of the loop it could keep itself in by copying the
		caller's parameters to the next stack location and then set its own
		completion routine.  

		Hence, instead of calling:
	
			IoSkipCurrentIrpStackLocation(Irp);

		You could instead call:

			IoCopyCurrentIrpStackLocationToNext(Irp);
			IoSetCompletionRoutine(Irp, NULL, NULL, FALSE, FALSE, FALSE);


		This example actually NULLs out the caller's I/O completion routine, but
		this driver could set its own completion routine so that it would be
		notified when the request was completed (see SfCreate for an example of
		this).

--*/
{
	// 
	// Sfilter doesn't allow handles to its control device object to be created,
	// therefore, no other operation should be able to come through.
	// 
	ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject));
	ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));

	// 
	// Get this driver out of the driver stack and get to the next driver as
	// quickly as possible.
	// 
	IoSkipCurrentIrpStackLocation(Irp);
	
	// 
	// Call the appropriate file system driver with the request.
	// 
	return IoCallDriver(((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp);
}


VOID
SfDisplayCreateFileName(
	IN PIRP Irp
	)
/*++

Routine Description:

	This function is called from SfCreate and will display the name of the
	file being created.  This is in a subroutine so that the local name buffer
	on the stack (in nameControl) is not on the stack when we call down to
	the file system for normal operations.

Arguments:

	Irp - Pointer to the I/O Request Packet that represents the operation.

Return Value:

	None.

--*/
{
	PIO_STACK_LOCATION IrpSp;
	PUNICODE_STRING Name;
	GET_NAME_CONTROL NameControl;

	// 
	// Get current IRP stack
	// 
	IrpSp = IoGetCurrentIrpStackLocation(Irp);

	// 
	// Get the Name of this file object
	// 
	Name = SfGetFileName(IrpSp->FileObject, 
		Irp->IoStatus.Status, 
		&NameControl);
	DbgPrint(Name);
	// 
	// Display the Name
	// 
	if (IrpSp->Parameters.Create.Options & FILE_OPEN_BY_FILE_ID) {
		
		SF_LOG_PRINT(SFDEBUG_DISPLAY_CREATE_NAMES,
					  ("SFilter!SfDisplayCreateFileName: Opened %08x:%08x %wZ (FID)\n", 
						Irp->IoStatus.Status,
						Irp->IoStatus.Information,
						Name));

	} else {

		SF_LOG_PRINT(SFDEBUG_DISPLAY_CREATE_NAMES,
					  ("SFilter!SfDisplayCreateFileName: Opened %08x:%08x %wZ\n", 
						Irp->IoStatus.Status,
						Irp->IoStatus.Information,
						Name));
	}

	// 
	// Cleanup from getting the Name
	// 
	SfGetFileNameCleanup(&NameControl);
}


NTSTATUS
SfCreate(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	)
{
	PSFILTER_DEVICE_EXTENSION DevExt = (PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
	PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
	PFILE_OBJECT FileObject = IrpSp->FileObject;
	PFILE_OBJECT RelatedFileObject = FileObject->RelatedFileObject;
	PWSTR FileName = NULL;
	NTSTATUS Status = STATUS_SUCCESS;
	POST_CREATE_WORKER_CONTEXT WorkerCtx;

	PAGED_CODE();

	// 
	// If this is for our control device object, don't allow it to be opened.
	// 
	if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
	{
		// 
		// Sfilter doesn't allow for any communication through its control
		// device object, therefore it fails all requests to open a handle
		// to its control device object.
		// 
		// See the FileSpy sample for an example of how to allow creates to 
		// the filter's control device object and manage communication via
		// that handle.
		// 
		Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
		Irp->IoStatus.Information = 0;
		IoCompleteRequest(Irp, IO_NO_INCREMENT);

		return STATUS_INVALID_DEVICE_REQUEST;
	}

	ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));

	// 
	// We only care about volume filter device object
	// 
	if (!DevExt->StorageStackDeviceObject)
	{
		IoSkipCurrentIrpStackLocation(Irp);
		return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
	}

	// 
	// Open Volume Device directly
	// 
	if ((FileObject->FileName.Length == 0) && !RelatedFileObject)
	{
		IoSkipCurrentIrpStackLocation(Irp);
		return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
	}

#if DBG
	if (DevExt->DriveLetter != DEBUG_VOLUME)
	{
		IoSkipCurrentIrpStackLocation(Irp);
		return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
	}
#endif

	do
	{
		// 
		// If the file is opened by id, then we can't get file name directly,
		// But if this case happened, the FsContext must be in GenericTable already.
		// So we just update the RefCount, that's enough
		// 
		if (!(IrpSp->Parameters.Create.Options & FILE_OPEN_BY_FILE_ID))
		{
			FileName = ExAllocateFromPagedLookasideList(&gFileNameLookAsideList);
			if (!FileName)
			{
				KdPrint(("sfilter!SfCreate: ExAllocatePoolWithTag failed\n"));

				Status = STATUS_INSUFFICIENT_RESOURCES;
				break;
			}

			if (!SfDissectFileName(DeviceObject, Irp, FileName))
			{
				KdPrint(("sfilter!SfCreate: SfDissectFileName failed\n"));
				
				Status = STATUS_INVALID_PARAMETER;
				break;
			}

			if (0 == _wcsnicmp(&FileName[3], SF_ENCRYPT_INFO_DIR, SF_ENCRYPT_INFOR_DIR_LENGTH))
			{
				// 
				// We deny all create request to our encrypt info dir except kernel mode
				// 
				if (KernelMode == Irp->RequestorMode)
				{
					ExFreeToPagedLookasideList(&gFileNameLookAsideList, FileName);

					IoSkipCurrentIrpStackLocation(Irp);
					return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
				}
				else
				{
					Status = STATUS_NO_SUCH_FILE;
					break;
				}
			}
			else
			{
				if (IrpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE)
				{
					//
					// We don't care about directories
					//
					ExFreeToPagedLookasideList(&gFileNameLookAsideList, FileName);

					IoSkipCurrentIrpStackLocation(Irp);
					return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
				}
			}
		}
		else
		{
			if (IrpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE)
			{
				//
				// We don't care about directories
				//
				IoSkipCurrentIrpStackLocation(Irp);
				return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
			}
		}
		
		Status = SfForwardIrpSyncronously(DevExt->AttachedToDeviceObject, Irp);
		if (NT_SUCCESS(Status) && (STATUS_REPARSE != Status))
		{
			FILE_CONTEXT FileCtx;
			PFILE_CONTEXT FileCtxPtr = NULL;
			BOOLEAN NewElement = FALSE;

			FileCtx.FsContext = FileObject->FsContext;

			ExAcquireFastMutex(&DevExt->FsCtxTableMutex);

			FileCtxPtr = RtlLookupElementGenericTable(&DevExt->FsCtxTable, &FileCtx);
			if (FileCtxPtr)
				++FileCtxPtr->RefCount;
			else
			{
				FileCtxPtr = RtlInsertElementGenericTable(
					&DevExt->FsCtxTable,
					&FileCtx,
					sizeof(FILE_CONTEXT),
					&NewElement
					);

				FileCtxPtr->RefCount = 1;

				ASSERT(FileName);
				wcscpy(FileCtxPtr->Name, FileName);

				KeInitializeEvent(&FileCtxPtr->Event, SynchronizationEvent, TRUE);
			}

			ExReleaseFastMutex(&DevExt->FsCtxTableMutex);

			ExInitializeWorkItem(&WorkerCtx.WorkItem, SfPostCreateWorker, &WorkerCtx);
			WorkerCtx.DeviceObject = DeviceObject;
			WorkerCtx.FileObject = FileObject;
			KeInitializeEvent(&WorkerCtx.Event, NotificationEvent, FALSE);
			WorkerCtx.FileContext = FileCtxPtr;
			WorkerCtx.NewElement = NewElement;
				
			if (KeGetCurrentIrql() == PASSIVE_LEVEL)
				SfPostCreateWorker(&WorkerCtx);
			else
			{
				ExQueueWorkItem(&WorkerCtx.WorkItem, DelayedWorkQueue);
				KeWaitForSingleObject(&WorkerCtx.Event, Executive, KernelMode, FALSE, NULL);
			}
		}
	} while (FALSE);

	if (FileName)
		ExFreeToPagedLookasideList(&gFileNameLookAsideList, FileName);

	Irp->IoStatus.Status = Status;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);

	return Status;
}

VOID
SfPostCreateWorker(
	IN PVOID Context
	)
{
	PPOST_CREATE_WORKER_CONTEXT WorkerCtx = Context;
	PDEVICE_OBJECT DeviceObject = WorkerCtx->DeviceObject;
	PFILE_OBJECT FileObject = WorkerCtx->FileObject;
	PFILE_CONTEXT FileCtxPtr = WorkerCtx->FileContext;
	BOOLEAN NewElement = WorkerCtx->NewElement;
	BOOLEAN IsEncryptFlagExist = FALSE;
	BOOLEAN IsNeedEncrypt = FALSE;
	NTSTATUS Status = STATUS_SUCCESS;

	KdPrint(("sfilter!SfPostCreateWorker: FileName = %ws\n", FileCtxPtr->Name));

	//
	// we need handle file synchronously
	//
	KeWaitForSingleObject(&FileCtxPtr->Event, Executive, KernelMode, FALSE, NULL);
	
	if (NewElement)
	{
		Status = SfIsEncryptFlagExist(DeviceObject, FileCtxPtr->Name, &IsEncryptFlagExist, FileCtxPtr->EncryptExtData, sizeof(FileCtxPtr->EncryptExtData));
		if (!NT_SUCCESS(Status))
			KdPrint(("sfilter!SfCreate: SfIsEncryptFlagExist failed, return %x\n", Status));
		
		Status = SfIsFileNeedEncrypt(DeviceObject, FileCtxPtr->Name, &IsNeedEncrypt);
		if (!NT_SUCCESS(Status))
			KdPrint(("sfilter!SfCreate: SfIsFileNeedEncrypt failed, return %x\n", Status));
	
		FileCtxPtr->EncryptFlagExist = IsEncryptFlagExist;
		FileCtxPtr->NeedEncrypt = IsNeedEncrypt;
	}
	else
	{
		IsEncryptFlagExist = FileCtxPtr->EncryptFlagExist;
		IsNeedEncrypt = FileCtxPtr->NeedEncrypt;

		ASSERT(IsEncryptFlagExist == IsNeedEncrypt);
	}
	
	if ((!IsNeedEncrypt && IsEncryptFlagExist) || (IsNeedEncrypt && !IsEncryptFlagExist))
	{
		if (!IsNeedEncrypt && IsEncryptFlagExist)
		{
			FileCtxPtr->DecryptOnRead = TRUE;
			FileCtxPtr->EncryptOnWrite = FALSE;
			
			KdPrint(("sfilter!SfPostCreateWorker: Decrypt %ws\n", FileCtxPtr->Name));
			Status = SfEncryptDecryptFileByFileObject(DeviceObject, FileObject);
			if (NT_SUCCESS(Status))
			{
				FileCtxPtr->DecryptOnRead = FALSE;
				FileCtxPtr->EncryptOnWrite = FALSE;
	
				Status = SfSetFileEncrypted(DeviceObject, FileCtxPtr->Name, FALSE, NULL, 0);
				if (NT_SUCCESS(Status))
					FileCtxPtr->EncryptFlagExist = FALSE;
				else
					KdPrint(("sfilter!SfCreate: SfSetFileEncrypted(%ws, FALSE) failed, return %x\n", FileCtxPtr->Name, Status));
			}
			else
			{
				KdPrint(("sfilter!SfCreate: SfEncryptDecryptFileByFileObject failed, return %x\n", Status));
	
				FileCtxPtr->DecryptOnRead = TRUE;
				FileCtxPtr->EncryptOnWrite = TRUE;
			}
		}
		else
		{
			FileCtxPtr->DecryptOnRead = FALSE;
			FileCtxPtr->EncryptOnWrite = TRUE;

			KdPrint(("sfilter!SfPostCreateWorker: Encrypt %ws\n", FileCtxPtr->Name));
			Status = SfEncryptDecryptFileByFileObject(DeviceObject, FileObject);
			if (NT_SUCCESS(Status))
			{
				FileCtxPtr->DecryptOnRead = TRUE;
				FileCtxPtr->EncryptOnWrite = TRUE;
	
				Status = SfSetFileEncrypted(DeviceObject, FileCtxPtr->Name, TRUE, FileCtxPtr->EncryptExtData, sizeof(FileCtxPtr->EncryptExtData));
				if (NT_SUCCESS(Status))
					FileCtxPtr->EncryptFlagExist = TRUE;
				else
					KdPrint(("sfilter!SfCreate: SfSetFileEncrypted(%ws, TRUE) failed, return %x\n", FileCtxPtr->Name, Status));
			}
			else
			{
				KdPrint(("sfilter!SfCreate: SfEncryptDecryptFileByFileObject failed, return %x\n", Status));
	
				FileCtxPtr->DecryptOnRead = FALSE;
				FileCtxPtr->EncryptOnWrite = FALSE;
			}											
		}
	}
	else
	{
		if (IsNeedEncrypt && IsEncryptFlagExist)
		{
			FileCtxPtr->DecryptOnRead = TRUE;
			FileCtxPtr->EncryptOnWrite = TRUE;
		}
		else
		{
			FileCtxPtr->DecryptOnRead = FALSE;
			FileCtxPtr->EncryptOnWrite = FALSE;
		}
	}
	
	KeSetEvent(&FileCtxPtr->Event, IO_NO_INCREMENT, FALSE);

	KeSetEvent(&WorkerCtx->Event, IO_NO_INCREMENT, FALSE);
}

NTSTATUS
SfCleanupClose(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	)
{
	PSFILTER_DEVICE_EXTENSION DevExt = (PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
	PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
	PFILE_OBJECT FileObject = IrpSp->FileObject;

	PAGED_CODE();

	// 
	// Sfilter doesn't allow handles to its control device object to be created,
	// therefore, no other operation should be able to come through.
	//  
	ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject));
	ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));

#if DBG
	if (DevExt->DriveLetter != DEBUG_VOLUME)
	{
		IoSkipCurrentIrpStackLocation(Irp);
		return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
	}
#endif
	
	// 
	// We only care about volume filter device object
	// 
	if (DevExt->StorageStackDeviceObject && (IrpSp->MajorFunction == IRP_MJ_CLOSE))
	{
		FILE_CONTEXT FileCtx;
		PFILE_CONTEXT FileCtxPtr = NULL;

		if (((FileObject->Flags & FO_STREAM_FILE) == FO_STREAM_FILE) ||
			(FileObject->Sectio

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲永久精品国产| 色综合欧美在线视频区| 成人深夜在线观看| 在线免费不卡视频| 精品国产精品网麻豆系列| 亚洲欧洲日韩综合一区二区| 青青草视频一区| 色婷婷久久99综合精品jk白丝 | 国产精品色眯眯| 免费人成黄页网站在线一区二区| 日韩精品一区二区三区中文精品 | 在线91免费看| 欧美一区午夜精品| 亚洲天堂av老司机| 高清国产一区二区| 日韩精品一区二区三区在线播放| 亚洲免费色视频| 成人av网站在线观看| 国产日本亚洲高清| 国产酒店精品激情| 欧美不卡一二三| 奇米综合一区二区三区精品视频| 91国模大尺度私拍在线视频| 国产精品久久久久国产精品日日| 国产成人激情av| 久久精品欧美一区二区三区不卡| 精品一区二区三区香蕉蜜桃 | 国产成人在线视频网站| 日韩无一区二区| 亚洲成人av一区二区| 欧洲视频一区二区| 亚洲伦理在线免费看| 91在线观看免费视频| 亚洲欧洲日本在线| 99国产麻豆精品| 中文字幕在线不卡一区| 成人福利在线看| 亚洲色图制服诱惑| 一本久久精品一区二区| 亚洲一区二区三区四区五区黄| 色婷婷久久久久swag精品| 亚洲一区在线观看免费| 欧美美女一区二区三区| 免费亚洲电影在线| 久久久一区二区| 亚洲chinese男男1069| 国产精品嫩草99a| 国产情人综合久久777777| 国产a久久麻豆| 国产精品嫩草久久久久| 色婷婷av一区二区三区之一色屋| 一区二区三区久久| 欧美日本一区二区| 日韩精品高清不卡| 日韩美女视频在线| 成人av资源站| 亚洲午夜羞羞片| 精品国产免费一区二区三区四区| 国产成人丝袜美腿| 樱花草国产18久久久久| 欧美一区日韩一区| 成人午夜免费电影| 亚洲综合色噜噜狠狠| 日韩天堂在线观看| 成人丝袜视频网| 日本伊人色综合网| 国产精品毛片无遮挡高清| 欧美喷潮久久久xxxxx| 国产又粗又猛又爽又黄91精品| 国产精品久久久久精k8| 欧美疯狂性受xxxxx喷水图片| 国产精品1024久久| 亚洲第一搞黄网站| 国产精品免费久久久久| 欧美美女网站色| 99久久精品免费看国产| 麻豆freexxxx性91精品| 国产精品国产自产拍高清av王其 | 一区二区三区成人| 欧美va亚洲va| 欧美在线|欧美| 丁香亚洲综合激情啪啪综合| 亚洲成人综合网站| 国产精品污www在线观看| 欧美一级欧美三级在线观看| 成人动漫一区二区在线| 精品中文av资源站在线观看| 亚洲日本青草视频在线怡红院| 26uuu精品一区二区在线观看| 在线精品国精品国产尤物884a| 国产精品1区二区.| 欧美日韩精品一区二区三区四区 | 欧美一个色资源| www.av亚洲| 久久精品国产色蜜蜜麻豆| 亚洲人成网站色在线观看| www国产亚洲精品久久麻豆| 在线免费av一区| 粉嫩av一区二区三区在线播放| 日本不卡123| 亚洲黄色尤物视频| 国产精品免费观看视频| 久久综合久久综合久久| 制服.丝袜.亚洲.中文.综合| 日本久久精品电影| 不卡一区在线观看| 国产jizzjizz一区二区| 国模大尺度一区二区三区| 婷婷夜色潮精品综合在线| 成人欧美一区二区三区视频网页| 国产亚洲一区二区三区四区| 欧美v日韩v国产v| 日韩精品一区在线观看| 日韩一卡二卡三卡| 91精品视频网| 欧美放荡的少妇| 欧美性大战久久久久久久蜜臀 | 麻豆精品国产91久久久久久| 日韩精品高清不卡| 五月激情综合色| 亚洲国产cao| 天堂精品中文字幕在线| 午夜精品久久久久久久99樱桃 | 国产一区二区精品久久91| 麻豆精品在线看| 久久精品99国产精品| 蜜桃传媒麻豆第一区在线观看| 奇米影视一区二区三区| 久久国产剧场电影| 国产精品一区二区不卡| 国产.精品.日韩.另类.中文.在线.播放| 国产麻豆欧美日韩一区| 成人av网站在线观看免费| 色哟哟一区二区| 欧美日韩一区精品| 精品人在线二区三区| 国产欧美日韩麻豆91| 亚洲乱码国产乱码精品精可以看| 五月综合激情网| 韩国精品在线观看| 成人av免费在线| 欧美日韩电影在线播放| 久久综合色一综合色88| 亚洲日本成人在线观看| 青娱乐精品在线视频| 国产精品一级片| 在线精品视频免费播放| 日韩精品一区二区三区四区| 国产精品午夜在线| 五月激情丁香一区二区三区| 国产乱码精品一区二区三区忘忧草| 99精品1区2区| 日韩精品专区在线影院观看| 自拍视频在线观看一区二区| 日韩精品每日更新| 99久久国产综合精品女不卡| 欧美精品自拍偷拍| 国产精品―色哟哟| 美女网站色91| 91国偷自产一区二区三区成为亚洲经典 | 亚洲欧美日韩中文播放| 日本成人在线不卡视频| 99久久久无码国产精品| 欧美大片一区二区三区| 一区二区三区四区在线播放| 国产一区在线观看视频| 欧美人牲a欧美精品| 欧美极品少妇xxxxⅹ高跟鞋| 青青青爽久久午夜综合久久午夜| 成a人片亚洲日本久久| 精品免费国产一区二区三区四区| 亚洲一区二区三区四区在线免费观看 | 久久久99精品免费观看不卡| 亚洲第一在线综合网站| 91免费版在线看| 国产欧美一二三区| 久久国产尿小便嘘嘘尿| 精品污污网站免费看| 亚洲欧美一区二区三区孕妇| 国产精品一区免费视频| 欧美成人精品3d动漫h| 亚洲综合在线第一页| av成人老司机| 国产欧美日韩麻豆91| 6080午夜不卡| 亚洲一二三四久久| 91在线视频免费观看| 久久久久久久久久久黄色| 日本sm残虐另类| 欧美日韩国产在线观看| 尤物在线观看一区| 91天堂素人约啪| 欧美国产精品中文字幕| 国产精品羞羞答答xxdd| 久久精品男人天堂av| 国产福利视频一区二区三区| 26uuu国产电影一区二区| 日韩av电影天堂| 日韩一区二区高清| 久久国产精品区|