内核 复制文件

本文介绍在Windows 7 x64环境下,使用内核模式驱动进行文件复制的方法。通过示例代码展示了如何创建文件句柄、读取源文件、写入目标文件,并确保操作的正确性和资源释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇的时候我学会了  读取文件 还有查询文件大小 写入文件等  然后想写一些代码 比如文件复制的 什么 的 

然后 我昨天 决心学 X64的驱动了 然后昨天也把win7 X64的双机调试  搞定了   然后开始了 写win7 X64驱动的第一天

其实 x64 和x86都是差不多的  只不过  x64有些数据结构 重写了  如果 还用 x86 的 可能就凉了 

   

然后 先看  个  win7x86 的 文件复制的效果把  

效果就是  里面的log 1  多出了 log 2 说明是成功的   

然后看看x64 的效果 

win 7 x64 也是完美运行的  

那么 下面就是代码 

#include <ntddk.h>

VOID DriverUnload(PDRIVER_OBJECT driver)
{
	KdPrint(("goodbye"));
}
BOOLEAN copyfile(UNICODE_STRING destfile, UNICODE_STRING srcfile)
{
	HANDLE hdfile=NULL, hsrcfile=NULL;
	PVOID buffer = NULL;
	ULONG len = 0;
	LARGE_INTEGER offset = { 0 };
	IO_STATUS_BLOCK IO = { 0 };
	OBJECT_ATTRIBUTES ob;
	NTSTATUS status;
	BOOLEAN bret = FALSE;
	InitializeObjectAttributes(&ob,
		&srcfile,
		OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
		NULL,
		NULL);
	status = ZwCreateFile(&hsrcfile,
		GENERIC_READ,
		&ob,
		&IO,
		NULL,
		FILE_ATTRIBUTE_NORMAL,
		FILE_SHARE_READ,
		FILE_OPEN,
		FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
		NULL,
		0);
	if (!NT_SUCCESS(status))
	{
		if (hsrcfile)
			ZwClose(hsrcfile);
		if (hdfile)
			ZwClose(hdfile);
		if (buffer != NULL)
			ExFreePool(buffer);
		KdPrint(("获取文件句柄失败 清观察一下是否存在此文件!\n"));
		return FALSE;
	}
	InitializeObjectAttributes(&ob,
		&destfile,
		OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
		NULL,
		NULL);
	status = ZwCreateFile(&hdfile,
		GENERIC_WRITE,
		&ob,
		&IO,
		NULL,
		FILE_ATTRIBUTE_NORMAL,
		FILE_SHARE_READ,
		FILE_OPEN_IF,
		FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
		NULL,
		0);
	if (!NT_SUCCESS(status))
	{ 
		if (hsrcfile)
			ZwClose(hsrcfile);
		if (hdfile)
			ZwClose(hdfile);
		if (buffer != NULL)
			ExFreePool(buffer);
		KdPrint(("获取文件句柄失败 清观察一下是否存在此文件!\n"));
		return FALSE;
	}
	buffer = ExAllocatePool(NonPagedPool, 1024*4);
	if (buffer == NULL)
	{
		KdPrint(("申请内存失败!\n"));
		return FALSE;
	}
	while (1)
	{
		len = 4 * 1024;
		status = ZwReadFile(hsrcfile,
			NULL,
			NULL,
			NULL,
			&IO,
			buffer,
			len,
			&offset,
			NULL);
		if (!NT_SUCCESS(status))
		{
			if (status == STATUS_END_OF_FILE)
			{
				if (hsrcfile)
					ZwClose(hsrcfile);
				if (hdfile)
					ZwClose(hdfile);
				if (buffer != NULL)
					ExFreePool(buffer);
				KdPrint(("成功!\n"));
				return TRUE;
			}
		}
		len = (ULONG)IO.Information;
		status = ZwWriteFile(hdfile,
			NULL,
			NULL,
			NULL,
			&IO,
			buffer,
			len,
			&offset,
			NULL);
		if (!NT_SUCCESS(status))
		{
			if (hsrcfile)
				ZwClose(hsrcfile);
			if (hdfile)
				ZwClose(hdfile);
			if (buffer != NULL)
				ExFreePool(buffer);
			KdPrint(("写入失败!\n"));
			return FALSE;
		}
		offset.QuadPart += len;
	}
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
	KdPrint(("first: Hello, my salary!"));
	UNICODE_STRING log, log1;
	RtlInitUnicodeString(&log, L"\\??\\C:\\2.log");
	RtlInitUnicodeString(&log1, L"\\??\\C:\\1.log");
	if (copyfile(log, log1))
	{
		KdPrint(("好嗨哟"));
	}
	else
	{
		KdPrint(("OMG"));
	}
	DriverObject->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}

其实也不难  一边写 一边读 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值