标 题: 【原创】使用ZwMapViewOfSection创建内存映射文件总结
作 者: 小覃
时 间: 2012-06-15,02:28:36
链 接: http://bbs.pediy.com/showthread.php?t=152144

在写驱动搜索内核模块内存时,你是不是也经常会遇到BSOD?
原因是内核模块INIT节调用完成后就取消了映射。
    解决这个问题鄙人的方法是,
自己来映射该内核模块文件内存进行内存操作。
我们使用ZwQuerySystemInformation遍历枚举模块,
得到模块名后使用ZwMapViewOfSection映射内存。

代码:
#define SEC_IMAGE 0x01000000
void* MapFileBaseAddress = NULL;
HANDLE  hFile = NULL;
HANDLE  hSection = NULL;  /** 内存映射文件,返回基址:
*/
void* CreateMapFileAndGetBaseAddr(
  PUNICODE_STRING pDriverName
  ) {
  //HANDLE  hFile;
  //HANDLE  hSection; 
  NTSTATUS status;
  SIZE_T size = 0;
  IO_STATUS_BLOCK io_status = {0};
  OBJECT_ATTRIBUTES oa = {0};   InitializeObjectAttributes(
    &oa,
  pDriverName,
    OBJ_CASE_INSENSITIVE,
    0,
    0
    ); status = ZwOpenFile(&hFile, 
       FILE_EXECUTE | SYNCHRONIZE, 
       &oa,
       &io_status, 
       FILE_SHARE_READ, 
       FILE_SYNCHRONOUS_IO_NONALERT);
if(!NT_SUCCESS(status))
        {
                DbgPrint("ZwOpenFile failed\n");
                return NULL;
        }
 oa.ObjectName = 0; status = ZwCreateSection(&hSection,
        SECTION_ALL_ACCESS,
        &oa,
        0,
        PAGE_EXECUTE, 
        SEC_IMAGE, 
        hFile);
if(!NT_SUCCESS(status))
        {
                DbgPrint("ZwCreateSection failed\n");
        hFile = NULL;
        ZwClose(hFile);
                return NULL;
        } status = ZwMapViewOfSection(hSection,
           PsGetCurrentProcessId(),
           &MapFileBaseAddress, 
           0, 
           1024,
           0, 
           &size,
           ViewShare,
           MEM_TOP_DOWN, 
           PAGE_READWRITE); 
if(!NT_SUCCESS(status))
        {
                DbgPrint("ZwMapViewOfSection failed\n");
        hSection = NULL;
        ZwClose(hSection);
        hFile = NULL;
        ZwClose(hFile);
                return NULL;
        }
    
return MapFileBaseAddress;
} 调用方法映射文件返回映射后基址, 代码: PVOID BaseAddress = NULL;
UNICODE_STRING driverName;
...... RtlInitUnicodeString( &driverName, L"\\??\\C:\\Documents and Settings\\Administrator\\桌面\\111.sys" );
BaseAddress = CreateMapFileAndGetBaseAddr(&driverName);
DbgPrint( "MapFile Return Address:%X\r\n", BaseAddress ); 释放清理: if( NULL != hFile )
  ZwClose(hFile);
if( NULL != hSection )
  ZwClose(hSection);

代码仅供参考!
PsGetCurrentProcessId()
也可以用NtCurrentProcess()代替。

以上代码在XPSP3 DDK下测试通过!*转载请注明来自看雪论坛@PEdiy.com

jpg 改 rar

使用ZwMapViewOfSection创建内存映射文件总结的更多相关文章

  1. 第17章 内存映射文件(3)_稀疏文件(Sparse File)

    17.8 稀疏调拨的内存映射文件 17.8.1 稀疏文件简介 (1)稀疏文件(Sparse File):指的是文件中出现大量的0数据,这些数据对我们用处不大,但是却一样的占用空间.NTFS文件系统对此 ...

  2. MemoryMappedFile 内存映射文件 msdn

    http://msdn.microsoft.com/zh-cn/library/dd997372%28v=vs.110%29.aspx 内存映射文件 .NET Framework 4.5 其他版本 1 ...

  3. 【WIN32进阶之路】:内存映射文件

    第一章:源起  遇到一个问题,如果一个客户数据文件有2g大,客户要通过界面查询文件中的数据并用列表控件显示数据,要怎么处理这个文件才能让应用程序不会长时间无响应,客户感觉不到程序的卡顿? 第二章:解决 ...

  4. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转

    原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing ...

  5. NET 4 中 内存映射文件

    原文链接 : http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net- ...

  6. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped

    节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作 ...

  7. .NET 4.0中使用内存映射文件实现进程通讯

    操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段.Win32 API中也包含有创建内存映射文件的函数,然而,这些函数都 ...

  8. 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射

    内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件.有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问.这种解决办法能大大简化修改文件的代码.fileC ...

  9. C++中使用内存映射文件处理大文件

    引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile().WriteFile().ReadFile() ...

随机推荐

  1. 分享公司Entity与DTO之间数据拷贝的方法

    主题 最早以前自学java web的时候,数据库查询出来一个Entity对象(CMP对象).就直接传给前台展示了.并没有用到DTO对象,开始并没有觉得有什么不好...后来发现还是需要一些DTO对象来专 ...

  2. vim 添加php自动补全 并格式化代码

    自动补全,修改/etc/vimrc的配置 vim /etc/vimrc 添加: filetype plugin on autocmd FileType php set omnifunc=phpcomp ...

  3. Angularjs2 入门

    1.创建文件夹 mkdir angular2-app cd angular2-app 2.配置Typescript 需要通过一些特殊的设置来指导Typesript进行编译.新建一个 tsconfig. ...

  4. JavaScript 日期选择器 Pikaday

    找一些插件的过程实在太痛苦了...好容易找到一个,赶紧记录下.免得以后重复浪费时间在这上面. 插件名:Pikaday github地址:https://github.com/dbushell/Pika ...

  5. Windows 10(64位)配置Caffe运行环境的基本流程

    最新博客地址已搬家到: http://blog.csdn.net/zzlyw/article/details/53215148

  6. MySQL interval()函数

    INTERVAL(N,N1,N2,N3,..........) INTERVAL()函数进行比较列表(N,N1,N2,N3等等)中的N值.该函数如果N<N1返回0,如果N<N2返回1,如果 ...

  7. python正则表达式re

    Python正则表达式: re 正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可 ...

  8. bat命令总结

    1.复制文件 copy cd.dll %windir%\system32 2.复制文件夹 /s 复制目录和子目录,除了空的. /e复制目录和子目录,包括空的. xcopy %dir%\template ...

  9. Java 判断时间是否在指定天数之内

    import java.util.Date; import java.text.SimpleDateFormat; public class WriteForBlog { static private ...

  10. 机器学习caffe环境搭建——redhat7.1和caffe的python接口编译

    相信看这篇文章的都知道caffe是干嘛的了,无非就是深度学习.神经网络.计算机视觉.人工智能这些,这个我就不多介绍了,下面说说我的安装过程即遇到的问题,当然还有解决方法. 说下我的环境:1>虚拟 ...