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

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

?? specialiofunction.cpp

?? 文件過濾系統
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
	ntStatus=ZwClose(TargetFileHandle);
	if (!NT_SUCCESS(ntStatus))
	{
		FsTPM_DbgPrint(("Close Target File Failed!"));
		ErrorString(ntStatus);
		return ntStatus;
	}
	return STATUS_SUCCESS;
}


NTSTATUS
FsTPMCopyFile(
				PFILE_OBJECT TargetFileObject, 
				PFILE_OBJECT SourceFileObject,
				PDEVICE_OBJECT pSourceDeviceObject,
				PDEVICE_OBJECT pTargetDeviceObject
				)
				//++
				// Function:	FsTPMCopyFile
				//
				// Description:
				//		Copy file 
				//
				// Arguments:
				//		TargetFileObject - Target file object 
				//		SourceFileObject - Source file object
				//
				// Return value:
				//		STATUS_SUCCESS if successful,
				//		STATUS_UNSUCCESSFUL otherwise
				//
				// Notice :
				//		This function is provided by OSR
				//--
{
	PVOID buffer;
	PMDL mdl;
	IO_STATUS_BLOCK iosb;
	FILE_STANDARD_INFORMATION standardInformation;
	LARGE_INTEGER currentOffset;
	LONGLONG bytesToTransfer;


	//
	// The algorithm used by this routine is straight-forward: read 64k chunks from the
	// source file and write it to the target file, until the entire file itself has been copied.
	//

	buffer = ExAllocatePoolWithTag(NonPagedPool,
		MAX_TRANSFER_SIZE,
		'BcfK');


	if (!buffer) {
		//
		// Allocation must have failed.
		//

		return STATUS_INSUFFICIENT_RESOURCES;

	}

	//
	// Build an MDL describing the buffer.  We'll use THAT to do the
	// I/O (rather than a direct buffer address.)
	//

	mdl = IoAllocateMdl(buffer, MAX_TRANSFER_SIZE, FALSE, TRUE, 0);

	MmBuildMdlForNonPagedPool(mdl);

	//
	// Set up the current offset information
	//

	currentOffset.QuadPart = 0;

	//
	// Get the size of the input file.
	//

	FsTPMGetFileStandardInformation(SourceFileObject, &standardInformation, &iosb,pSourceDeviceObject);

	if (!NT_SUCCESS(iosb.Status)) {
		//
		// This is a failure condition.
		//

		return (iosb.Status);

	}

	//
	// Set the allocation size of the output file.
	//

	FsTPMSetFileAllocation(TargetFileObject,
		&standardInformation.AllocationSize,
		&iosb,pTargetDeviceObject);

	if (!NT_SUCCESS(iosb.Status)) {

		//
		// Failure...
		//

		return (iosb.Status);

	}

	//
	// Save away the information about the # of bytes to transfer.
	//

	bytesToTransfer = standardInformation.EndOfFile.QuadPart;

	//
	// Now copy the source to the target until we run out...
	//

	while (bytesToTransfer) {
		ULONG nextTransferSize;

		//
		// The # of bytes to copy in the next operation is based upon the maximum of
		// the balance IN the file, or KFC_MAX_TRANSFER_SIZE
		//

		nextTransferSize = (bytesToTransfer < MAX_TRANSFER_SIZE) ?
			(ULONG) bytesToTransfer : MAX_TRANSFER_SIZE;

		FsTPMRead(SourceFileObject, &currentOffset, nextTransferSize, mdl, &iosb,pSourceDeviceObject);

		if (!NT_SUCCESS(iosb.Status)) {

			//
			// An error condition occurred.
			//

			return (iosb.Status);

		}

		FsTPMWrite(TargetFileObject, &currentOffset, nextTransferSize, mdl, &iosb,pTargetDeviceObject);

		if (!NT_SUCCESS(iosb.Status)) {

			//
			// An error condition occurred.
			//

			return (iosb.Status);

		}

		//
		// Now, update the offset/bytes to transfer information
		//

		currentOffset.QuadPart += nextTransferSize;

		bytesToTransfer -= nextTransferSize;

	}

	//
	// At this point, we're done with the copy operation.  Return success
	// 

	return (STATUS_SUCCESS);
}


