文件映射(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在程序运行后由加载程序隐式的载入, ...
随机推荐
- 脸书VS微软,为何“老年创业者”更担忧AI失控?
作为互联网行业最知名的大会之一,近日举行的微软Build 2017大会,却增加了与以往不同的"调味品".除了新技术.智能硬件.系统.平台之外,微软CEO纳德拉在大会上对科技带给人类 ...
- MHRD_Guide
@(Steam蒸汽动力)[MHRD|Game|How To] [CH]游戏解决方案 1.解决方案将作为完整的代码呈现,部分结决方案将有理论分析或图解. 2.根据记录板判断,解决方案远非理想. 3.慎重 ...
- Ta说:2016微软亚洲研究院第二届博士生论坛
"聚合多元人才创造无尽可能,让每一位优秀博士生得到发声成长机会"可以说是这次微软亚洲研究院博士生论坛最好的归纳了.自去年首次举办以来,这项旨在助力青年研究者成长的项目迅速得到了 ...
- C++走向远洋——22(项目一,三角形,类)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanjiaoxing.cpp * 作者:常轩 * 微信公众号: ...
- 一篇文章带您读懂List集合(源码分析)
今天要分享的Java集合是List,主要是针对它的常见实现类ArrayList进行讲解 内容目录 什么是List核心方法源码剖析1.文档注释2.构造方法3.add()3.remove()如何提升Arr ...
- 线程状态,BLOCKED和WAITING有什么区别
线程可以通过notify,join,LockSupport.park方式进入wating状态,进入wating状态的线程等待唤醒(notify或notifyAll)才有机会获取cpu的时间片段来继续执 ...
- 随手撸一个简单的带检查的printf
#include <stdio.h> #include <iostream> #include <vector> #include <string> # ...
- 先导篇:SpringCloud介绍篇
1.什么是SpringCloud Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载 ...
- LeetCode 81.Search in Rotated Sorted Array II(M)
题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...
- 第二章、 Vue 起步
2-2.编写hello world 首先创建vue实例,然后实例接收一些配置项,el表示实例负责管理的区域,data表示区域内的数据 两秒后内容变为bye world 其中app表示实例对象,$dat ...