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

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

?? encryptedioqueue.c

?? turecrypt6.0版本的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
				continue;
			}

			// Pass the IRP if the drive is not encrypted
			if (queue->IsFilterDevice && (queue->EncryptedAreaStart == -1 || queue->EncryptedAreaEnd == -1))
			{
				IoCopyCurrentIrpStackLocationToNext (irp);
				IoSetCompletionRoutine (irp, OnPassedIrpCompleted, item, TRUE, TRUE, TRUE);
				IoCallDriver (queue->LowerDeviceObject, irp);
				continue;
			}

			// Validate offset and length
			if (item->OriginalLength == 0
				|| (item->OriginalLength & (ENCRYPTION_DATA_UNIT_SIZE - 1)) != 0
				|| (item->OriginalOffset.QuadPart & (ENCRYPTION_DATA_UNIT_SIZE - 1)) != 0
				|| (!queue->IsFilterDevice && item->OriginalOffset.QuadPart + item->OriginalLength > queue->VirtualDeviceLength))
			{
				CompleteOriginalIrp (item, STATUS_INVALID_PARAMETER, 0);
				continue;
			}

			//Dump ("--- Queue %c %I64d  (%I64d)  %d  out=%d\n", item->Write ? 'W' : 'R', item->OriginalOffset.QuadPart, item->OriginalOffset.QuadPart / 1024 / 1024, item->OriginalLength, queue->OutstandingIoCount);

			if (!queue->IsFilterDevice)
			{
				// Adjust the offset for host file or device
				if (queue->CryptoInfo->hiddenVolume)
					item->OriginalOffset.QuadPart += queue->CryptoInfo->hiddenVolumeOffset;
				else
					item->OriginalOffset.QuadPart += queue->CryptoInfo->volDataAreaOffset; 

				// Hidden volume protection
				if (item->Write && queue->CryptoInfo->bProtectHiddenVolume)
				{
					// If there has already been a write operation denied in order to protect the
					// hidden volume (since the volume mount time)
					if (queue->CryptoInfo->bHiddenVolProtectionAction)	
					{
						// Do not allow writing to this volume anymore. This is to fake a complete volume
						// or system failure (otherwise certain kinds of inconsistency within the file
						// system could indicate that this volume has used hidden volume protection).
						CompleteOriginalIrp (item, STATUS_INVALID_PARAMETER, 0);
						continue;
					}

					// Verify that no byte is going to be written to the hidden volume area
					if (RegionsOverlap ((unsigned __int64) item->OriginalOffset.QuadPart,
						(unsigned __int64) item->OriginalOffset.QuadPart + item->OriginalLength - 1,
						queue->CryptoInfo->hiddenVolumeOffset,
						(unsigned __int64) queue->CryptoInfo->hiddenVolumeOffset + queue->CryptoInfo->hiddenVolumeProtectedSize - 1))
					{
						Dump ("Hidden volume protection triggered: write %I64d-%I64d (protected %I64d-%I64d)\n", item->OriginalOffset.QuadPart, item->OriginalOffset.QuadPart + item->OriginalLength - 1, queue->CryptoInfo->hiddenVolumeOffset, queue->CryptoInfo->hiddenVolumeOffset + queue->CryptoInfo->hiddenVolumeProtectedSize - 1);
						queue->CryptoInfo->bHiddenVolProtectionAction = TRUE;

						// Deny this write operation to prevent the hidden volume from being overwritten
						CompleteOriginalIrp (item, STATUS_INVALID_PARAMETER, 0);
						continue;
					}
				}
			}

			// Original IRP data buffer
			mdlWaitTime = 0;
			while (TRUE)
			{
				dataBuffer = (PUCHAR) MmGetSystemAddressForMdlSafe (irp->MdlAddress, HighPagePriority);

				if (dataBuffer || mdlWaitTime >= TC_ENC_IO_QUEUE_MEM_ALLOC_TIMEOUT)
					break;

				KeDelayExecutionThread (KernelMode, FALSE, &mdlWaitInterval);
				mdlWaitTime += TC_ENC_IO_QUEUE_MEM_ALLOC_RETRY_DELAY;
			}

			if (dataBuffer == NULL)
			{
				CompleteOriginalIrp (item, STATUS_INSUFFICIENT_RESOURCES, 0);
				continue;
			}

			// Divide data block to fragments to enable efficient overlapping of encryption and IO operations

			dataRemaining = item->OriginalLength;
			fragmentOffset = item->OriginalOffset;

			while (dataRemaining > 0)
			{
				BOOL isLastFragment = dataRemaining <= TC_ENC_IO_QUEUE_MAX_FRAGMENT_SIZE;
				
				ULONG dataFragmentLength = isLastFragment ? dataRemaining : TC_ENC_IO_QUEUE_MAX_FRAGMENT_SIZE;
				activeFragmentBuffer = (activeFragmentBuffer == queue->FragmentBufferA ? queue->FragmentBufferB : queue->FragmentBufferA);

				// Create IO request
				request = (EncryptedIoRequest *) AllocateMemoryWithTimeout (sizeof (EncryptedIoRequest), TC_ENC_IO_QUEUE_MEM_ALLOC_RETRY_DELAY, TC_ENC_IO_QUEUE_MEM_ALLOC_TIMEOUT);
				if (!request)
				{
					while (InterlockedExchangeAdd (&item->OutstandingRequestCount, 0) > 0)
						KeWaitForSingleObject (&queue->RequestCompletedEvent, Executive, KernelMode, FALSE, NULL);

					CompleteOriginalIrp (item, STATUS_INSUFFICIENT_RESOURCES, 0);
					break;
				}

				request->Item = item;
				request->CompleteOriginalIrp = isLastFragment;
				request->Offset = fragmentOffset;
				request->Data = activeFragmentBuffer;
				request->OrigDataBufferFragment = dataBuffer;
				request->Length = dataFragmentLength;

				if (queue->IsFilterDevice)
				{
					// Get intersection of data fragment with encrypted area
					GetIntersection (fragmentOffset.QuadPart, dataFragmentLength, queue->EncryptedAreaStart, queue->EncryptedAreaEnd, &intersectStart, &intersectLength);

					request->EncryptedOffset = intersectStart - fragmentOffset.QuadPart;
					request->EncryptedLength = intersectLength;
				}
				else
				{
					request->EncryptedOffset = 0;
					request->EncryptedLength = dataFragmentLength;
				}

				AcquireFragmentBuffer (queue, activeFragmentBuffer);

				if (item->Write)
				{
					// Encrypt data
					memcpy (activeFragmentBuffer, dataBuffer, dataFragmentLength);

					if (request->EncryptedLength > 0)
					{
						UINT64_STRUCT dataUnit;
						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;
								
						EncryptDataUnits (activeFragmentBuffer + request->EncryptedOffset, &dataUnit, request->EncryptedLength / ENCRYPTION_DATA_UNIT_SIZE, queue->CryptoInfo);
					}
				}

				// Queue IO request
				InterlockedIncrement (&item->OutstandingRequestCount);

				ExInterlockedInsertTailList (&queue->IoThreadQueue, &request->ListEntry, &queue->IoThreadQueueLock);
				KeSetEvent (&queue->IoThreadQueueNotEmptyEvent, IO_DISK_INCREMENT, FALSE);

				if (isLastFragment)
					break;

				dataRemaining -= TC_ENC_IO_QUEUE_MAX_FRAGMENT_SIZE;
				dataBuffer += TC_ENC_IO_QUEUE_MAX_FRAGMENT_SIZE;
				fragmentOffset.QuadPart += TC_ENC_IO_QUEUE_MAX_FRAGMENT_SIZE;
			}
		}
	}

	PsTerminateSystemThread (STATUS_SUCCESS);
}