// Notice  you should be sure that the file is shared.
NTSTATUS
FsTPMCreateFileObject(
						IN PWCHAR TargetFileName,
						OUT PFILE_OBJECT* ppFileObject
						)
{
	//WCHAR  *UTarget=NULL;
	//UTarget=(WCHAR*)ExAllocatePool(NonPagedPool,512);

	WCHAR UTarget[256];
	UNICODE_STRING CUTarget;
	PFILE_OBJECT pTargetFileObject=NULL; 
	HANDLE		 TargetFileHandle;
	FILE_OBJECT TargetFileObject;
	VCB				  TargetVCB;
	OBJECT_ATTRIBUTES TargetAttributes;

	ULONG ThrowInf; // We don't want to see the value of the returned informatiom
	// So throw it.
	NTSTATUS ntStatus;

	_snwprintf(UTarget,256,L"\\??\\%s",TargetFileName);
	RtlInitUnicodeString(&CUTarget,UTarget);
	CUTarget.MaximumLength=512;

	// We should make sure the path's name is like this : "C:\*\*.*"
	ASSERT( (TargetFileName[0]>=L'A' && TargetFileName[0]<=L'Z'));

	ntStatus=FsTPMCreateDirectory(TargetFileName);
	if (!NT_SUCCESS(ntStatus))
	{
		FsTPM_DbgPrint(("Create Directory Fail!\n"));
		ErrorString(ntStatus);
		return ntStatus;
	}

	FsTPM_DbgPrint(("Enter Create File Object now!!!\n"));

	// Build VCB. here , the next lower device and real device are the same
	TargetVCB=((PHOOK_EXTENSION)(DriveHookDevices[TargetFileName[0]-'A']->DeviceExtension))->Vcb;
	// Then we should initialize the file object's attributes
	InitializeObjectAttributes(
		&TargetAttributes,
		&CUTarget,
		OBJ_CASE_INSENSITIVE,
		NULL, NULL
		);

//	ntStatus=ZwCreateFile(&TargetFileHandle,
//				FILE_READ_DATA|SYNCHRONIZE|FILE_WRITE_DATA|DELETE,
//				&TargetAttributes,
//				&temp,
//				0,
//				FILE_ATTRIBUTE_NORMAL,
//				FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
//				FILE_OPEN_IF ,
//				FILE_SYNCHRONOUS_IO_ALERT,
//				NULL,
//				0
//				);
//				
	ntStatus=FsTPMCreateFile(&TargetVCB,
		FILE_READ_DATA|SYNCHRONIZE|FILE_WRITE_DATA|DELETE,
		&TargetAttributes,
		0,
		FILE_ATTRIBUTE_NORMAL,
		FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
		FILE_OPEN_IF ,
		FILE_SYNCHRONOUS_IO_ALERT,
		NULL,
		0,
		FILE_SYNCHRONOUS_IO_ALERT,
		&ThrowInf,
		&TargetFileObject,
		&TargetFileHandle
		);
	if (!NT_SUCCESS(ntStatus))
	{
		FsTPM_DbgPrint(("Create Target File Failed!"));
		ErrorString(ntStatus);
		return ntStatus;
	}
	ntStatus = ObReferenceObjectByHandle( TargetFileHandle, FILE_READ_DATA|FILE_WRITE_DATA, 
		NULL, KernelMode, (void**)&pTargetFileObject, NULL );
	if (!NT_SUCCESS(ntStatus))
	{
		FsTPM_DbgPrint((("Get Target File Object Fail\n")));
		ErrorString(ntStatus);
		return ntStatus;
	} 
	ASSERT(pTargetFileObject!=NULL);

	*ppFileObject=pTargetFileObject;

	return STATUS_SUCCESS;
}


