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

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

?? encryptedioqueue.c

?? turecrypt6.0版本的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 Copyright (c) 2008 TrueCrypt Foundation. All rights reserved.

 Governed by the TrueCrypt License 2.5 the full text of which is contained
 in the file License.txt included in TrueCrypt binary and source code
 distribution packages.
*/

#include "TCdefs.h"
#include "Apidrvr.h"
#include "Ntdriver.h"
#include "EncryptedIoQueue.h"
#include "EncryptionThreadPool.h"
#include "Volumes.h"


static void DecrementOutstandingIoCount (EncryptedIoQueue *queue)
{
	if (InterlockedDecrement (&queue->OutstandingIoCount) == 0 && (queue->SuspendPending || queue->StopPending))
		KeSetEvent (&queue->NoOutstandingIoEvent, IO_DISK_INCREMENT, FALSE);
}


static void OnItemCompleted (EncryptedIoQueueItem *item, BOOL freeItem)
{
	DecrementOutstandingIoCount (item->Queue);
	
	if (item->Queue->IsFilterDevice)
		IoReleaseRemoveLock (&item->Queue->RemoveLock, item->OriginalIrp);

	if (NT_SUCCESS (item->Status))
	{
		if (item->Write)
			item->Queue->TotalBytesWritten += item->OriginalLength;
		else
			item->Queue->TotalBytesRead += item->OriginalLength;
	}

	if (freeItem)
		TCfree (item);
}


static NTSTATUS CompleteOriginalIrp (EncryptedIoQueueItem *item, NTSTATUS status, ULONG_PTR information)
{
	//Dump ("Queue comp  offset=%I64d  status=%x  info=%p  out=%d\n", item->OriginalOffset, status, information, item->Queue->OutstandingIoCount - 1);
	
	TCCompleteDiskIrp (item->OriginalIrp, status, information);

	item->Status = status;
	OnItemCompleted (item, TRUE);

	return status;
}


static void AcquireFragmentBuffer (EncryptedIoQueue *queue, byte *buffer)
{
	NTSTATUS status = STATUS_INVALID_PARAMETER;

	if (buffer == queue->FragmentBufferA)
	{
		status = KeWaitForSingleObject (&queue->FragmentBufferAFreeEvent, Executive, KernelMode, FALSE, NULL);
	}
	else if (buffer == queue->FragmentBufferB)
	{
		status = KeWaitForSingleObject (&queue->FragmentBufferBFreeEvent, Executive, KernelMode, FALSE, NULL);
	}

	if (!NT_SUCCESS (status))
		TC_BUG_CHECK (status);
}


static void ReleaseFragmentBuffer (EncryptedIoQueue *queue, byte *buffer)
{
	if (buffer == queue->FragmentBufferA)
	{
		KeSetEvent (&queue->FragmentBufferAFreeEvent, IO_DISK_INCREMENT, FALSE);
	}
	else if (buffer == queue->FragmentBufferB)
	{
		KeSetEvent (&queue->FragmentBufferBFreeEvent, IO_DISK_INCREMENT, FALSE);
	}
	else
	{
		TC_BUG_CHECK (STATUS_INVALID_PARAMETER);
	}
}


