映射内存的可执行文件和dll

当一个线程调用CreateProcess的时候,系统会执行以下步骤:

  1. 系统会先确定CreateProcess所指定的可执行文件的所在位置。如果找不到文件,那么CreateProcess会返回FALSE。、
  2. 系统创建一个内核对象EProcess
  3. 系统为新进程创建一个私有的地址空间
  4. 系统预定一个足够大的地址空间来容纳.exe文件。PE文件中有指定的预定位置。默认情况下,.exe文件的基地址为0x00400000,构建exe代码时,可以通过/BASE链接器开关,来指定一个预定地址。
  5. 系统会对地址空间的区域进行标注,表明该区域的后备物理储存器来自磁盘上的exe文件,而不是页交换文件。

当系统把.exe文件映射到进程的地址空间之后,会访问.exe文件中的一个段,这个段列出了一些DLL文件,它们包含该.exe文件调用的函数。然后系统会调用LoadLibrary来加载每个dll,如果载入的DLL中还需要其他的DLL,

系统也会同样的调用LoadLibrary来加载DLL,系统加载DLL的时候,会执行以下操作

  1. 系统会预定一块足够大的地址空间区域来容纳DLL文件。预定的地址空间区域已经在DLL文件中指出。默认情况下X86平台的DLL的基地址为0x10000000,x64平台上是0x00400000.但是,只需在构建DLL文件时使用/BASE链接器开关,就能指定一个预定地址。
  2. 如果系统无法在DLL文件中指出的预定基地址处预定区域,原因有两种①该位置已经被其他的DLL后者exe占用 ②区域不够大。这个时候系统会尝试在其他位置加载DLL。                                                                          如果系统无法加载DLL到指定的位置,那么有可能就是DLL中不包括重定位信息,那么系统就无法在其他位置加载DLL。    
  3. 系统会对地址空间区域进行标注,表明该区域的后备物理存储器时来自磁盘上的DLL文件,而并非来自系统的页交换文件。如果由于Windows不能将DLL载入到指定的位置而进行重定向的话,系统还会另外的进行i标注,表明DLL中的一部分物理存储器被映射到了页交换文件中。

内存映射文件

要使用内存映射文件,需要执行三个步骤:

  1. 创建或打开一个文件内核对象,该对象标识内存映射文件的那个磁盘文件。                            CreateFile
  2. 创建了一个文件映射内核对象来告诉系统该文件的大小以及访问权限。                                   CreateFileMapping
  3. 告诉系统把文件映射对象的部分或者全部映射到进程的地址空间中去。                                   MapViewOfFile
  4. .................................................
  5. 取消进程地址空间对文件内核对象的映射。                                                             UnmapViewOfFile
  6. 关闭文件映射对象                                                                                                     CloseHandle
  7. 关闭文件内核对象                                                                                                     CloseHandle

文件映射(Windows核心编程)的更多相关文章

  1. 【Windows核心编程】一个使用内存映射文件进行进程间通信的例子

    进程间通信的方式有很多种,其底层原理使用的都是内存映射文件. 本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信. 进程1 按钮[Create  mappin ...

  2. 《windows核心编程系列》十六谈谈内存映射文件

    内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件.将文件映射到内存中后,我们就可以在内存中操作他们了 ...

  3. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  4. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

  5. 【Windows】windows核心编程整理(下)

    windows核心编程整理(上) windows核心编程整理(下) 线程的堆栈 每当创建一个线程时,系统就会为线程的堆栈(每个线程有他自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个以保 ...

  6. 【Windows】windows核心编程整理(上)

    小续 这是我11年看<windows核心编程>时所作的一些笔记,现整理出来共享给大家 windows核心编程整理(上) windows核心编程整理(下) 线程的基础知识 进程是不活泼的,进 ...

  7. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  8. windows核心编程 DLL技术 【转】

    注:本文章转载于网络,源地址为:http://blog.csdn.net/ithzhang/article/details/7051558 本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑 ...

  9. 【转】《windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  10. 《Windows核心编程系列》二十谈谈DLL高级技术

    本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑定的技术. 第一种将DLL映射到进程地址空间的方式是直接在源代码中引用DLL中所包含的函数或是变量,DLL在程序运行后由加载程序隐式的载入, ...

随机推荐

  1. Android(四)-JVM与DVM区别

    JVM与DVM区别 1.由来 Android是基于java的既然java已经有了java虚拟机,为什么android还要弄一个DVM了?最重要的就是版权问题,一开始就是用的 JVM,没过多久就被SUN ...

  2. CSS 技巧汇总

    CSS 选择符优先级 !important 声明>内联样式(style)>id 选择符(#id)>类选择符(.class)=伪类选择符(:hover )=属性选择符([attr] ) ...

  3. uniq命令使用方法

    uniq命令的作用:显示唯一的行,对于那些连续重复的行只显示一次! 接下来通过实践实例说明: [root@stu100 ~]# cat test boy took bat home boy took ...

  4. udev更改按键映射

    通过更改udev的规则实现敲击a键获得s的输出 安装evtest   首先安装evtest检测键盘的扫描码 123456789 # apt install evtest# sudo evtestNo ...

  5. 先搞清楚这些问题,简历上再写你熟悉Java!

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  6. 探究Java中的引用

    探究Java中的四种引用 从JDK1.2版本开始,Java把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用.本篇就来详细探究 ...

  7. 服务器推送 SSE 了解一下?

    hello~亲爱的看官老爷们大家好~过完年第一周已经结束,是时候开始制定新的工作计划了.主要负责的项目是数据可视化平台,而使用中如果服务器能有推送能力让页端得到相关通知的话,就能实现很多功能上的优化. ...

  8. XCTF---easyjava的WriteUp

    一.题目来源     题目来源:XCTF题库安卓区easyjava     题目下载链接:下载地址 二.解题过程     1.将该apk安装进夜神模拟器中,发现有一个输入框和一个按钮,随便输入信息,点 ...

  9. Openwrt 路由器上 安装 svn server

    Openwrt 上也可以搭建 svn 服务了,这样就不用开着 ubuntu 了,省电. 在后台打开 ssh 服务,或者使用 telnet 服务,使用 putty 登录路由器. 如下图所示,这里刷的是 ...

  10. Oracle 11g rac开启归档

    Oracle 11g rac开启归档 查看目前归档状态 #节点1 ykws1 SQL> archive log list; Database log mode No Archive Mode A ...