VOID 
FsTPMWriteIRP(
			 PFILE_OBJECT FileObject,
			 PDEVICE_OBJECT   pDevice,
			 PIRP             pOrgIrp,
			 PIO_STACK_LOCATION pOrgIoStk,
			 PIO_STATUS_BLOCK IoStatusBlock,
			 PMDL mdl
			 )
			 //++
			 // Function:	FsTPMWriteIRP
			 //
			 // Description:
			 //		This routine is used to write to the file object from memory discribed by MDL
			 //
			 // Arguments:
			 //PFILE_OBJECT     FileObject,
			 //PDEVICE_OBJECT   pDevice,
			 //PIRP             pOrgIrp,
			 //PIO_STACK_LOCATION pOrgIoStk
			 //PIO_STATUS_BLOCK IoStatusBlock,
			 //
			 // Return value:
			 //		None
{
	PIRP irp;
	KEVENT event;
	PIO_STACK_LOCATION ioStackLocation;
	PDEVICE_OBJECT fsdDevice =pDevice;

	//
	// Set up the event we'll use.
	//

	KeInitializeEvent(&event, SynchronizationEvent, FALSE);


	//
	// Allocate and build the IRP we'll be sending to the FSD.
	//

	irp = IoAllocateIrp(fsdDevice->StackSize, FALSE);

	if (!irp) {

		//
		// Allocation failed, presumably due to memory allocation failure.
		//

		IoStatusBlock->Status = STATUS_INSUFFICIENT_RESOURCES;

		IoStatusBlock->Information = 0;
		
		return ;
	}

	irp->AssociatedIrp.SystemBuffer = pOrgIrp->AssociatedIrp.SystemBuffer;

	irp->MdlAddress = pOrgIrp->MdlAddress;

	irp->UserBuffer=pOrgIrp->UserBuffer;

	irp->UserEvent = &event;

	irp->UserIosb = IoStatusBlock;

	irp->Tail.Overlay.Thread = PsGetCurrentThread();

	irp->Tail.Overlay.OriginalFileObject= FileObject;

	irp->RequestorMode = KernelMode;


	//
	// Indicate that this is a WRITE operation.
	//

	irp->Flags = IRP_WRITE_OPERATION;


	//
	// Set up the next I/O stack location.  These are the parameters
	// that will be passed to the underlying driver.
	//

	ioStackLocation = IoGetNextIrpStackLocation(irp);

	ioStackLocation->MajorFunction = pOrgIoStk->MajorFunction;

	ioStackLocation->MinorFunction = pOrgIoStk->MinorFunction;

	ioStackLocation->DeviceObject = fsdDevice;

	ioStackLocation->FileObject = FileObject;


	//
	// We use a completion routine to keep the I/O Manager from doing
	// "cleanup" on our IRP - like freeing our MDL.
	//

	IoSetCompletionRoutine(irp, KfcIoCompletion, 0, TRUE, TRUE, TRUE);

	ioStackLocation->Parameters.Write.Length = pOrgIoStk->Parameters.Write.Length;

	ioStackLocation->Parameters.Write.ByteOffset = pOrgIoStk->Parameters.Write.ByteOffset;

	ioStackLocation->Parameters.Write.Key = pOrgIoStk->Parameters.Write.Key;


	//
	// Send it on.  Ignore the return code.
	//

	(void) IoCallDriver(fsdDevice, irp);


	//
	// Wait for the I/O to complete.
	//

	KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);


	//
	// Done.  Return results are in the io status block.
	//

	return;

}



