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

📄 ext2fs.c

📁 ext2 file system driver for win nt
💻 C
📖 第 1 页 / 共 5 页
字号:
		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			IoStatus->Status = GetExceptionCode();
			Status = TRUE;
		}
	}

	__finally
	{
		if (FcbMainResourceAcquired)
		{
			ExReleaseResourceForThreadLite(
				&Fcb->MainResource,
				ExGetCurrentResourceThread()
				);
		}
		
		FsRtlExitFileSystem();
	}
	
	
	
	if (Status == FALSE)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: FALSE ***\n",
			PsGetCurrentProcess()->ImageFileName,
			"FASTIO_QUERY_BASIC_INFO"
			));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: %s (%#x) ***\n",
			PsGetCurrentProcess()->ImageFileName,
			"FASTIO_QUERY_BASIC_INFO",
			Ext2NtStatusToString(IoStatus->Status),
			IoStatus->Status
			));
	}
	
	return Status;

// Matt Wu 2001-09-29
/*	
	if (DeviceObject == Ext2Global->DeviceObject)
	{
		return FALSE;
	}
	
	Fcb = (PEXT2_FCB) FileObject->FsContext;
	
	ASSERT(Fcb != NULL);
	
	if (Fcb->Identifier.Type == VCB)
	{
		return FALSE;
	}
	
	ASSERT((Fcb->Identifier.Type == FCB) &&
		(Fcb->Identifier.Size == sizeof(EXT2_FCB)));

	FsRtlEnterFileSystem();
	
	if (!ExAcquireResourceSharedLite(
		&Fcb->MainResource,Wait ))
	{
		FsRtlExitFileSystem();
		return FALSE;
	}
	
	RtlZeroMemory(Buffer, sizeof(FILE_BASIC_INFORMATION));
	
	Buffer->CreationTime = Ext2SysTime(Fcb->ext2_inode->i_ctime + TIMEZONE);
	Buffer->LastAccessTime = Ext2SysTime(Fcb->ext2_inode->i_atime + TIMEZONE);
	Buffer->LastWriteTime = Ext2SysTime(Fcb->ext2_inode->i_mtime + TIMEZONE);
	Buffer->ChangeTime = Ext2SysTime(Fcb->ext2_inode->i_mtime + TIMEZONE);
	Buffer->FileAttributes = Fcb->FileAttributes;
	
	IoStatus->Information = sizeof(FILE_BASIC_INFORMATION);
	
	IoStatus->Status = STATUS_SUCCESS;
	
	ExReleaseResourceForThreadLite(
		&Fcb->MainResource,
		ExGetCurrentResourceThread());
	
	FsRtlExitFileSystem();
	
	return TRUE;
*/

}

BOOLEAN
Ext2FastIoQueryStandardInfo (
			    IN PFILE_OBJECT                 FileObject,
			    IN BOOLEAN                      Wait,
			    OUT PFILE_STANDARD_INFORMATION  Buffer,
			    OUT PIO_STATUS_BLOCK            IoStatus,
			    IN PDEVICE_OBJECT               DeviceObject
			    )
{
	
	BOOLEAN     Status = FALSE;
	PEXT2_FCB   Fcb;
	BOOLEAN     FcbMainResourceAcquired = FALSE;
	
	PAGED_CODE();
	
	__try
		
		
	{
		__try
		{
			if (DeviceObject == Ext2Global->DeviceObject)
			{
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}
			
			Fcb = (PEXT2_FCB) FileObject->FsContext;
			
			ASSERT(Fcb != NULL);
			
			if (Fcb->Identifier.Type == VCB)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}
			
			ASSERT((Fcb->Identifier.Type == FCB) &&
				(Fcb->Identifier.Size == sizeof(EXT2_FCB)));
#if DBG			
			KdPrint((
				DRIVER_NAME ": %-16.16s %-31s %s\n",
				PsGetCurrentProcess()->ImageFileName,
				"FASTIO_QUERY_STANDARD_INFO",
				Fcb->DbgFileName ));
#endif			
			FsRtlEnterFileSystem();
			
			if (!ExAcquireResourceSharedLite(
				&Fcb->MainResource,
				Wait		))
			{
				Status = FALSE;
				__leave;
			}
			
			FcbMainResourceAcquired = TRUE;
			
			RtlZeroMemory(Buffer, sizeof(FILE_STANDARD_INFORMATION));
			
			/*
			typedef struct _FILE_STANDARD_INFORMATION {
			LARGE_INTEGER   AllocationSize;
			LARGE_INTEGER   EndOfFile;
			ULONG           NumberOfLinks;
			BOOLEAN         DeletePending;
			BOOLEAN         Directory;
			} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
			*/
			
			Buffer->AllocationSize.QuadPart =
				Fcb->ext2_inode->i_size;
			Buffer->EndOfFile.QuadPart =
				Fcb->ext2_inode->i_size;			
			Buffer->NumberOfLinks = Fcb->ext2_inode->i_links_count;
			
#ifndef EXT2_RO
			Buffer->DeletePending = Fcb->DeletePending;
#else
			Buffer->DeletePending = FALSE;
#endif
			
			if (Fcb->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				Buffer->Directory = TRUE;
			}
			else
			{
				Buffer->Directory = FALSE;
			}
			
			IoStatus->Information = sizeof(FILE_STANDARD_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)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: FALSE ***\n",
			PsGetCurrentProcess()->ImageFileName,
			"FASTIO_QUERY_STANDARD_INFO"
			));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: %s (%#x) ***\n",
			PsGetCurrentProcess()->ImageFileName,
			"FASTIO_QUERY_STANDARD_INFO",
			Ext2NtStatusToString(IoStatus->Status),
			IoStatus->Status
			));
	}
	
	return Status;
}