static VOID CompletionThreadProc (PVOID threadArg)
{
	EncryptedIoQueue *queue = (EncryptedIoQueue *) threadArg;
	PLIST_ENTRY listEntry;
	EncryptedIoRequest *request;
	UINT64_STRUCT dataUnit;

	if (IsEncryptionThreadPoolRunning())
		KeSetPriorityThread (KeGetCurrentThread(), LOW_REALTIME_PRIORITY);

	while (!queue->ThreadExitRequested)
	{
		if (!NT_SUCCESS (KeWaitForSingleObject (&queue->CompletionThreadQueueNotEmptyEvent, Executive, KernelMode, FALSE, NULL)))
			continue;

		if (queue->ThreadExitRequested)
			break;

		while ((listEntry = ExInterlockedRemoveHeadList (&queue->CompletionThreadQueue, &queue->CompletionThreadQueueLock)))
		{
			request = CONTAINING_RECORD (listEntry, EncryptedIoRequest, CompletionListEntry);

			if (request->EncryptedLength > 0 && NT_SUCCESS (request->Item->Status))
			{
				ASSERT (request->EncryptedOffset + request->EncryptedLength <= request->Offset.QuadPart + request->Length);
				dataUnit.Value = (request->Offset.QuadPart + request->EncryptedOffset) / ENCRYPTION_DATA_UNIT_SIZE;

				if (queue->CryptoInfo->bPartitionInInactiveSysEncScope)
					dataUnit.Value += queue->CryptoInfo->FirstDataUnitNo.Value;
				else if (queue->RemapEncryptedArea)
					dataUnit.Value += queue->RemappedAreaDataUnitOffset;

				DecryptDataUnits (request->Data + request->EncryptedOffset, &dataUnit, request->EncryptedLength / ENCRYPTION_DATA_UNIT_SIZE, queue->CryptoInfo);
			}

			if (request->CompleteOriginalIrp)
			{
				CompleteOriginalIrp (request->Item, request->Item->Status,
					NT_SUCCESS (request->Item->Status) ? request->Item->OriginalLength : 0);
			}
			else
			{
				InterlockedDecrement (&request->Item->OutstandingRequestCount);
				KeSetEvent (&queue->RequestCompletedEvent, IO_DISK_INCREMENT, FALSE);
			}

			TCfree (request);
		}
	}

	PsTerminateSystemThread (STATUS_SUCCESS);
}


static VOID IoThreadProc (PVOID threadArg)
{
	EncryptedIoQueue *queue = (EncryptedIoQueue *) threadArg;
	PLIST_ENTRY listEntry;
	EncryptedIoRequest *request;

	KeSetPriorityThread (KeGetCurrentThread(), LOW_REALTIME_PRIORITY);

	while (!queue->ThreadExitRequested)
	{
		if (!NT_SUCCESS (KeWaitForSingleObject (&queue->IoThreadQueueNotEmptyEvent, Executive, KernelMode, FALSE, NULL)))
			continue;

		if (queue->ThreadExitRequested)
			break;

		while ((listEntry = ExInterlockedRemoveHeadList (&queue->IoThreadQueue, &queue->IoThreadQueueLock)))
		{
			request = CONTAINING_RECORD (listEntry, EncryptedIoRequest, ListEntry);
			
			// Perform IO request if no preceding request of the item failed
			if (NT_SUCCESS (request->Item->Status))
			{
				if (queue->IsFilterDevice)
				{
					if (queue->RemapEncryptedArea && request->EncryptedLength > 0)
					{
						if (request->EncryptedLength != request->Length)
						{
							// Up to three subfragments may be required to handle a partially remapped fragment
							int subFragment;
							byte *subFragmentData = request->Data;

							for (subFragment = 0 ; subFragment < 3; ++subFragment)
							{
								LARGE_INTEGER subFragmentOffset;
								ULONG subFragmentLength;
								subFragmentOffset.QuadPart = request->Offset.QuadPart;

								switch (subFragment)
								{
								case 0:
									subFragmentLength = (ULONG) request->EncryptedOffset;
									break;

								case 1:
									subFragmentOffset.QuadPart += request->EncryptedOffset + queue->RemappedAreaOffset;
									subFragmentLength = request->EncryptedLength;
									break;

								case 2:
									subFragmentOffset.QuadPart += request->EncryptedOffset + request->EncryptedLength;
									subFragmentLength = (ULONG) (request->Length - (request->EncryptedOffset + request->EncryptedLength));
									break;
								}

								if (subFragmentLength > 0)
								{
									if (request->Item->Write)
										request->Item->Status = TCWriteDevice (queue->LowerDeviceObject, subFragmentData, subFragmentOffset, subFragmentLength);
									else
										request->Item->Status = TCReadDevice (queue->LowerDeviceObject, subFragmentData, subFragmentOffset, subFragmentLength);

									subFragmentData += subFragmentLength;
								}
							}
						}
						else
						{
							// Remap the fragment
							LARGE_INTEGER remappedOffset;
							remappedOffset.QuadPart = request->Offset.QuadPart + queue->RemappedAreaOffset;

							if (request->Item->Write)
								request->Item->Status = TCWriteDevice (queue->LowerDeviceObject, request->Data, remappedOffset, request->Length);
							else
								request->Item->Status = TCReadDevice (queue->LowerDeviceObject, request->Data, remappedOffset, request->Length);
						}
					}
					else
					{
						if (request->Item->Write)
							request->Item->Status = TCWriteDevice (queue->LowerDeviceObject, request->Data, request->Offset, request->Length);
						else
							request->Item->Status = TCReadDevice (queue->LowerDeviceObject, request->Data, request->Offset, request->Length);
					}
				}
				else
				{
					IO_STATUS_BLOCK ioStatus;

					if (request->Item->Write)
						request->Item->Status = ZwWriteFile (queue->HostFileHandle, NULL, NULL, NULL, &ioStatus, request->Data, request->Length, &request->Offset, NULL);
					else
						request->Item->Status = ZwReadFile (queue->HostFileHandle, NULL, NULL, NULL, &ioStatus, request->Data, request->Length, &request->Offset, NULL);

					if (NT_SUCCESS (request->Item->Status) && ioStatus.Information != request->Length)
						request->Item->Status = STATUS_END_OF_FILE;
				}
			}

			if (request->Item->Write)
			{
				ReleaseFragmentBuffer (queue, request->Data);

				if (request->CompleteOriginalIrp)
				{
					CompleteOriginalIrp (request->Item, request->Item->Status,
						NT_SUCCESS (request->Item->Status) ? request->Item->OriginalLength : 0);
				}
				else
				{
					InterlockedDecrement (&request->Item->OutstandingRequestCount);
					KeSetEvent (&queue->RequestCompletedEvent, IO_DISK_INCREMENT, FALSE);
				}

				TCfree (request);
			}
			else
			{
				if (NT_SUCCESS (request->Item->Status))
					memcpy (request->OrigDataBufferFragment, request->Data, request->Length);

				ReleaseFragmentBuffer (queue, request->Data);
				request->Data = request->OrigDataBufferFragment;

				ExInterlockedInsertTailList (&queue->CompletionThreadQueue, &request->CompletionListEntry, &queue->CompletionThreadQueueLock);
				KeSetEvent (&queue->CompletionThreadQueueNotEmptyEvent, IO_DISK_INCREMENT, FALSE);
			}
		}
	}

	PsTerminateSystemThread (STATUS_SUCCESS);
}