NTSTATUS 
GetFileFullNameByQuery(	
					   OUT PUNICODE_STRING SourceFileName,
					   IN  PHOOK_EXTENSION pHookExt ,
					   IN	PFILE_OBJECT  FileObject
					   )
{
	VCB Vcb;
	ULONG ResultLen;
	NTSTATUS ntStatus;

	WCHAR   USName[256];

	_snwprintf(USName,256,L"A:");

	UNICODE_STRING CUSourceName;

	RtlInitUnicodeString(&CUSourceName,USName);
	CUSourceName.MaximumLength=512;

	Vcb=pHookExt->Vcb;

	PFILE_NAME_INFORMATION fileNameInfo;

	if (0==FileObject->FileName.Length)   // 我不知道為什么會有這樣的情況
		return STATUS_UNSUCCESSFUL;

	//調查"家底",確認其真實文件名
	fileNameInfo = (PFILE_NAME_INFORMATION)ExAllocatePool( NonPagedPool, MAXPATHLEN*sizeof(WCHAR));

	if (NULL==fileNameInfo)
	{
		FsTPM_DbgPrint((("Memory Allocate Fail!\n")));
		if (fileNameInfo!=NULL)
			ExFreePool(fileNameInfo);
		return STATUS_UNSUCCESSFUL;
	}
	ntStatus=FsTPMQueryInformationFile(&Vcb,FileObject,FileNameInformation,fileNameInfo,(MAXPATHLEN-5)*sizeof(WCHAR),&ResultLen);
	if (!NT_SUCCESS(ntStatus))
	{
		FsTPM_DbgPrint(((" Query Name Information of file Fail\n")));
		ErrorString(ntStatus);
		if (fileNameInfo!=NULL)
			ExFreePool(fileNameInfo);
		return ntStatus;
	}

	fileNameInfo->FileName[fileNameInfo->FileNameLength/2]=0;

	_snwprintf(CUSourceName.Buffer+wcslen(CUSourceName.Buffer),256-wcslen(CUSourceName.Buffer),L"%s",fileNameInfo->FileName);

	CUSourceName.Buffer[0]=(WCHAR)(pHookExt->LogicalDrive);

	CUSourceName.Length=wcslen(CUSourceName.Buffer)*sizeof(WCHAR);

	RtlCopyUnicodeString( SourceFileName, &(UNICODE_STRING)CUSourceName );

	if (fileNameInfo!=NULL)
		ExFreePool(fileNameInfo);

	return STATUS_SUCCESS;
}



VOID CreateFileSizeZero(PUNICODE_STRING pUniFile,BOOL isdir)
{
	// Then we should initialize the file object's attributes
	UNICODE_STRING uFile;
	FILE_OBJECT fileobject;
	HANDLE      fileHandle;
	ULONG       ThrowInf;

	ULONG op1;
	ULONG op2;
	NTSTATUS ntStatus;
	OBJECT_ATTRIBUTES FileAttrib;

	RtlInitUnicodeString(&uFile,&pUniFile->Buffer[2]);
	
	InitializeObjectAttributes(
		&FileAttrib,
		&uFile,
		OBJ_CASE_INSENSITIVE,
		NULL, NULL
		);

	if (isdir)
	{
		op1=FILE_SYNCHRONOUS_IO_NONALERT|FILE_NO_INTERMEDIATE_BUFFERING|FILE_DIRECTORY_FILE;
		op2=FILE_SYNCHRONOUS_IO_NONALERT|FILE_NO_INTERMEDIATE_BUFFERING|FILE_DIRECTORY_FILE;
	}
	else
	{
		op1=FILE_SYNCHRONOUS_IO_NONALERT|FILE_NO_INTERMEDIATE_BUFFERING;
		op2=FILE_SYNCHRONOUS_IO_NONALERT|FILE_NO_INTERMEDIATE_BUFFERING;
	}

	ntStatus=FsTPMCreateFile(&(((PHOOK_EXTENSION)(DriveHookDevices[pUniFile->Buffer[0]-L'A']->DeviceExtension))->Vcb),
		FILE_READ_DATA|SYNCHRONIZE|FILE_WRITE_DATA,
		&FileAttrib,
		0,
		FILE_ATTRIBUTE_NORMAL,
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		FILE_CREATE ,
		op1,
		NULL,
		0,
		op2,
		&ThrowInf,
		&fileobject,
		&fileHandle
		);

	ZwClose(fileHandle);
}


//----------------------------------------------------------------------
//
// FsTPMGetProcess
//
// Uses undocumented data structure offsets to obtain the name of the
// currently executing process.
//
//----------------------------------------------------------------------
PCHAR
FsTPMGetProcess( 
				  PCHAR ProcessName 
				  )
{
	PEPROCESS       curproc;
	char            *nameptr;
	//    ULONG           i;

	//
	// We only do this if we determined the process name offset
	//
	if( ProcessNameOffset ) {

		//
		// Get a pointer to the current process block
		//
		curproc = PsGetCurrentProcess();

		//
		// Dig into it to extract the name. Make sure to leave enough room
		// in the buffer for the appended process ID.
		//
		nameptr   = (PCHAR) curproc + ProcessNameOffset;

		strncpy( ProcessName, nameptr, NT_PROCNAMELEN-1 );
		ProcessName[NT_PROCNAMELEN-1] = 0;
		//       sprintf( ProcessName + strlen(ProcessName), ":%d", PsGetCurrentProcessId());

	} else {

		strcpy( ProcessName, "???" );
	}
	return ProcessName;
}