BOOLEAN
Ext2FastIoLock (
	       IN PFILE_OBJECT         FileObject,
	       IN PLARGE_INTEGER       FileOffset,
	       IN PLARGE_INTEGER       Length,
	       IN PEPROCESS            ProcessId,
	       IN ULONG                Key,
	       IN BOOLEAN              FailImmediately,
	       IN BOOLEAN              ExclusiveLock,
	       OUT PIO_STATUS_BLOCK    IoStatus,
	       IN PDEVICE_OBJECT       DeviceObject
	       )
{
	BOOLEAN     Status = FALSE;
	PEXT2_FCB   Fcb;
	
	PAGED_CODE();
	
	__try
	{
		__try
		{
			if (DeviceObject == Ext2Global->DeviceObject)
			{
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}
			
			Fcb = (PEXT2_FCB) FileObject->FsContext;
			
			ASSERT(Fcb != NULL);
			
			if (Fcb->Identifier.Type == VCB)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}
			
			ASSERT((Fcb->Identifier.Type == FCB) &&
				(Fcb->Identifier.Size == sizeof(EXT2_FCB)));
			
			if (Fcb->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}
#if DBG			
			KdPrint((
				DRIVER_NAME ": %-16.16s %-31s %s\n",
				ProcessId->ImageFileName,
				"FASTIO_LOCK",
				Fcb->DbgFileName		));
#endif			
			KdPrint((
				DRIVER_NAME ": Offset: %I64u Length: %I64u Key: %u %s%s\n",
				FileOffset->QuadPart,
				Length->QuadPart,
				Key,
				(FailImmediately ? "FailImmediately " : ""),
				(ExclusiveLock ? "ExclusiveLock " : "")	));
			
			if (Fcb->CommonFCBHeader.IsFastIoPossible != FastIoIsQuestionable)
			{
#if DBG
				KdPrint((
					DRIVER_NAME ": %-16.16s %-31s %s\n",
					ProcessId->ImageFileName,
					"FastIoIsQuestionable",
					Fcb->DbgFileName		));
#endif				
				Fcb->CommonFCBHeader.IsFastIoPossible = FastIoIsQuestionable;
			}
			
			FsRtlEnterFileSystem();
			
			Status = FsRtlPrivateLock(
				&Fcb->FileLockAnchor,
				FileObject,
				FileOffset,
				Length,
				ProcessId,
				Key,
				FailImmediately,
				ExclusiveLock,
				IoStatus,
				NULL,
				NULL,
				NULL);
		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			IoStatus->Status = GetExceptionCode();
			Status = TRUE;
		}
	}

	__finally
	{
		FsRtlExitFileSystem();
	}
	
	if (Status == FALSE)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: FALSE ***\n",
			ProcessId->ImageFileName,
			"FASTIO_LOCK"
			));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: %s (%#x) ***\n",
			ProcessId->ImageFileName,
			"FASTIO_LOCK",
			Ext2NtStatusToString(IoStatus->Status),
			IoStatus->Status
			));
	}
	
	return Status;
}