static NTSTATUS OnPassedIrpCompleted (PDEVICE_OBJECT filterDeviceObject, PIRP irp, EncryptedIoQueueItem *item)
{
	if (irp->PendingReturned)
		IoMarkIrpPending (irp);

	OnItemCompleted (item, TRUE);
	return STATUS_CONTINUE_COMPLETION;
}


static VOID MainThreadProc (PVOID threadArg)
{
	EncryptedIoQueue *queue = (EncryptedIoQueue *) threadArg;
	PLIST_ENTRY listEntry;
	EncryptedIoQueueItem *item;

	LARGE_INTEGER fragmentOffset;
	ULONG dataRemaining;
	PUCHAR activeFragmentBuffer = queue->FragmentBufferA;
	PUCHAR dataBuffer;
	EncryptedIoRequest *request;
	uint64 intersectStart;
	uint32 intersectLength;

	int mdlWaitTime;
	LARGE_INTEGER mdlWaitInterval;
	mdlWaitInterval.QuadPart = TC_ENC_IO_QUEUE_MEM_ALLOC_RETRY_DELAY * -10000;

	if (IsEncryptionThreadPoolRunning())
		KeSetPriorityThread (KeGetCurrentThread(), LOW_REALTIME_PRIORITY);

	while (!queue->ThreadExitRequested)
	{
		if (!NT_SUCCESS (KeWaitForSingleObject (&queue->MainThreadQueueNotEmptyEvent, Executive, KernelMode, FALSE, NULL)))
			continue;

		while ((listEntry = ExInterlockedRemoveHeadList (&queue->MainThreadQueue, &queue->MainThreadQueueLock)))
		{
			PIRP irp = CONTAINING_RECORD (listEntry, IRP, Tail.Overlay.ListEntry);
			PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation (irp);
			
			if (queue->Suspended)
				KeWaitForSingleObject (&queue->QueueResumedEvent, Executive, KernelMode, FALSE, NULL);

			item = AllocateMemoryWithTimeout (sizeof (EncryptedIoQueueItem), TC_ENC_IO_QUEUE_MEM_ALLOC_RETRY_DELAY, TC_ENC_IO_QUEUE_MEM_ALLOC_TIMEOUT);
			if (!item)
			{
				EncryptedIoQueueItem stackItem;
				stackItem.Queue = queue;
				stackItem.OriginalIrp = irp;
				stackItem.Status = STATUS_INSUFFICIENT_RESOURCES;

				TCCompleteDiskIrp (irp, STATUS_INSUFFICIENT_RESOURCES, 0);
				OnItemCompleted (&stackItem, FALSE);
				continue;
			}

			item->Queue = queue;
			item->OriginalIrp = irp;
			item->OutstandingRequestCount = 0;
			item->Status = STATUS_SUCCESS;

			IoSetCancelRoutine (irp, NULL);
			if (irp->Cancel)
			{
				CompleteOriginalIrp (item, STATUS_CANCELLED, 0);
				continue;
			}

			switch (irpSp->MajorFunction)
			{
			case IRP_MJ_READ:
				item->Write = FALSE;
				item->OriginalOffset = irpSp->Parameters.Read.ByteOffset;
				item->OriginalLength = irpSp->Parameters.Read.Length;
				break;

			case IRP_MJ_WRITE:
				item->Write = TRUE;
				item->OriginalOffset = irpSp->Parameters.Write.ByteOffset;
				item->OriginalLength = irpSp->Parameters.Write.Length;
				break;

			default:
				CompleteOriginalIrp (item, STATUS_INVALID_PARAMETER, 0);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
9191精品国产综合久久久久久| 国产精品乱码一区二区三区软件 | 日韩精品乱码av一区二区| 美女爽到高潮91| 欧美性受xxxx黑人xyx性爽| 久久久99精品免费观看不卡| 亚洲成av人片观看| 97久久精品人人做人人爽| 欧美videossexotv100| 一区二区三区免费在线观看| 顶级嫩模精品视频在线看| 日韩欧美国产三级| 偷窥国产亚洲免费视频| 91在线国产福利| 欧美国产成人精品| 国产一区二区美女| 2021中文字幕一区亚洲| 久久精品国产成人一区二区三区 | 亚洲国产成人va在线观看天堂| 国产成人在线免费观看| 精品国产区一区| 免费观看30秒视频久久| 欧美三级电影一区| 香蕉久久一区二区不卡无毒影院| 97国产一区二区| 中文字幕中文字幕一区| 国产精品一区不卡| 久久青草国产手机看片福利盒子| 伦理电影国产精品| 欧美一区二区福利在线| 男女男精品网站| 日韩午夜激情免费电影| 免费久久99精品国产| 69成人精品免费视频| 日日嗨av一区二区三区四区| 欧美精品欧美精品系列| 亚洲国产另类精品专区| 欧美日韩黄视频| 免费在线观看一区二区三区| 91精品国产欧美一区二区| 麻豆成人91精品二区三区| 欧美mv日韩mv亚洲| 成人一区在线看| 亚洲精品写真福利| 欧美日韩第一区日日骚| 日本成人在线不卡视频| 精品国产91洋老外米糕| 国产1区2区3区精品美女| 国产精品乱码妇女bbbb| 91麻豆免费在线观看| 亚洲一本大道在线| 欧美一级二级在线观看| 国产一区二区电影| 亚洲精品国产无天堂网2021| 在线观看欧美黄色| 午夜天堂影视香蕉久久| 日韩一区二区免费电影| 狠狠狠色丁香婷婷综合久久五月| 国产精品成人免费精品自在线观看| 97se亚洲国产综合自在线观| 亚洲综合av网| 精品国产乱码久久久久久夜甘婷婷 | 在线一区二区三区四区五区| 婷婷国产在线综合| 国产日韩在线不卡| 欧美日韩美女一区二区| 国产成人鲁色资源国产91色综| 最近日韩中文字幕| 日韩一区二区免费视频| 91免费在线视频观看| 青青青伊人色综合久久| 国产精品久久久久一区二区三区| 欧美午夜不卡在线观看免费| 国产一区二区三区免费在线观看| 一区二区三区四区高清精品免费观看 | 宅男噜噜噜66一区二区66| 国产精品亚洲专一区二区三区| 亚洲黄网站在线观看| 久久精品一区四区| 欧美丰满高潮xxxx喷水动漫| 成人免费毛片a| 久久97超碰色| 亚洲一区二区在线免费看| 国产区在线观看成人精品| 欧美日韩精品综合在线| av资源网一区| 国产伦精品一区二区三区免费迷 | 91精品国产麻豆| 色美美综合视频| 国产夫妻精品视频| 日本中文字幕一区二区视频| 亚洲精品免费看| 亚洲国产成人一区二区三区| 日韩女优视频免费观看| 欧美日韩精品电影| 色欧美片视频在线观看在线视频| 成人午夜视频免费看| 久久99精品久久久久久久久久久久| 亚洲精品乱码久久久久久久久| 国产精品伦一区| 国产丝袜美腿一区二区三区| 精品国产青草久久久久福利| 欧美巨大另类极品videosbest| 色999日韩国产欧美一区二区| 高清beeg欧美| 国产精品69毛片高清亚洲| 韩国中文字幕2020精品| 国内成人自拍视频| 久久99国产精品久久| 久久97超碰国产精品超碰| 蜜臀久久99精品久久久久宅男| 婷婷激情综合网| 蜜桃av一区二区三区| 免费看黄色91| 极品少妇xxxx精品少妇偷拍| 老司机精品视频导航| 老司机精品视频在线| 久久99精品久久久久久久久久久久 | 成人晚上爱看视频| 国产91精品一区二区| 成人毛片老司机大片| 成人午夜av电影| 99久久777色| 色欧美片视频在线观看| 欧美性三三影院| 91麻豆精品国产91久久久 | 欧美日韩一区二区三区四区| 欧美色男人天堂| 欧美夫妻性生活| 精品久久久久久最新网址| 久久久综合网站| 亚洲视频资源在线| 亚洲线精品一区二区三区| 婷婷开心激情综合| 国产一区二区在线观看免费| 国产不卡视频在线观看| 欧洲人成人精品| 欧美一区二区三区的| 国产日韩av一区二区| 亚洲视频狠狠干| 午夜伦欧美伦电影理论片| 激情综合色综合久久综合| 成人精品一区二区三区中文字幕| 99国产精品一区| 日韩欧美成人一区| 国产精品久线在线观看| 亚洲国产成人91porn| 国产精品一区二区久久不卡| 91一区在线观看| 日韩欧美一区二区在线视频| 国产精品久久久久影院色老大 | 亚洲欧洲www| 免费人成精品欧美精品| 成人精品视频.| 在线播放亚洲一区| 国产精品区一区二区三区| 亚洲a一区二区| 本田岬高潮一区二区三区| 91麻豆精品国产91久久久久久久久 | 欧美激情在线一区二区| 亚洲成人免费观看| 成人中文字幕在线| 日韩欧美一级二级三级久久久| 日韩一区在线播放| 免费观看30秒视频久久| 在线观看成人小视频| 久久久不卡网国产精品一区| 天天影视网天天综合色在线播放| 成人夜色视频网站在线观看| 日韩三级视频在线观看| 一区二区三区日韩欧美| 成人在线综合网站| 欧美精品一区在线观看| 日韩经典一区二区| 在线观看日韩av先锋影音电影院| 久久人人97超碰com| 美女脱光内衣内裤视频久久网站| 欧美中文字幕一二三区视频| 国产精品午夜久久| 国产一区二区三区av电影| 91精品国产福利在线观看| 亚洲一区二区三区四区中文字幕 | 欧美日韩一区不卡| 中文字幕一区二区三区av| 国产永久精品大片wwwapp| 91精品久久久久久久久99蜜臂| 亚洲精品国产无套在线观| 波多野结衣中文一区| 久久青草欧美一区二区三区| 乱一区二区av| 欧美成人福利视频| 日日嗨av一区二区三区四区| 欧美人妖巨大在线| 亚洲国产精品视频| 在线国产亚洲欧美| 亚洲va韩国va欧美va精品| 欧美综合视频在线观看| 亚洲午夜免费视频| 欧美理论电影在线| 男女男精品视频|