亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧美在线一区二区三区| 亚洲综合一二三区| 午夜免费久久看| 欧美日韩中文精品| 亚洲国产视频网站| 欧美美女黄视频| 日本欧美肥老太交大片| 91精品国产一区二区| 日韩精品乱码免费| 精品国产麻豆免费人成网站| 狠狠色丁香久久婷婷综合_中| 欧美在线观看一区二区| 亚洲精品国久久99热| 色8久久人人97超碰香蕉987| 午夜精品影院在线观看| 精品久久久久久久久久久久久久久久久 | 精品国产青草久久久久福利| 婷婷综合五月天| 日韩欧美国产综合一区 | 中文字幕av资源一区| 99re在线视频这里只有精品| 国产精品看片你懂得| 色系网站成人免费| 亚洲在线观看免费| 日韩精品一区二区三区在线观看| 国产**成人网毛片九色| 亚洲午夜久久久久久久久久久 | 91麻豆高清视频| 日韩国产高清影视| 中文字幕精品—区二区四季| 欧美军同video69gay| 成人短视频下载| 久久国内精品视频| 亚洲动漫第一页| 亚洲精品视频免费观看| 国产欧美一区二区在线观看| 在线综合亚洲欧美在线视频| 6080日韩午夜伦伦午夜伦| 2021国产精品久久精品| 国产精品欧美久久久久一区二区| 日本一区二区久久| 国产拍欧美日韩视频二区 | 国产精品夜夜爽| 懂色av一区二区夜夜嗨| 国产盗摄视频一区二区三区| 成人精品免费看| 成人免费视频播放| 高清不卡一区二区| 91玉足脚交白嫩脚丫在线播放| 99久久婷婷国产综合精品| 韩国欧美国产1区| 国产成人精品免费在线| 波多野结衣精品在线| 欧美性猛交xxxx黑人交| 日韩三级在线免费观看| 中文字幕欧美激情| 成人免费小视频| 亚洲综合一区二区| 久久99精品国产.久久久久久| 极品少妇一区二区| 在线视频综合导航| 欧美一区2区视频在线观看| 久久久另类综合| 国产精品乱人伦中文| 一级做a爱片久久| 国产精品亚洲专一区二区三区 | 91美女片黄在线观看| 欧美日韩五月天| 久久色在线观看| 男女视频一区二区| 成人黄色国产精品网站大全在线免费观看| 色综合久久综合网欧美综合网| 69久久夜色精品国产69蝌蚪网| 日韩一区二区高清| 午夜欧美在线一二页| 日本aⅴ亚洲精品中文乱码| 91麻豆精东视频| 中文字幕亚洲一区二区av在线| 亚洲成年人网站在线观看| 不卡区在线中文字幕| 91精品在线观看入口| 一区二区三区久久久| 99久精品国产| 日本一区二区电影| 久久国产欧美日韩精品| 日韩免费看网站| 免费在线观看成人| 欧美群妇大交群中文字幕| 中文字幕精品一区二区精品绿巨人| 亚洲精品成人精品456| 不卡一区在线观看| 国产人伦精品一区二区| 国产一区二区三区四区五区入口| 久久综合九色综合97婷婷| 精品综合免费视频观看| 精品久久久久久亚洲综合网 | 久久精品国产免费| 日韩久久久精品| 久久国产精品第一页| 中文字幕不卡在线| 91成人免费网站| 亚洲国产一区二区在线播放| 69久久99精品久久久久婷婷| 久久精品99国产精品日本| 亚洲精品一区二区在线观看| 精品亚洲免费视频| 国产精品网曝门| 欧美主播一区二区三区| 亚洲高清不卡在线观看| 51精品视频一区二区三区| 国产精品综合一区二区| 亚洲精品成人精品456| 精品99999| 91国偷自产一区二区开放时间| 日韩福利视频导航| 日韩美女主播在线视频一区二区三区 | 国产日韩欧美精品一区| 在线亚洲人成电影网站色www| 日韩av高清在线观看| 一区二区三区在线高清| 国产精品每日更新| 国产丝袜美腿一区二区三区| 日韩一级片网站| 制服丝袜亚洲色图| 欧美三区免费完整视频在线观看| 成人精品一区二区三区四区| 国产美女一区二区| 国产精品自拍毛片| 成人午夜大片免费观看| 亚洲国产精品麻豆| 国产a区久久久| 夫妻av一区二区| 精品午夜久久福利影院| 蜜桃视频免费观看一区| 国模少妇一区二区三区| 国产91丝袜在线18| 91在线精品秘密一区二区| 夜夜操天天操亚洲| 一区二区三区四区国产精品| 五月天亚洲婷婷| 国产iv一区二区三区| 欧美日韩五月天| 国产精品亲子伦对白| 亚洲一区二区3| 成人免费高清视频在线观看| 日本精品视频一区二区| 欧美伊人久久久久久午夜久久久久| 91麻豆精品视频| 日韩精品最新网址| 国产午夜精品一区二区| 成人免费视频在线观看| 亚洲欧美一区二区三区国产精品 | 色综合久久久久综合体桃花网| 91亚洲精华国产精华精华液| 这里只有精品电影| 中文字幕国产精品一区二区| 亚洲激情图片qvod| 免费成人在线视频观看| 97久久精品人人爽人人爽蜜臀| 欧美日韩国产色站一区二区三区| 日韩你懂的在线播放| 一区二区三区在线视频观看| 国产成人亚洲精品青草天美| 欧美三片在线视频观看 | 久久久久久久久久久久久女国产乱| 自拍偷自拍亚洲精品播放| 日韩av中文在线观看| 91影院在线免费观看| 国产欧美久久久精品影院| 日韩成人av影视| 不卡在线观看av| 久久久久国产精品麻豆| 亚洲国产综合视频在线观看| 色综合色综合色综合| 国产精品丝袜黑色高跟| 国产91丝袜在线观看| 久久久无码精品亚洲日韩按摩| 蜜臀av在线播放一区二区三区| 91视频免费看| 一区二区欧美国产| 欧美日韩一级大片网址| 日韩精品亚洲专区| 欧美一区二区大片| 国产又黄又大久久| 欧美精品一区二区在线播放| 日本不卡不码高清免费观看| 欧美亚洲丝袜传媒另类| 18欧美乱大交hd1984| 国产精品69毛片高清亚洲| 成人中文字幕在线| 国产区在线观看成人精品| 国产91精品一区二区| 亚洲天堂网中文字| 欧美男女性生活在线直播观看| 无码av免费一区二区三区试看| 在线播放视频一区| 国产乱人伦精品一区二区在线观看| 国产女主播视频一区二区| 欧美性大战久久久久久久| 久久99精品一区二区三区三区|