BOOLEAN
Ext2FastIoUnlockSingle (
		       IN PFILE_OBJECT         FileObject,
		       IN PLARGE_INTEGER       FileOffset,
		       IN PLARGE_INTEGER       Length,
		       IN PEPROCESS            ProcessId,
		       IN ULONG                Key,
		       OUT PIO_STATUS_BLOCK    IoStatus,
		       IN PDEVICE_OBJECT       DeviceObject
		       )
{
	BOOLEAN     Status = FALSE;
	PEXT2_FCB   Fcb;
	
	PAGED_CODE();
	
	__try
	{
		__try
		{
			if (DeviceObject == Ext2Global->DeviceObject)
			{
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}
			
			Fcb = (PEXT2_FCB) FileObject->FsContext;
			
			ASSERT(Fcb != NULL);
			
			if (Fcb->Identifier.Type == VCB)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}
			
			ASSERT((Fcb->Identifier.Type == FCB) &&
				(Fcb->Identifier.Size == sizeof(EXT2_FCB)));
			
			if (Fcb->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}
#if DBG			
			KdPrint((
				DRIVER_NAME ": %-16.16s %-31s %s\n",
				ProcessId->ImageFileName,
				"FASTIO_UNLOCK_SINGLE",
				Fcb->DbgFileName		));
#endif			
			KdPrint((
				DRIVER_NAME ": Offset: %I64u Length: %I64u Key: %u\n",
				FileOffset->QuadPart,
				Length->QuadPart,
				Key		));
			
			FsRtlEnterFileSystem();
			
			IoStatus->Status = FsRtlFastUnlockSingle(
				&Fcb->FileLockAnchor,
				FileObject,
				FileOffset,
				Length,
				ProcessId,
				Key,
				NULL,
				NULL);                      
			
			IoStatus->Information = 0;
			
			Status =  TRUE;
		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			IoStatus->Status = GetExceptionCode();
			Status = TRUE;
		}
	}
	__finally
	{
		FsRtlExitFileSystem();
	}
	
	if (Status == FALSE)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: FALSE ***\n",
			ProcessId->ImageFileName,
			"FASTIO_UNLOCK_SINGLE"
			));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: %s (%#x) ***\n",
			ProcessId->ImageFileName,
			"FASTIO_UNLOCK_SINGLE",
			Ext2NtStatusToString(IoStatus->Status),
			IoStatus->Status
			));
	}
	
	return Status;
}

BOOLEAN
Ext2FastIoUnlockAll (
		    IN PFILE_OBJECT         FileObject,
		    IN PEPROCESS            ProcessId,
		    OUT PIO_STATUS_BLOCK    IoStatus,
		    IN PDEVICE_OBJECT       DeviceObject
		    )
{
	BOOLEAN     Status = FALSE;
	PEXT2_FCB   Fcb;
	
	PAGED_CODE();
	
	__try
	{
		__try
		{
			if (DeviceObject == Ext2Global->DeviceObject)
			{
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}
			
			Fcb = (PEXT2_FCB) FileObject->FsContext;
			
			ASSERT(Fcb != NULL);
			
			if (Fcb->Identifier.Type == VCB)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}
			
			ASSERT((Fcb->Identifier.Type == FCB) &&
				(Fcb->Identifier.Size == sizeof(EXT2_FCB)));
			
			if (Fcb->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}
#if DBG			
			KdPrint((
				DRIVER_NAME ": %-16.16s %-31s %s\n",
				ProcessId->ImageFileName,
				"FASTIO_UNLOCK_ALL",
				Fcb->DbgFileName
				));
#endif			
			FsRtlEnterFileSystem();
			
			IoStatus->Status = FsRtlFastUnlockAll(
				&Fcb->FileLockAnchor,
				FileObject,
				ProcessId,
				NULL
				);
			
			IoStatus->Information = 0;
			
			Status =  TRUE;
		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			IoStatus->Status = GetExceptionCode();
			Status = TRUE;
		}
	}
	__finally
	{
		FsRtlExitFileSystem();
	}
	
	if (Status == FALSE)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: FALSE ***\n",
			ProcessId->ImageFileName,
			"FASTIO_UNLOCK_ALL"
			));
	}
	else if (IoStatus->Status != STATUS_SUCCESS)
	{
		KdPrint((
			DRIVER_NAME ": %-16.16s %-31s *** Status: %s (%#x) ***\n",
			ProcessId->ImageFileName,
			"FASTIO_UNLOCK_ALL",
			Ext2NtStatusToString(IoStatus->Status),
			IoStatus->Status
			));
	}
	
	return Status;
}

BOOLEAN
Ext2FastIoUnlockAllByKey (
			 IN PFILE_OBJECT         FileObject,
			 IN PEPROCESS            ProcessId,
			 IN ULONG                Key,
			 OUT PIO_STATUS_BLOCK    IoStatus,
			 IN PDEVICE_OBJECT       DeviceObject
			 )
{
	BOOLEAN     Status = FALSE;
	PEXT2_FCB   Fcb;
	
	PAGED_CODE();
	
	__try
	{
		__try
		{
			if (DeviceObject == Ext2Global->DeviceObject)
			{
				IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
				Status = TRUE;
				__leave;
			}
			
			Fcb = (PEXT2_FCB) FileObject->FsContext;
			
			ASSERT(Fcb != NULL);
			
			if (Fcb->Identifier.Type == VCB)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;
				Status = TRUE;
				__leave;
			}
			
			ASSERT((Fcb->Identifier.Type == FCB) &&
				(Fcb->Identifier.Size == sizeof(EXT2_FCB)));
			
			if (Fcb->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				IoStatus->Status = STATUS_INVALID_PARAMETER;

⌨️ 快捷键说明

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