内核 复制文件

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

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

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

   

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

内核 复制文件_第1张图片

内核 复制文件_第2张图片

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

然后看看x64 的效果 

内核 复制文件_第3张图片

win 7 x64 也是完美运行的  

那么 下面就是代码 

#include 

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;
}

其实也不难  一边写 一边读 

你可能感兴趣的:(驱动入门)