文件映射(Windows核心编程)
映射内存的可执行文件和dll
当一个线程调用CreateProcess的时候,系统会执行以下步骤:
- 系统会先确定CreateProcess所指定的可执行文件的所在位置。如果找不到文件,那么CreateProcess会返回FALSE。、
- 系统创建一个内核对象EProcess
- 系统为新进程创建一个私有的地址空间
- 系统预定一个足够大的地址空间来容纳.exe文件。PE文件中有指定的预定位置。默认情况下,.exe文件的基地址为0x00400000,构建exe代码时,可以通过/BASE链接器开关,来指定一个预定地址。
- 系统会对地址空间的区域进行标注,表明该区域的后备物理储存器来自磁盘上的exe文件,而不是页交换文件。
当系统把.exe文件映射到进程的地址空间之后,会访问.exe文件中的一个段,这个段列出了一些DLL文件,它们包含该.exe文件调用的函数。然后系统会调用LoadLibrary来加载每个dll,如果载入的DLL中还需要其他的DLL,
系统也会同样的调用LoadLibrary来加载DLL,系统加载DLL的时候,会执行以下操作:
- 系统会预定一块足够大的地址空间区域来容纳DLL文件。预定的地址空间区域已经在DLL文件中指出。默认情况下X86平台的DLL的基地址为0x10000000,x64平台上是0x00400000.但是,只需在构建DLL文件时使用/BASE链接器开关,就能指定一个预定地址。
- 如果系统无法在DLL文件中指出的预定基地址处预定区域,原因有两种①该位置已经被其他的DLL后者exe占用 ②区域不够大。这个时候系统会尝试在其他位置加载DLL。 如果系统无法加载DLL到指定的位置,那么有可能就是DLL中不包括重定位信息,那么系统就无法在其他位置加载DLL。
- 系统会对地址空间区域进行标注,表明该区域的后备物理存储器时来自磁盘上的DLL文件,而并非来自系统的页交换文件。如果由于Windows不能将DLL载入到指定的位置而进行重定向的话,系统还会另外的进行i标注,表明DLL中的一部分物理存储器被映射到了页交换文件中。
内存映射文件
要使用内存映射文件,需要执行三个步骤:
- 创建或打开一个文件内核对象,该对象标识内存映射文件的那个磁盘文件。 CreateFile
- 创建了一个文件映射内核对象来告诉系统该文件的大小以及访问权限。 CreateFileMapping
- 告诉系统把文件映射对象的部分或者全部映射到进程的地址空间中去。 MapViewOfFile
- .................................................
- 取消进程地址空间对文件内核对象的映射。 UnmapViewOfFile
- 关闭文件映射对象 CloseHandle
- 关闭文件内核对象 CloseHandle
文件映射(Windows核心编程)的更多相关文章
- 【Windows核心编程】一个使用内存映射文件进行进程间通信的例子
进程间通信的方式有很多种,其底层原理使用的都是内存映射文件. 本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信. 进程1 按钮[Create mappin ...
- 《windows核心编程系列》十六谈谈内存映射文件
内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件.将文件映射到内存中后,我们就可以在内存中操作他们了 ...
- 《windows核心编程系列》十八谈谈windows钩子
windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...
- 《Windows核心编程》读书笔记 上
[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...
- 【Windows】windows核心编程整理(下)
windows核心编程整理(上) windows核心编程整理(下) 线程的堆栈 每当创建一个线程时,系统就会为线程的堆栈(每个线程有他自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个以保 ...
- 【Windows】windows核心编程整理(上)
小续 这是我11年看<windows核心编程>时所作的一些笔记,现整理出来共享给大家 windows核心编程整理(上) windows核心编程整理(下) 线程的基础知识 进程是不活泼的,进 ...
- C++Windows核心编程读书笔记
转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...
- windows核心编程 DLL技术 【转】
注:本文章转载于网络,源地址为:http://blog.csdn.net/ithzhang/article/details/7051558 本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑 ...
- 【转】《windows核心编程》读书笔记
这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...
- 《Windows核心编程系列》二十谈谈DLL高级技术
本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑定的技术. 第一种将DLL映射到进程地址空间的方式是直接在源代码中引用DLL中所包含的函数或是变量,DLL在程序运行后由加载程序隐式的载入, ...
随机推荐
- LISTAGG函数
官网进入 该函数作用是可以实现对列值得拼接: 根据官网介绍,可以对列值排序进行拼接,也可以分组拼接 1.1运行结果 1.2运行结果 2运行结果 注意该函数提供的 over( partition by ...
- jQuery样式及html属性操作
样式及html属性操作1,行内样式 css(); a:获取样式 元素.css(样式名称); b:设置单个样式 元素.css("样式名称":"样式值"); c:设 ...
- AI入门之KNN算法学习
一.什么是KNN算法 kNN(k-NearestNeighbor),也就是k最近邻算法.顾名思义,所谓K最近邻,就是k个最近的邻居的意思.也就是在数据集中,认为每个样本可以用离他最距离近的k个邻居来代 ...
- post请求与get请求的差别
幂等的概念 在理解这两者的区别前需要先了解的概念: 幂等性在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.简单的说就是,浏览器发起一次请求和多次请求,不会改变目标资源的状 ...
- [LeetCode] 面试题 10.01.合并排序的数组
题目: 这道题有多种实现的思路,这里使用双指针结合数组有序的特点进行解决 思路: m代表A初始时有效元素的个数,n代表B中元素的个数,那么n+m才是A的总长度 从A的最后一个位置开始,设为cur,分别 ...
- 前端H5,点击选择图片控件,图片直接在页面上展示~
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python学习记录_IPython基础,Tab自动完成,内省,%run命令_
这是我第一次写博客,之前也有很多想法,想把自己所接触的,以文本的形式储存,总是没有及时行动.此次下定决心,想把自己所学,所遇到的问题做个记录共享给诸位,与此同时自己作为备忘,感谢各位访问我的博 ...
- 读《Java并发编程的艺术》学习笔记(一)
接下来一个系列,是关于<Java并发编程的艺术>这本书的读书笔记以及相关知识点,主要是为了方便日后多次复习和防止忘记.废话不多说,直接步入主题: 第1章 并发编程的挑战 并发编程的目的是 ...
- Java继承中构造器的调用原理
Java的继承是比较重要的特性,也是比较容易出错的地方,下面这个例子将展示如果父类构造器中调用被子类重写的方法时会出现的情况: 首先是父类: public class test { void fun( ...
- 数据结构之HashMap
前言 在我们开发中,HashMap是我们非常常用的数据结构,接下来我将进一步去了解HashMap的原理.结构. 1.HashMap的实现原理 HashMap底层是基于Hash表(也称“散列”)的数据结 ...