博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows driver 映射大文件
阅读量:6875 次
发布时间:2019-06-26

本文共 4632 字,大约阅读时间需要 15 分钟。

//如果要做到掉电后仍然可以继续向下操作,可以记录文件的位置重新映射	NTSTATUS status;	UNICODE_STRING strFileSrc = RTL_CONSTANT_STRING(L"\\??\\C:\\win7旗舰版.iso");//3.11G	UNICODE_STRING strFileDest = RTL_CONSTANT_STRING(L"\\??\\C:\\win7旗舰版1.iso");	UNICODE_STRING strSectionName = RTL_CONSTANT_STRING(L"\\MySection");//可以是符号连接的方法,也可以用\\MySection,如果不加\\会报错	HANDLE hFileSrc = NULL;	HANDLE hFileDest = NULL;	OBJECT_ATTRIBUTES oaSrc;	OBJECT_ATTRIBUTES oaDest;	OBJECT_ATTRIBUTES oaSection;	IO_STATUS_BLOCK iosb;	FILE_NETWORK_OPEN_INFORMATION fnoi;	HANDLE hSection = NULL;	PVOID pAddress = NULL;	SIZE_T viewsize = 0;	LARGE_INTEGER li_Section;	LARGE_INTEGER li_Offset;	LARGE_INTEGER li_WriteOffset;	SIZE_T CommitSize = 64 * 1024 * 1024;//粒度为64Kb的倍数,参考windows核心编程.每次映射的基数						//GetSysteminfo中的dwAllocationGranularity 就是分配粒度,通常是64kb	InitializeObjectAttributes(&oaSrc, &strFileSrc, OBJ_KERNEL_HANDLE, NULL, NULL);	InitializeObjectAttributes(&oaDest, &strFileDest, OBJ_KERNEL_HANDLE, NULL, NULL);	InitializeObjectAttributes(&oaSection, &strSectionName, OBJ_KERNEL_HANDLE, NULL, NULL);	status = ZwCreateFile(&hFileSrc, GENERIC_READ, &oaSrc, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_NON_DIRECTORY_FILE, NULL, 0);	if (!NT_SUCCESS(status)){		ZwClose(hFileSrc);		KdPrint(("hFileSrc: ZwCreateFile failed with error %I32X", status));		return status;	}	status = ZwQueryFullAttributesFile(&oaSrc, &fnoi);	if (!NT_SUCCESS(status)){		ZwClose(hFileSrc);		ZwClose(hSection);		KdPrint(("ZwQueryFullAttributesFile failed with error %I32X", status));		return status;	}	KdPrint(("文件大小:%I64d", fnoi.AllocationSize.QuadPart));	li_Section.QuadPart = fnoi.AllocationSize.QuadPart;	status = ZwCreateSection(&hSection, SECTION_MAP_READ | SECTION_MAP_WRITE, &oaSection, &li_Section, PAGE_READWRITE, SEC_RESERVE, hFileSrc);//只分配在虚拟内存中,不提交到物理内存.参考VirtualAlloc	if (!NT_SUCCESS(status)){		ZwClose(hFileSrc);		ZwClose(hSection);		KdPrint(("ZwCreateSection failed with error %I32X", status));		return status;	}	status = ZwCreateFile(&hFileDest, 							GENERIC_READ | GENERIC_WRITE,							&oaDest,							&iosb,							&li_Section,//要创建的文件大小							FILE_ATTRIBUTE_NORMAL,							0,							FILE_CREATE,							FILE_NON_DIRECTORY_FILE,							NULL,							0);	if (!NT_SUCCESS(status)){		ZwClose(hFileSrc);		ZwClose(hSection);		ZwClose(hFileDest);		KdPrint(("hFileDest: ZwCreateFile failed with error %I32X", status));		return status;	}	li_Offset.QuadPart = 0;	viewsize = CommitSize;	while (li_Offset.QuadPart < li_Section.QuadPart){		if ((li_Section.QuadPart - li_Offset.QuadPart) / CommitSize > 0){			status = ZwMapViewOfSection(hSection,										ZwCurrentProcess(),										&pAddress,//BaseAddress 如果不为NULL,则分配在指定的位置,有可能失败										0,//为NULL,表示可以分配在虚拟内存的任意位置,请参考windows核心编程里面的VirtualAlloc										CommitSize,//文件大小										&li_Offset,										&viewsize,										ViewUnmap,										MEM_RESERVE | MEM_LARGE_PAGES ,										PAGE_READWRITE);			if (!NT_SUCCESS(status)){				ZwClose(hFileSrc);				ZwClose(hSection);				ZwClose(hFileDest);				ZwUnmapViewOfSection(hSection, pAddress);				KdPrint(("ZwMapViewOfSection1 failed with error %I32X", status));				return status;			}			li_WriteOffset.HighPart = -1;			li_WriteOffset.LowPart = FILE_WRITE_TO_END_OF_FILE;			ZwWriteFile(hFileDest, NULL, NULL, NULL, &iosb, pAddress, viewsize, &li_WriteOffset, NULL);//从文件末尾开始写数据			ZwUnmapViewOfSection(ZwCurrentProcess(), pAddress);			li_Offset.QuadPart += viewsize;		}		else{			viewsize = (SIZE_T)(li_Section.QuadPart - li_Offset.QuadPart);//获得剩余多少数据还没有写入			KdPrint(("view = %I64d %I32d %I64d", li_Offset.QuadPart, viewsize, li_Section.QuadPart));			status = ZwMapViewOfSection(hSection,										ZwCurrentProcess(),										&pAddress,//BaseAddress 如果不为NULL,则分配在指定的位置,有可能失败										0,//为NULL,表示可以分配在虚拟内存的任意位置,请参考windows核心编程里面的VirtualAlloc										viewsize,//文件大小										&li_Offset,										&viewsize,										ViewUnmap,										MEM_RESERVE | MEM_LARGE_PAGES ,										PAGE_READWRITE);			if (!NT_SUCCESS(status)){				ZwClose(hFileSrc);				ZwClose(hSection);				ZwClose(hFileDest);				ZwUnmapViewOfSection(hSection, pAddress);				KdPrint(("ZwMapViewOfSection2 failed with error %I32X", status));				return status;			}			li_WriteOffset.HighPart = -1;			li_WriteOffset.LowPart = FILE_WRITE_TO_END_OF_FILE;			ZwWriteFile(hFileDest, NULL, NULL, NULL, &iosb, pAddress, viewsize, &li_WriteOffset, NULL);//参数ByteOffset为0表示从其实地址开始写数据,适用于小文件			ZwUnmapViewOfSection(ZwCurrentProcess(), pAddress);			li_Offset.QuadPart += viewsize;		}	}	ZwClose(hSection);	ZwClose(hFileDest);	ZwClose(hFileSrc);	KdPrint(("写文件成功"));	return STATUS_SUCCESS;

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

转载于:https://www.cnblogs.com/qq76211822/p/4712055.html

你可能感兴趣的文章
一台机器同时启动多个tomcat
查看>>
Java中的多线程
查看>>
Zookeeper不适合注册中心的原因
查看>>
内核是什么
查看>>
标签的语义
查看>>
Freemarker入门例子
查看>>
利用busybox工具制作微型linux系统二
查看>>
商业无小事,现实生活不在童话故事里
查看>>
Unsupported major.minor version 51.0解决办法
查看>>
我的友情链接
查看>>
新手如何入门
查看>>
15.2-全栈Java笔记:ActionEvent事件类型可以实现哪些功能?
查看>>
apache-tomcat-6.0.X如何配置管理界面Administration Tool
查看>>
Ibatis实例程序
查看>>
Linux下Nagios的安装与配置
查看>>
esxi5手动打补丁升级
查看>>
spring core 笔记(一)
查看>>
一例mysql主从数据库,从库宕机后无法启动的解决方案
查看>>
WebView 设置软键盘弹出将屏幕上移
查看>>
通过xsl显示和输出XML数据2
查看>>