如何备份被独占文件?

在windows中,如果一个文件以独占的方式被打开了,一般来讲,别的应用程序就不能再打开这个文件了,但是如果要备份这个文件,怎么办呢?

一般有两种方法来处理。

第一种方法:

使用VSS,这也是微软推荐备份的方法,对该文件所在的卷做volume snapshot, 就可以从VSS里面读取该文件内容了。关于VSS编程开发相关信息,可以参考微软文档。

第二种方法:

可以在内核中比如mini filter中打开这个文件,然后将文件的handle传到应用层,应用层就可以使用这个handle去读文件内容了。

比如内核程序打开这个被占用的文件代码如下:

NTSTATUS
GetFileHandleByFileName(
IN PUNICODE_STRING FullFileName,
OUT PHANDLE Handle
)
{
	HANDLE	FileHandle = NULL;
	PFILE_OBJECT FileObject = NULL;

	OBJECT_ATTRIBUTES	ObjectAttributes;
	IO_STATUS_BLOCK		IoStatus;
	InitializeObjectAttributes(
		&ObjectAttributes,
		FullFileName,
		OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
		NULL,
		NULL
		);
	
	NTSTATUS status = FltCreateFileEx(
		gFilterHandle,
		NULL,
		&FileHandle,
		&FileObject,
		GENERIC_READ,
		&ObjectAttributes,
		&IoStatus,
		NULL,
		FILE_ATTRIBUTE_NORMAL,
		FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
		FILE_OPEN,
		FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_ALERT | FILE_SEQUENTIAL_ONLY ,
		NULL,
		0,
		IO_IGNORE_SHARE_ACCESS_CHECK
		);
	
	PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("SSMF:GetFileHandleByFileName open the file status is status=%08x\n", status));
	if (NT_SUCCESS(status) && FileObject)
	{

		status = ObOpenObjectByPointer(
			FileObject,
			0,
			0,
			GENERIC_READ,
			*IoFileObjectType,
			UserMode,
			Handle
			);
		PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("SSMF:ObOpenObjectByPointer open the file (%p) status is status=%08x\n", Handle,status));

	}
	if (FileHandle)
		FltClose(FileHandle);
	if (FileObject)
		ObDereferenceObject(FileObject);
	return status;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simple-Soft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值