映射内存的可执行文件和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. nginx 502排错

    线上一台机器(该论坛所在机器)近期频繁出现502,每100次访问就会出现10次,这频率也太高了.于是开始了我的502排查之旅 ps aux |grep -c php 结果为200 netstat -a ...

  2. 《深入理解 Java 虚拟机》读书笔记:类文件结构

    正文 一.无关性的基石 1.两种无关性 平台无关性: Java 程序的运行不受计算机平台的限制,"一次编写,到处运行". 语言无关性: Java 虚拟机只与 Class 文件关联, ...

  3. SpringMVC 使用注解完成登录拦截

    目录 为了实现用户登录拦截你是否写过如下代码呢? 1. 基于Filter 2. 基于Struts 3. 基于SpringMVC 如何使用自定义注解完成自定义拦截呢? 登录注解 SpringMVC 拦截 ...

  4. 配置github——每次提交后使contributions有记录(有小绿格子)

    # 配置github--每次提交后使contributions有记录(有小绿格子) 这几天都有将自己的代码提交到github上,但是在profile里的contributions的表格中没有我提交的记 ...

  5. C# InputStream获取后乱码处理

    Post推送过来的数据流获取后部分中文出现乱码,晚上找了好多办法,不如朋友鼎力相助,哈哈哈~不说废话了上代码把 旧代码基本是网上普遍写法,字段不长用起来不会有乱码情况,但是传送字段一旦过长,超过byt ...

  6. 全差分运算放大器ADA4930的分析(1)

    AD转换芯片的模拟信号输入端方式为:全差分.伪差分.单端输入,其中全差分输入的效果最佳,现阶段ADC转换器为了提高其性能,建议用户使用全差分的输入方式.(AD7982.ADS8317等都能实现信号的全 ...

  7. react-intl 实现 React 国际化多语言

    效果预览 React Intl 国际化步骤 创建国际化资源文件 根据语言获取国际化资源 引入 react-intl 的 local data 创建 LocaleProvider 国际化上下文组件 创建 ...

  8. css自定义 range radio select的样式滑轮,按钮,选择框

    写在前面: 之前踩坑css的时候,遇到滑轮,按钮,选择框这类型的东西,为了页面效果,总是需要自定义他们的样式,而不使用他们的默认样式.当时写的时候,我也是蛮头疼的,弄了个demo,链接在下面.对此做个 ...

  9. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)

    5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...

  10. JavaScript的数组系列

    数组 今天逆战班的学习主题关于Javascript的数组,主要有数组的概念.创建.分类.方法.遍历.经典算法...... 一.数组是什么呢?怎么写数组呢?数组有多少种呢? 数组的概念 对象是属性的无序 ...