windows driver 映射大文件
//如果要做到掉电后仍然可以继续向下操作,可以记录文件的位置重新映射
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核心编程.每次映射的基数
<span style="white-space:pre"> </span>//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;
版权声明:本文为博主原创文章,未经博主允许不得转载。
windows driver 映射大文件的更多相关文章
- windows driver 映射小文件
NTSTATUS status; UNICODE_STRING strFileSrc = RTL_CONSTANT_STRING(L"\\??\\C:\\网络调试工具.exe"); ...
- windows 之间远程大文件传输问题解决
今天我在远程登录另一台windows的时候,需要传输一个大约3GB的文件,但是每每经过了一会儿,就会提示我未知错误问题. 我在网上找了一下,本问题的解决方法如下. 1.打开远程登录的对话窗口 2.选择 ...
- c++ windows下读取大文件(内存映射)
关于内存映射的基本知识以及一些函数的原型说明,参考博客:http://blog.csdn.net/wcyoot/article/details/7363393 下面是我对于读取一个104M文件大小,使 ...
- Windows 2003 复制大文件提示系统资源不足的处理方法
方案一: 修改虚拟内存,让虚拟内存的大小略微超过要复制的文件的大小. 方案二: 修改注册表,如下: 注册表设置1 单击开始,单击运行,在打开框中键入“REGEDIT“ ,然后单击“确定”. 找到并单击 ...
- C#内存映射大文件并使用Marshal解析结构体信息
内存映射数据处理类主要函数及变量如下: string _filepath; /// <summary> /// 引用内存映射文件 /// </summary> private ...
- crt 和 Windows之间传输大文件
crt 通过rz.sz基于Zmodem传输协议最大支持4GB的文件,超过这个大小有两种方式(目前已知) 1.通过自带的FTP,如果是直连可以通过这种方式 调出crt会话窗口,然后通过组合键 Alt+p ...
- mysql windows 下导入大文件
先进入你的mysql bin目录 cd D:/php/mysql/bin 输入命令 mysql -u 用户名 -p 密码 数据库名 < 文件路径 ...
- Java NIO内存映射---上G大文件处理(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...
- C++中使用内存映射文件处理大文件
引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile().WriteFile().ReadFile() ...
随机推荐
- matplotlib画图的时候显示不出中文和负号的解决办法
import matplotlib.pyplot as pltfrom pylab import * plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中 ...
- 「NOI2009」二叉查找树
传送门 Luogu 解题思路 看一眼题面,显然这是一颗 treap ,考虑到这棵 treap 的中序遍历总是不变的,所以我们就先把所有点按照数据值排序,求出 treap 的中序遍历,然后还可以观察到, ...
- CPU、内存、硬盘之间的关系
要完完全全地讲清楚cpu.内存.硬盘之间的关系,博客的篇幅是不够的.这里简单的介绍以下它们之间的关系,抛砖引玉. 1.CPU即中央处理器,是英语“Central Processing Unit”的缩写 ...
- mysql多实例双主部署
本文引自公司技术文档,仅作为记录. 背景 有的时候需要进行数据库环境的隔离,以及节省服务器资源一台mysql安装多个数据库实例,一个实例下构建多个数据库 安装mysql yum -y install ...
- GNS3 模拟icmp记录路由
路由配置: icmp记录路由抓取出接口的IP地址,最多可以抓取9个.ip协议头中的options为40个字节 R1 : conf t int f0/0 no shutdown ip add 192.1 ...
- HiBench成长笔记——(3) HiBench测试Spark
很多内容之前的博客已经提过,这里不再赘述,详细内容参照本系列前面的博客:https://www.cnblogs.com/ratels/p/10970905.html 创建并修改配置文件conf/spa ...
- 2-10 就业课(2.0)-oozie:11、hadoop的federation(联邦机制,了解一下)
==================================================== Hadoop Federation 背景概述 单NameNode的架构使得HDFS在集群扩展性 ...
- Day6 - I - Sticks Problem POJ - 2452
Xuanxuan has n sticks of different length. One day, she puts all her sticks in a line, represented b ...
- python爬虫破解带有RSA.js的RSA加密数据的反爬机制
前言 同上一篇的aes加密一样,也是偶然发现这个rsa加密的,目标网站我就不说了,保密. 当我发现这个网站是ajax加载时: 我已经习以为常,正在进行爬取时,发现返回为空,我开始用findler抓包, ...
- 【转】Spark Streaming 实时计算在甜橙金融监控系统中的应用及优化
系统架构介绍 整个实时监控系统的架构是先由 Flume 收集服务器产生的日志 Log 和前端埋点数据, 然后实时把这些信息发送到 Kafka 分布式发布订阅消息系统,接着由 Spark Streami ...