⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fastio.c

📁 FSD file system driver
💻 C
📖 第 1 页 / 共 2 页
字号:
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}

			Vcb = (PFFS_VCB)DeviceObject->DeviceExtension;

			ASSERT(Vcb != NULL);

			Fcb = (PFFS_FCB)FileObject->FsContext;

			ASSERT(Fcb != NULL);

			if (Fcb->Identifier.Type == FFSVCB)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}

			ASSERT((Fcb->Identifier.Type == FFSFCB) &&
					(Fcb->Identifier.Size == sizeof(FFS_FCB)));

			FFSPrint((DBG_INFO, 
						"%-16.16s %-31s %s\n",
						PsGetCurrentProcess()->ImageFileName,
						"FASTIO_QUERY_NETWORK_OPEN_INFO",
						Fcb->AnsiFileName.Buffer));

			FsRtlEnterFileSystem();

			if (!ExAcquireResourceSharedLite(
						&Fcb->MainResource,
						Wait))
			{
				Status = FALSE;
				__leave;
			}

			FcbMainResourceAcquired = TRUE;

			RtlZeroMemory(Buffer, sizeof(FILE_NETWORK_OPEN_INFORMATION));

			/*
			typedef struct _FILE_NETWORK_OPEN_INFORMATION {
				LARGE_INTEGER   CreationTime;
				LARGE_INTEGER   LastAccessTime;
				LARGE_INTEGER   LastWriteTime;
				LARGE_INTEGER   ChangeTime;
				LARGE_INTEGER   AllocationSize;
				LARGE_INTEGER   EndOfFile;
				ULONG           FileAttributes;
			} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
			*/

			if (FS_VERSION == 1)
			{
				Buffer->CreationTime = FFSSysTime(Fcb->dinode1->di_ctime);
				Buffer->LastAccessTime = FFSSysTime(Fcb->dinode1->di_atime);
				Buffer->LastWriteTime = FFSSysTime(Fcb->dinode1->di_mtime);
				Buffer->ChangeTime = FFSSysTime(Fcb->dinode1->di_mtime);
				Buffer->FileAttributes = Fcb->FFSMcb->FileAttr;
				Buffer->AllocationSize.QuadPart =
					(LONGLONG)(Fcb->dinode1->di_size);
				Buffer->EndOfFile.QuadPart =
					(LONGLONG)(Fcb->dinode1->di_size);
			}
			else
			{
				Buffer->CreationTime = FFSSysTime((ULONG)Fcb->dinode2->di_ctime);
				Buffer->LastAccessTime = FFSSysTime((ULONG)Fcb->dinode2->di_atime);
				Buffer->LastWriteTime = FFSSysTime((ULONG)Fcb->dinode2->di_mtime);
				Buffer->ChangeTime = FFSSysTime((ULONG)Fcb->dinode2->di_mtime);
				Buffer->FileAttributes = Fcb->FFSMcb->FileAttr;
				Buffer->AllocationSize.QuadPart =
					(LONGLONG)(Fcb->dinode2->di_size);
				Buffer->EndOfFile.QuadPart =
					(LONGLONG)(Fcb->dinode2->di_size);
			}

			Buffer->FileAttributes = Fcb->FFSMcb->FileAttr;

			IoStatus->Information = sizeof(FILE_NETWORK_OPEN_INFORMATION);

			IoStatus->Status = STATUS_SUCCESS;

			Status = TRUE;
		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			IoStatus->Status = GetExceptionCode();
			Status = TRUE;
		}
	}
	__finally
	{
		if (FcbMainResourceAcquired)
		{
			ExReleaseResourceForThreadLite(
					&Fcb->MainResource,
					ExGetCurrentResourceThread()
					);
		}

		FsRtlExitFileSystem();
	}



	if (Status == FALSE)
	{
		FFSPrint((DBG_ERROR,
					"%s %s *** Status: FALSE ***\n",
					PsGetCurrentProcess()->ImageFileName,
					"FASTIO_QUERY_NETWORK_OPEN_INFO"));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		FFSPrint((DBG_ERROR,
					"%s %s *** Status: %s (%#x) ***\n",
					PsGetCurrentProcess()->ImageFileName,
					"FASTIO_QUERY_NETWORK_OPEN_INFO",
					FFSNtStatusToString(IoStatus->Status),
					IoStatus->Status));
	}

	return Status;
}