//----------------------------------------------------------------------
//
// FsTPMGetProcessNameOffset
//
// In an effort to remain version-independent, rather than using a
// hard-coded into the KPEB (Kernel Process Environment Block), we
// scan the KPEB looking for the name, which should match that
// of the system process. This is because we are in the system process'
// context in DriverEntry, where this is called.
//
//----------------------------------------------------------------------
ULONG 
FsTPMGetProcessNameOffset(
						  VOID
						  )
{
	PEPROCESS       curproc;
	int             i;

	curproc = PsGetCurrentProcess();

	//
	// Scan for 12KB, hoping the KPEB never grows that big!
	//
	for( i = 0; i < 3*PAGE_SIZE; i++ ) {

		if( !strncmp( SYSNAME, (PCHAR) curproc + i, strlen(SYSNAME) )) {

			return i;
		}
	}

	//
	// Name not found - oh, well
	//
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美国产wwwww| 亚洲综合一区二区精品导航| 最新中文字幕一区二区三区| 日韩av午夜在线观看| 成人性生交大片免费看视频在线| 欧美精品久久99久久在免费线| 亚洲国产激情av| 另类小说欧美激情| 欧美性一级生活| 成人免费在线视频观看| 国产麻豆一精品一av一免费 | 亚洲制服欧美中文字幕中文字幕| 国产剧情一区二区三区| 欧美丰满少妇xxxxx高潮对白| 亚洲欧洲av色图| 国产不卡视频在线观看| 精品黑人一区二区三区久久| 香蕉成人伊视频在线观看| 色一情一乱一乱一91av| 国产精品久久三区| 国产风韵犹存在线视精品| 精品美女一区二区| 麻豆高清免费国产一区| 欧美高清视频一二三区| 天使萌一区二区三区免费观看| 色狠狠色噜噜噜综合网| 亚洲精品久久嫩草网站秘色| 99在线精品观看| 国产精品美女久久久久高潮| 国产不卡高清在线观看视频| 国产女同性恋一区二区| 不卡一区二区中文字幕| 中文字幕在线视频一区| 成人免费视频免费观看| 国产精品不卡在线观看| 91亚洲精华国产精华精华液| 亚洲三级电影全部在线观看高清| www.欧美色图| 亚洲欧美日本在线| 在线亚洲+欧美+日本专区| 亚洲综合精品自拍| 欧美视频一区二区在线观看| 香蕉成人伊视频在线观看| 欧美一区二区三区免费大片| 美女在线一区二区| 国产亚洲精品福利| 99久久综合99久久综合网站| 一区二区三区国产精品| 欧美日韩五月天| 麻豆国产精品官网| 国产精品丝袜一区| 色乱码一区二区三区88| 天天做天天摸天天爽国产一区| 欧美日韩精品系列| 国产一区在线观看视频| 欧美激情在线免费观看| 色国产综合视频| 蜜芽一区二区三区| 欧美激情中文字幕| 欧美羞羞免费网站| 国产露脸91国语对白| 亚洲美腿欧美偷拍| 精品欧美一区二区三区精品久久 | 久久综合国产精品| 色香色香欲天天天影视综合网| 亚洲成人资源在线| 国产日韩精品一区二区三区| 色av综合在线| 国产很黄免费观看久久| 亚洲成av人片一区二区三区| 亚洲精品一区二区三区四区高清 | 欧美人狂配大交3d怪物一区| 久久精品国产一区二区| 国产精品成人免费在线| 欧美va亚洲va在线观看蝴蝶网| 成+人+亚洲+综合天堂| 青椒成人免费视频| 亚洲精品一二三区| 国产婷婷一区二区| 欧美久久高跟鞋激| 99久久精品国产观看| 青草国产精品久久久久久| 亚洲精品成人天堂一二三| 国产视频911| 欧美一级黄色大片| 色哟哟一区二区三区| 国产乱码精品1区2区3区| 天天综合色天天综合| 亚洲视频一区在线| 国产欧美日韩在线| 欧美videos大乳护士334| 欧美色网一区二区| 成人av在线资源| 国产资源在线一区| 奇米色777欧美一区二区| 亚洲精品视频一区| 成人免费小视频| 中文字幕+乱码+中文字幕一区| 欧美电影免费观看高清完整版在线| 色吊一区二区三区| 色一情一乱一乱一91av| 成人avav影音| av在线不卡电影| 国产激情一区二区三区| 国内外精品视频| 韩国成人精品a∨在线观看| 免费人成精品欧美精品| 日本欧美韩国一区三区| 亚洲va欧美va天堂v国产综合| 夜夜精品视频一区二区| 亚洲精品免费视频| 亚洲精选视频免费看| 亚洲卡通动漫在线| 亚洲一区二区三区视频在线| 樱桃视频在线观看一区| 一区二区三区在线免费| 伊人婷婷欧美激情| 一二三四区精品视频| 亚洲第一久久影院| 图片区小说区区亚洲影院| 日本亚洲电影天堂| 久久精品99国产精品日本| 美女尤物国产一区| 国产精品资源在线观看| 国产成人精品影视| 91网站在线观看视频| 在线观看免费亚洲| 欧美精品久久久久久久多人混战| 欧美一激情一区二区三区| 精品国产伦一区二区三区观看方式| 精品久久久久久无| 国产日产欧产精品推荐色| 日韩一区日韩二区| 同产精品九九九| 久久精品国产77777蜜臀| 国产精品88888| 91美女片黄在线观看91美女| 欧美体内she精高潮| 日韩欧美亚洲国产另类| 久久精品夜色噜噜亚洲aⅴ| 最新日韩av在线| 天天色综合成人网| 国产精品一区二区三区99| 91亚洲精品久久久蜜桃网站| 9191精品国产综合久久久久久 | 精品一区二区三区免费播放| 高清av一区二区| 精品视频一区 二区 三区| 日韩一级欧美一级| 国产精品久久久久影院老司| 香港成人在线视频| 成人美女在线观看| 欧美性xxxxxx少妇| 精品电影一区二区| 亚洲精品中文字幕在线观看| 久久精品噜噜噜成人88aⅴ | 国产一区激情在线| 91美女精品福利| 精品久久久久99| 亚洲卡通动漫在线| 国产一区二区三区视频在线播放| 一本色道久久综合亚洲aⅴ蜜桃| 中文文精品字幕一区二区| 性久久久久久久| 91免费版pro下载短视频| 日韩精品一区二区三区四区视频| 亚洲女子a中天字幕| 极品少妇一区二区| 欧美老肥妇做.爰bbww视频| 中文字幕精品一区二区精品绿巨人 | 粉嫩欧美一区二区三区高清影视| 欧美影院一区二区| 中文字幕欧美三区| 亚洲影院理伦片| av不卡一区二区三区| 久久精品亚洲一区二区三区浴池| 亚洲成av人**亚洲成av**| 91丨porny丨在线| 国产日韩欧美不卡| 久久99热国产| 69久久99精品久久久久婷婷| 亚洲色图视频网站| 成人午夜在线视频| 久久久久亚洲蜜桃| 精品在线播放午夜| 欧美一区二区福利视频| 亚洲不卡一区二区三区| 欧美在线观看一区二区| 亚洲女同女同女同女同女同69| 国产一区二区毛片| 久久久精品免费免费| 国产一区二区在线电影| 久久一区二区三区四区| 精品无人码麻豆乱码1区2区| 欧美一区二区三区视频在线观看| 亚洲国产wwwccc36天堂| 欧美在线观看视频一区二区三区| 亚洲欧洲www| 91黄色激情网站| 午夜一区二区三区视频|