NTSTATUS EncryptedIoQueueAddIrp (EncryptedIoQueue *queue, PIRP irp)
{
	NTSTATUS status;

	InterlockedIncrement (&queue->OutstandingIoCount);
	if (queue->StopPending)
	{
		Dump ("STATUS_DEVICE_NOT_READY  out=%d\n", queue->OutstandingIoCount);
		status = STATUS_DEVICE_NOT_READY;
		goto err;
	}

	if (queue->IsFilterDevice)
	{
		status = IoAcquireRemoveLock (&queue->RemoveLock, irp);
		if (!NT_SUCCESS (status))
			goto err;
	}

	//Dump ("Queue irp %p  out=%d\n", irp, queue->OutstandingIoCount);
	IoMarkIrpPending (irp);

	ExInterlockedInsertTailList (&queue->MainThreadQueue, &irp->Tail.Overlay.ListEntry, &queue->MainThreadQueueLock);
	KeSetEvent (&queue->MainThreadQueueNotEmptyEvent, IO_DISK_INCREMENT, FALSE);
	
	return STATUS_PENDING;

err:
	DecrementOutstandingIoCount (queue);
	return status;
}


NTSTATUS EncryptedIoQueueHoldWhenIdle (EncryptedIoQueue *queue, int64 timeout)
{
	NTSTATUS status;
	ASSERT (!queue->Suspended);

	queue->SuspendPending = TRUE;
	
	while (TRUE)
	{
		while (InterlockedExchangeAdd (&queue->OutstandingIoCount, 0) > 0)
		{
			LARGE_INTEGER waitTimeout;

			waitTimeout.QuadPart = timeout * -10000;
			status = KeWaitForSingleObject (&queue->NoOutstandingIoEvent, Executive, KernelMode, FALSE, timeout != 0 ? &waitTimeout : NULL);

			if (status == STATUS_TIMEOUT)
				status = STATUS_UNSUCCESSFUL;

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

		KeClearEvent (&queue->QueueResumedEvent);
		queue->Suspended = TRUE;

		if (InterlockedExchangeAdd (&queue->OutstandingIoCount, 0) == 0)
			break;

		queue->Suspended = FALSE;
		KeSetEvent (&queue->QueueResumedEvent, IO_DISK_INCREMENT, FALSE);

	}

	queue->SuspendPending = FALSE;
	//Dump ("Queue suspended  out=%d\n", queue->OutstandingIoCount);

	return STATUS_SUCCESS;
}


BOOL EncryptedIoQueueIsSuspended (EncryptedIoQueue *queue)
{
	return queue->Suspended;
}


BOOL EncryptedIoQueueIsRunning (EncryptedIoQueue *queue)
{
	return !queue->StopPending;
}


NTSTATUS EncryptedIoQueueResumeFromHold (EncryptedIoQueue *queue)
{
	ASSERT (queue->Suspended);
	
	queue->Suspended = FALSE;
	KeSetEvent (&queue->QueueResumedEvent, IO_DISK_INCREMENT, FALSE);

	//Dump ("Queue resumed  out=%d\n", queue->OutstandingIoCount);

	return STATUS_SUCCESS;
}


NTSTATUS EncryptedIoQueueStart (EncryptedIoQueue *queue, PEPROCESS process)
{
	NTSTATUS status;
	queue->ThreadExitRequested = FALSE;

	KeInitializeEvent (&queue->NoOutstandingIoEvent, SynchronizationEvent, FALSE);
	KeInitializeEvent (&queue->RequestCompletedEvent, SynchronizationEvent, FALSE);
	KeInitializeEvent (&queue->QueueResumedEvent, SynchronizationEvent, FALSE);

	queue->FragmentBufferA = TCalloc (TC_ENC_IO_QUEUE_MAX_FRAGMENT_SIZE);
	if (!queue->FragmentBufferA)
		goto noMemory;

	queue->FragmentBufferB = TCalloc (TC_ENC_IO_QUEUE_MAX_FRAGMENT_SIZE);
	if (!queue->FragmentBufferB)
		goto noMemory;

	KeInitializeEvent (&queue->FragmentBufferAFreeEvent, SynchronizationEvent, TRUE);
	KeInitializeEvent (&queue->FragmentBufferBFreeEvent, SynchronizationEvent, TRUE);

	// Main thread
	InitializeListHead (&queue->MainThreadQueue);
	KeInitializeSpinLock (&queue->MainThreadQueueLock);
	KeInitializeEvent (&queue->MainThreadQueueNotEmptyEvent, SynchronizationEvent, FALSE);

	status = TCStartThread (MainThreadProc, queue, &queue->MainThread);
	if (!NT_SUCCESS (status))
		goto err;

	// IO thread
	InitializeListHead (&queue->IoThreadQueue);
	KeInitializeSpinLock (&queue->IoThreadQueueLock);
	KeInitializeEvent (&queue->IoThreadQueueNotEmptyEvent, SynchronizationEvent, FALSE);

	status = TCStartThreadInProcess (IoThreadProc, queue, &queue->IoThread, process);
	if (!NT_SUCCESS (status))
	{
		queue->ThreadExitRequested = TRUE;
		TCStopThread (queue->MainThread, &queue->MainThreadQueueNotEmptyEvent);
		goto err;
	}

	// Completion thread
	InitializeListHead (&queue->CompletionThreadQueue);
	KeInitializeSpinLock (&queue->CompletionThreadQueueLock);
	KeInitializeEvent (&queue->CompletionThreadQueueNotEmptyEvent, SynchronizationEvent, FALSE);

	status = TCStartThread (CompletionThreadProc, queue, &queue->CompletionThread);
	if (!NT_SUCCESS (status))
	{
		queue->ThreadExitRequested = TRUE;
		TCStopThread (queue->MainThread, &queue->MainThreadQueueNotEmptyEvent);
		TCStopThread (queue->IoThread, &queue->IoThreadQueueNotEmptyEvent);
		goto err;
	}

	queue->StopPending = FALSE;
	Dump ("Queue started\n");
	return STATUS_SUCCESS;

noMemory:
	status = STATUS_INSUFFICIENT_RESOURCES;

err:
	if (queue->FragmentBufferA)
		TCfree (queue->FragmentBufferA);
	if (queue->FragmentBufferB)
		TCfree (queue->FragmentBufferB);

	return status;
}


NTSTATUS EncryptedIoQueueStop (EncryptedIoQueue *queue)
{
	ASSERT (!queue->StopPending);
	queue->StopPending = TRUE;
	
	while (InterlockedExchangeAdd (&queue->OutstandingIoCount, 0) > 0)
	{
		KeWaitForSingleObject (&queue->NoOutstandingIoEvent, Executive, KernelMode, FALSE, NULL);
	}

	Dump ("Queue stopping  out=%d\n", queue->OutstandingIoCount);

	queue->ThreadExitRequested = TRUE;

	TCStopThread (queue->MainThread, &queue->MainThreadQueueNotEmptyEvent);
	TCStopThread (queue->IoThread, &queue->IoThreadQueueNotEmptyEvent);
	TCStopThread (queue->CompletionThread, &queue->CompletionThreadQueueNotEmptyEvent);

	TCfree (queue->FragmentBufferA);
	TCfree (queue->FragmentBufferB);

	Dump ("Queue stopped  out=%d\n", queue->OutstandingIoCount);
	return STATUS_SUCCESS;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久久久图文区| 亚洲一级二级三级在线免费观看| 亚洲欧洲av在线| 日本视频中文字幕一区二区三区| 懂色av一区二区夜夜嗨| 91精品国产全国免费观看| 最新国产成人在线观看| 国精产品一区一区三区mba桃花| 欧美性受极品xxxx喷水| 国产精品妹子av| 国产裸体歌舞团一区二区| 91成人在线精品| 国产精品免费视频一区| 麻豆高清免费国产一区| 欧美写真视频网站| 国产精品国产成人国产三级| 国产麻豆日韩欧美久久| 欧美v国产在线一区二区三区| 午夜精品成人在线视频| 在线观看日韩精品| 亚洲少妇30p| 成人精品电影在线观看| 精品粉嫩aⅴ一区二区三区四区| 偷拍日韩校园综合在线| 欧美日韩视频在线观看一区二区三区| 亚洲图片激情小说| www.日韩大片| 国产精品蜜臀av| 成人app软件下载大全免费| 欧美激情综合在线| 懂色av一区二区三区免费看| 国产欧美日韩在线视频| 国产成人av电影在线| 国产精品色哟哟网站| av在线综合网| 亚洲伊人伊色伊影伊综合网| 欧美亚洲愉拍一区二区| 亚洲成av人片在线观看无码| 欧美高清www午色夜在线视频| 午夜久久福利影院| 日韩一级二级三级精品视频| 麻豆精品国产传媒mv男同| 日韩精品在线网站| 国产精品一区二区在线看| 欧美国产激情一区二区三区蜜月| 成人黄色av电影| 亚洲免费观看高清完整| 欧美日韩一区二区在线视频| 免费欧美在线视频| 久久久久久久一区| k8久久久一区二区三区| 亚洲va国产天堂va久久en| 欧美高清视频在线高清观看mv色露露十八| 日韩专区在线视频| 精品国产伦一区二区三区免费| 国产精品18久久久久久久网站| 中文字幕成人av| 在线观看一区不卡| 精一区二区三区| 中文字幕亚洲一区二区av在线| 欧美亚洲一区二区在线观看| 久久电影网站中文字幕| 亚洲视频一区二区在线观看| 欧美精品日韩一区| 国产91综合网| 亚洲国产精品天堂| 欧美v亚洲v综合ⅴ国产v| 91片在线免费观看| 久久疯狂做爰流白浆xx| 亚洲欧美日韩系列| 欧美精品一区二区蜜臀亚洲| 一本一道久久a久久精品综合蜜臀| 蜜桃91丨九色丨蝌蚪91桃色| 久久久国际精品| 欧美乱熟臀69xxxxxx| 大美女一区二区三区| 天堂一区二区在线| 中文字幕一区二区在线播放| 欧美一区二区三区电影| 99久久精品国产网站| 国内精品免费**视频| 一区二区理论电影在线观看| 国产欧美一区二区精品婷婷| 日韩视频中午一区| 欧美性受极品xxxx喷水| a美女胸又www黄视频久久| 麻豆精品视频在线| 一区二区三区欧美| 国产精品久久久久久久久久免费看 | 国产精品一区二区三区四区| 亚洲自拍与偷拍| 国产精品美女一区二区三区 | 在线观看日韩高清av| 国精产品一区一区三区mba视频| 亚洲一区在线观看网站| 亚洲女厕所小便bbb| 国产人成一区二区三区影院| 久久亚洲私人国产精品va媚药| 欧美日韩大陆一区二区| 欧美性xxxxx极品少妇| 色综合天天综合网天天看片| av在线这里只有精品| 成人理论电影网| 国产福利一区二区三区视频| 毛片av中文字幕一区二区| 午夜影院久久久| 亚洲成人av在线电影| 一区二区三区不卡视频| 亚洲女人小视频在线观看| 亚洲欧美另类综合偷拍| 综合婷婷亚洲小说| 国产精品嫩草99a| 国产精品欧美久久久久无广告 | 精品少妇一区二区三区在线视频| 6080午夜不卡| 日韩亚洲欧美成人一区| 91精品国产综合久久精品性色| 欧美日本韩国一区二区三区视频| 在线观看成人小视频| 欧美日韩一级黄| 91精品在线观看入口| 欧美第一区第二区| 26uuu国产日韩综合| 久久久www免费人成精品| 国产欧美1区2区3区| 亚洲欧美一区二区视频| 亚洲最大的成人av| 亚洲成人tv网| 久久国产精品第一页| 国产精品综合网| 95精品视频在线| 欧美性极品少妇| 欧美电影免费提供在线观看| 国产日韩欧美麻豆| 亚洲免费成人av| 日韩国产精品久久久久久亚洲| 蜜臀久久久久久久| 国产精品小仙女| 欧洲精品视频在线观看| 日韩午夜精品电影| 中文字幕中文字幕一区二区 | 欧美日韩一区三区四区| 欧美一区二区免费观在线| 精品国产一区二区三区不卡| 日本一区二区高清| 亚洲aaa精品| 国产盗摄一区二区| 欧美在线播放高清精品| 精品动漫一区二区三区在线观看| 亚洲欧美中日韩| 麻豆成人av在线| 91蜜桃免费观看视频| 日韩一区二区三区视频在线观看| 国产欧美日韩三级| 日韩国产在线观看一区| 成人免费不卡视频| 欧美一区二区三区性视频| 国产精品毛片久久久久久久| 日韩中文字幕不卡| 99re视频这里只有精品| 欧美v亚洲v综合ⅴ国产v| 亚洲激情图片小说视频| 国产一区二区三区四| 欧美精品乱码久久久久久按摩| 国产精品女同一区二区三区| 日韩中文欧美在线| 91视频com| 久久久精品一品道一区| 日韩国产一区二| 在线亚洲高清视频| 国产精品免费免费| 激情综合网激情| 欧美日本精品一区二区三区| 日韩码欧中文字| 国产白丝精品91爽爽久久| 精品久久久久99| 久久疯狂做爰流白浆xx| 7777精品伊人久久久大香线蕉完整版| 国产精品久久久久永久免费观看 | 欧美日韩一区三区| 亚洲欧美视频一区| 成人免费的视频| 欧美激情一区二区三区蜜桃视频 | 欧美日韩国产天堂| 亚洲欧美日韩国产综合| 不卡的av电影在线观看| 国产婷婷色一区二区三区| 蜜桃视频一区二区三区在线观看| 色综合中文综合网| 亚洲人妖av一区二区| 粉嫩在线一区二区三区视频| 久久亚洲一区二区三区明星换脸 | 亚洲国产成人一区二区三区| 国产在线精品不卡| wwwwxxxxx欧美| 美女视频网站久久| 91精品国产欧美日韩| 日本不卡的三区四区五区| 欧美一区二区三区视频| 日韩激情视频在线观看|