NTSTATUS status;
UNICODE_STRING strFileSrc = RTL_CONSTANT_STRING(L"\\??\\C:\\网络调试工具.exe");//几十kb
UNICODE_STRING strFileDest = RTL_CONSTANT_STRING(L"\\??\\C:\\网络调试工具1.exe");
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; 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;
} li_Offset.QuadPart = 0;
status = ZwMapViewOfSection(hSection,
ZwCurrentProcess(),
&pAddress,//BaseAddress 如果不为NULL,则分配在指定的位置,有可能失败
0,//为NULL,表示可以分配在虚拟内存的任意位置,请参考windows核心编程里面的VirtualAlloc
(ULONG)li_Section.LowPart,//文件大小
&li_Offset,//从文件的那里开始映射,从其实位置开始映射,则li_Offset.QuadPart = 0;
&viewsize,//对于小文件,SectionOffset 和 ViewSize 都为0
ViewUnmap,
MEM_RESERVE | MEM_LARGE_PAGES ,
PAGE_READWRITE);
if (!NT_SUCCESS(status)){
ZwClose(hFileSrc);
ZwClose(hSection);
ZwClose(hFileDest);
ZwUnmapViewOfSection(hSection, pAddress);
KdPrint(("ZwMapViewOfSection 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_WriteOffset.QuadPart = 0;
ZwWriteFile(hFileDest, NULL, NULL, NULL, &iosb, pAddress, viewsize, &li_WriteOffset, NULL);//参数ByteOffset为0表示从其实地址开始写数据,适用于小文件
ZwUnmapViewOfSection(ZwCurrentProcess(), pAddress); ZwClose(hSection);
ZwClose(hFileDest);
ZwClose(hFileSrc);
return STATUS_SUCCESS;

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

windows driver 映射小文件的更多相关文章

  1. windows driver 映射大文件

    //如果要做到掉电后仍然可以继续向下操作,可以记录文件的位置重新映射 NTSTATUS status; UNICODE_STRING strFileSrc = RTL_CONSTANT_STRING( ...

  2. 分享CCNTFS小工具,在 macOS 中完全读写、修改、访问Windows NTFS硬盘的文件,无须额外的驱动(原生驱动)更稳定,简单设置即可高速传输外接NTFS硬盘文件

    CCNTFS [ 下载 ] 在 macOS 中完全读写.修改.访问Windows NTFS硬盘的文件,无须额外的驱动(原生驱动)更稳定,安装后进行简单设置即可高速传输外接NTFS硬盘文件,可全程离线使 ...

  3. windows内存映射学习及帮助类实现

    本文通过创建文件内存映射类,学习windows内存映射相关知识:创建内存映射文件后,可以按照内存操作方式操作文件:支持32位程序处理超过4G大小的文件. 感谢http://blog.csdn.net/ ...

  4. Hadoop对小文件的解决方式

    小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.不论什么一个文件,文件夹和block,在HDFS中都会被表示为一个object存储在namenode的内存中, 每一 ...

  5. 如何利用Hadoop存储小文件

    **************************************************************************************************** ...

  6. 驱动开发利器Microsoft Windows Driver Kit 7.1.0下载

    在Windows 2000 与Windows XP 系统采用是WINDDK来开发WINDOWS驱动程序,我手头也有WINDDK,可是从Windows Vista开始之后,一般采用Microsoft W ...

  7. 海量小文件存储与Ceph实践

    海量小文件存储(简称LOSF,lots of small files)出现后,就一直是业界的难题,众多博文(如[1])对此问题进行了阐述与分析,许多互联网公司也针对自己的具体场景研发了自己的存储方案( ...

  8. hadoop小文件合并

    1.背景 在实际项目中,输入数据往往是由许多小文件组成,这里的小文件是指小于HDFS系统Block大小的文件(默认128M), 然而每一个存储在HDFS中的文件.目录和块都映射为一个对象,存储在Nam ...

  9. [转载]解析WINDOWS中的DLL文件---经典DLL解读

    [转载]解析WINDOWS中的DLL文件---经典DLL解读 在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库.现在就走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! ...

随机推荐

  1. 转:Nginx的accept_mutex配置

    通常多数人不会注意Nginx的accept_mutex配置,不过实际上它对系统的吞吐量有一定的影响. events { accept_mutex off; } 让我们看看accept_mutex的意义 ...

  2. mabatis--使用mapper代理开发dao

    1.编写mapper.xml映射文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE m ...

  3. Python Download Image (python + requests + BeautifulSoup)

    环境准备 1 python + requests + BeautifulSoup 页面准备 主页面: http://www.netbian.com/dongman/ 图片伪地址: http://www ...

  4. 想要转战CSDN了!!

    CSDN博客地址: https://blog.csdn.net/weixin_41559364

  5. Model Validation 和测试Post参数

    using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentM ...

  6. angularJs-服务调用与后台数据获取

    可以用factory做一些后台数据的获取,例如 happyFarm.factory('seedList',['$http',function($http){    return {        ge ...

  7. 蓝牙 BLE 协议学习: 3种蓝牙架构实现方案(蓝牙协议栈方案)

    导言 不同的蓝牙架构可以用在不同的场景中.从而协议帧的架构方案也会不同. 转载自:<三种蓝牙架构实现方案(蓝牙协议栈方案)> 蓝牙架构实现方案有哪几种?我们一般把整个蓝牙实现方案叫做蓝牙协 ...

  8. 运行自己的 DaemonSet【转】

    本节以 Prometheus Node Exporter 为例演示如何运行自己的 DaemonSet. Prometheus 是流行的系统监控方案,Node Exporter 是 Prometheus ...

  9. 【pwnable.tw】 starbound

    此题的代码量很大,看了一整天的逻辑代码,没发现什么问题... 整个函数的逻辑主要是红框中两个指针的循环赋值和调用,其中第一个指针是主功能函数,第二个数组是子功能函数. 函数的漏洞主要在main函数中, ...

  10. Ubuntu18.04 LTS 搭建Cassandra集群

    环境需求 jdk8 root@node01:~# java -version java version "1.8.0_202" Java(TM) SE Runtime Enviro ...