BOOLEAN
FFSFastIoLock(
	IN PFILE_OBJECT         FileObject,
	IN PLARGE_INTEGER       FileOffset,
	IN PLARGE_INTEGER       Length,
	IN PEPROCESS            Process,
	IN ULONG                Key,
	IN BOOLEAN              FailImmediately,
	IN BOOLEAN              ExclusiveLock,
	OUT PIO_STATUS_BLOCK    IoStatus,
	IN PDEVICE_OBJECT       DeviceObject)
{
	BOOLEAN     Status = FALSE;
	PFFS_FCB    Fcb;

	__try
	{
		__try
		{
			if (DeviceObject == FFSGlobal->DeviceObject)
			{
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}

			Fcb = (PFFS_FCB)FileObject->FsContext;

			ASSERT(Fcb != NULL);

			if (Fcb->Identifier.Type == FFSVCB)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}

			ASSERT((Fcb->Identifier.Type == FFSFCB) &&
					(Fcb->Identifier.Size == sizeof(FFS_FCB)));

			if (IsDirectory(Fcb))
			{
				FFSBreakPoint();
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}

			FFSPrint((DBG_INFO,
						"FFSFastIoLock: %s %s %s\n",
						FFSGetCurrentProcessName(),
						"FASTIO_LOCK",
						Fcb->AnsiFileName.Buffer));

			FFSPrint((DBG_INFO,
						"FFSFastIoLock: Offset: %I64xh Length: %I64xh Key: %u %s%s\n",
						FileOffset->QuadPart,
						Length->QuadPart,
						Key,
						(FailImmediately ? "FailImmediately " : ""),
						(ExclusiveLock ? "ExclusiveLock " : "")));

			if (Fcb->Header.IsFastIoPossible != FastIoIsQuestionable)
			{
				FFSPrint((DBG_INFO,
							"FFSFastIoLock: %s %s %s\n",
							(PUCHAR) Process + ProcessNameOffset,
							"FastIoIsQuestionable",
							Fcb->AnsiFileName.Buffer));

				Fcb->Header.IsFastIoPossible = FastIoIsQuestionable;
			}

			FsRtlEnterFileSystem();

			Status = FsRtlFastLock(
						&Fcb->FileLockAnchor,
						FileObject,
						FileOffset,
						Length,
						Process,
						Key,
						FailImmediately,
						ExclusiveLock,
						IoStatus,
						NULL,
						FALSE);
		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			IoStatus->Status = GetExceptionCode();
			Status = TRUE;
		}
	}

	__finally
	{
		FsRtlExitFileSystem();
	}

#if DBG 
	if (Status == FALSE)
	{
		FFSPrint((DBG_ERROR, 
					"FFSFastIoLock: %s %s *** Status: FALSE ***\n",
					(PUCHAR) Process + ProcessNameOffset,
					"FASTIO_LOCK"));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		FFSPrint((DBG_ERROR,
					"FFSFastIoLock: %s %s *** Status: %s (%#x) ***\n",
					(PUCHAR) Process + ProcessNameOffset,
					"FASTIO_LOCK",
					FFSNtStatusToString(IoStatus->Status),
					IoStatus->Status));
	}
#endif

	return Status;
}


BOOLEAN
FFSFastIoUnlockSingle(
	IN PFILE_OBJECT         FileObject,
	IN PLARGE_INTEGER       FileOffset,
	IN PLARGE_INTEGER       Length,
	IN PEPROCESS            Process,
	IN ULONG                Key,
	OUT PIO_STATUS_BLOCK    IoStatus,
	IN PDEVICE_OBJECT       DeviceObject)
{
	BOOLEAN     Status = FALSE;
	PFFS_FCB    Fcb;

	__try
	{
		__try
		{
			if (DeviceObject == FFSGlobal->DeviceObject)
			{
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}

			Fcb = (PFFS_FCB)FileObject->FsContext;

			ASSERT(Fcb != NULL);

			if (Fcb->Identifier.Type == FFSVCB)
			{
				FFSBreakPoint();
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}

			ASSERT((Fcb->Identifier.Type == FFSFCB) &&
					(Fcb->Identifier.Size == sizeof(FFS_FCB)));

			if (IsDirectory(Fcb))
			{
				FFSBreakPoint();
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}

			FFSPrint((DBG_INFO,
						"FFSFastIoUnlockSingle: %s %s %s\n",
						(PUCHAR) Process + ProcessNameOffset,
						"FASTIO_UNLOCK_SINGLE",
						Fcb->AnsiFileName.Buffer));

			FFSPrint((DBG_INFO,
						"FFSFastIoUnlockSingle: Offset: %I64xh Length: %I64xh Key: %u\n",
						FileOffset->QuadPart,
						Length->QuadPart,
						Key));

			FsRtlEnterFileSystem();

			IoStatus->Status = FsRtlFastUnlockSingle(
									&Fcb->FileLockAnchor,
									FileObject,
									FileOffset,
									Length,
									Process,
									Key,
									NULL,
									FALSE);                      

			IoStatus->Information = 0;

			Status =  TRUE;
		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			IoStatus->Status = GetExceptionCode();
			Status = TRUE;
		}
	}
	__finally
	{
		FsRtlExitFileSystem();
	}

#if DBG 
	if (Status == FALSE)
	{
		FFSPrint((DBG_ERROR,
					"FFSFastIoUnlockSingle: %s %s *** Status: FALSE ***\n",
					(PUCHAR) Process + ProcessNameOffset,
					"FASTIO_UNLOCK_SINGLE"));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		FFSPrint((DBG_ERROR,
					"FFSFastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n",
					(PUCHAR) Process + ProcessNameOffset,
					"FASTIO_UNLOCK_SINGLE",
					FFSNtStatusToString(IoStatus->Status),
					IoStatus->Status));
	}
#endif  
	return Status;
}


BOOLEAN
FFSFastIoUnlockAll(
	IN PFILE_OBJECT         FileObject,
	IN PEPROCESS            Process,
	OUT PIO_STATUS_BLOCK    IoStatus,
	IN PDEVICE_OBJECT       DeviceObject)
{
	BOOLEAN     Status = FALSE;
	PFFS_FCB    Fcb;

	__try
	{
		__try
		{
			if (DeviceObject == FFSGlobal->DeviceObject)
			{
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}

			Fcb = (PFFS_FCB)FileObject->FsContext;

			ASSERT(Fcb != NULL);

			if (Fcb->Identifier.Type == FFSVCB)
			{
				FFSBreakPoint();
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}

			ASSERT((Fcb->Identifier.Type == FFSFCB) &&
					(Fcb->Identifier.Size == sizeof(FFS_FCB)));

			if (IsDirectory(Fcb))
			{
				FFSBreakPoint();
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}

			FFSPrint((DBG_INFO,
						"FFSFastIoUnlockSingle: %s %s %s\n",
						(PUCHAR) Process + ProcessNameOffset,
						"FASTIO_UNLOCK_ALL",
						Fcb->AnsiFileName.Buffer));

			FsRtlEnterFileSystem();

			IoStatus->Status = FsRtlFastUnlockAll(
									&Fcb->FileLockAnchor,
									FileObject,
									Process,
									NULL);

			IoStatus->Information = 0;

			Status = TRUE;
		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			IoStatus->Status = GetExceptionCode();
			Status = TRUE;
		}
	}
	__finally
	{
		FsRtlExitFileSystem();
	}

#if DBG 
	if (Status == FALSE)
	{
		FFSPrint((DBG_ERROR,
					"FFSFastIoUnlockSingle: %s %s *** Status: FALSE ***\n",
					(PUCHAR) Process + ProcessNameOffset,
					"FASTIO_UNLOCK_ALL"));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		FFSPrint((DBG_ERROR,
					"FFSFastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n",
					(PUCHAR) Process + ProcessNameOffset,
					"FASTIO_UNLOCK_ALL",
					FFSNtStatusToString(IoStatus->Status),
					IoStatus->Status));
	}
#endif  
	return Status;
}


BOOLEAN
FFSFastIoUnlockAllByKey(
	IN PFILE_OBJECT         FileObject,
	IN PEPROCESS            Process,
	IN ULONG                Key,
	OUT PIO_STATUS_BLOCK    IoStatus,
	IN PDEVICE_OBJECT       DeviceObject)
{
	BOOLEAN     Status = FALSE;
	PFFS_FCB    Fcb;

	__try
	{
		__try
		{
			if (DeviceObject == FFSGlobal->DeviceObject)
			{
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}

			Fcb = (PFFS_FCB)FileObject->FsContext;

			ASSERT(Fcb != NULL);

			if (Fcb->Identifier.Type == FFSVCB)
			{
				FFSBreakPoint();
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}

			ASSERT((Fcb->Identifier.Type == FFSFCB) &&
					(Fcb->Identifier.Size == sizeof(FFS_FCB)));

			if (IsDirectory(Fcb))
			{
				FFSBreakPoint();
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}

			FFSPrint((DBG_INFO,
						"FFSFastIoUnlockAllByKey: %s %s %s\n",
						(PUCHAR) Process + ProcessNameOffset,
						"FASTIO_UNLOCK_ALL_BY_KEY",
						Fcb->AnsiFileName.Buffer));

			FFSPrint((DBG_INFO,
						"FFSFastIoUnlockAllByKey: Key: %u\n",
						Key));

			FsRtlEnterFileSystem();

			IoStatus->Status = FsRtlFastUnlockAllByKey(
									&Fcb->FileLockAnchor,
									FileObject,
									Process,
									Key,
									NULL);  

			IoStatus->Information = 0;

			Status =  TRUE;
		}

		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			IoStatus->Status = GetExceptionCode();
			Status = TRUE;
		}
	}

	__finally
	{
		FsRtlExitFileSystem();
	}
#if DBG 
	if (Status == FALSE)
	{
		FFSPrint((DBG_ERROR,
					"FFSFastIoUnlockAllByKey: %s %s *** Status: FALSE ***\n",
					(PUCHAR) Process + ProcessNameOffset,
					"FASTIO_UNLOCK_ALL_BY_KEY"));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		FFSPrint((DBG_ERROR,
					"FFSFastIoUnlockAllByKey: %s %s *** Status: %s (%#x) ***\n",
					(PUCHAR) Process + ProcessNameOffset,
					"FASTIO_UNLOCK_ALL_BY_KEY",
					FFSNtStatusToString(IoStatus->Status),
					IoStatus->Status));
	}
#endif  
	return Status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -