为什么EXE不能超过4GB

前几天看到大家在讨论EXE装载的问题,很新奇。有的说PE装载受到进程空间的限制,有的说PE一定是整体装入,有的用ZIP自解压包来举例子。

我当时大概想了一下,觉得PE不一定是要整体装入的。PE文件包含一个PE header,里面定义了各个段,比如代码,资源等等的偏移地址,装载的时候应该不会超出这个PE header的定义。也就是说,如果PE header里面定义了最远的段是10M,但是PE文件有100M的话,应该最多只有10M装载。

于是我写了一个程序来测试下。首先写一个简单的C++的helloworld。然后随便在硬盘上找了个700M左右的A片,然后执行下面的命令把这两个文件拼合起来成为一个新的EXE:

copy /B helloworld.exe /B + 常盘みちる.avi /B largepe.exe /B

然后运行这个largepe.exe, 一切正常。在debugger中加载这个largepe.exe后发现,这个module占据的内存空间和helloworld一样,并没有包avi那部分。

所以我在想,既然是这样的话,我可以把很大的数据放到exe文件后面,然后在exe的实现里面来分段读取这些数据,实现自我播放自我解压之类的。为了再次证明这一点,我用dxshow写了一个简单的播放程序,然后用同样的办法拼接了一个4G多的高清版本。运行,发现:

不能运行。说这个是invalid win32 application。

好吧,由此看来,自解压文件不超过4G的确还是有原因的。但是原因到底是什么呢,难道真的和4GB内存空间相关么?于是我换了个64位的机器,运行,发现:

不能运行。说这个是invalid win32 application。

哦,原来64位的机器也不能运行超过4GB的EXE啊,那看来和什么进程内存空间没太大关系了吧。但是原因到底是什么呢,我拿debugger跟到失败前的最后一个API,发现是ZwCreateSection,这个API调用失败并且返回STATUS_INVALID_FILE_FOR_SECTION。额,这里已经超出我的知识范围了,于是就去讨论组问专家,专家Pavel说:

"
SECTION_IMAGE_INFORMATION structure contains a ULONG ImageFileSize field. If we allow files larger than 4 GB, programs that use this structure may break, and that can potentially affect 3rd party apps because all this information is on the web, even though the structure and the APIs using it are not officially documented.

(Note that this is separate from the image size in the PE headers, which is also a ULONG and is currently limited to slightly less than 2 GB.)

--by Pavel
"

原来是这样啊~~~

PS, 附上文SECTION_IMAGE_INFORMATION的结构定义:

http://www.nirsoft.net/kernel_struct/vista/SECTION_IMAGE_INFORMATION.html

typedef struct _SECTION_IMAGE_INFORMATION
{
     PVOID TransferAddress;
     ULONG ZeroBits;
     ULONG MaximumStackSize;
     ULONG CommittedStackSize;
     ULONG SubSystemType;
     union
     {
          struct
          {
               WORD SubSystemMinorVersion;
               WORD SubSystemMajorVersion;
          };
          ULONG SubSystemVersion;
     };
     ULONG GpValue;
     WORD ImageCharacteristics;
     WORD DllCharacteristics;
     WORD Machine;
     UCHAR ImageContainsCode;
     UCHAR ImageFlags;
     ULONG ComPlusNativeReady: 1;
     ULONG ComPlusILOnly: 1;
     ULONG ImageDynamicallyRelocated: 1;
     ULONG Reserved: 5;
     ULONG LoaderFlags;
     ULONG ImageFileSize;
     ULONG CheckSum;
} SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION;

转载于:https://www.cnblogs.com/lixiong/archive/2010/07/13/1776284.html

为什么EXE不能超过4GB相关推荐

  1. u盘无法复制文件进去_U盘无法复制超过4GB的大文件怎么办?

    相信许多朋友经常通过U盘复制文件来转移数据,但可能会碰到下面的情况:U盘上明明还有大于4GB的空间,但只要复制超过4G大小的文件就提示文件太大而无法复制,是什么问题呢?该如何解决?下面IT技术资料分享 ...

  2. 如何使32位Win7支持超过4GB的内存,而不装64位

    如何使32位Win7支持超过4GB的内存 让32位系统支持更大的内存超过4G [情况参数:] PC: 联想商用台式机,M4350 RAM: 1600, DDR3 , 2GB OS: Win7 专业版 ...

  3. U盘独个文件不能超过4GB的原因——U盘的文件系统

    U盘独个文件不能超过4GB的原因--文件系统 一 背景 1.1 文件系统 1.2 "簇"/"群集" 1.3 文件系统的历史 1.3.1 FAT 1.3.2 ex ...

  4. U盘无法传输并存放超过4GB文件

    U盘无法传输并存放超过4GB文件 问题描述 当你使用U盘拷贝一个文件时,如果出现以下报错信息: 问题分析: 原因是你使用的U盘,它的文件系统是FAT32的:是无法传输或者存放4GB以及以上容量的单个文 ...

  5. 如何用xshell上次超过4GB的文件到虚拟机

    背景: windows本地有个8G左右的centos镜像,我想上传到虚拟机做个本地yum源,然后做集群用.用lrzsz上次提示文件超过4GB不能传.如下图所示: 解决办法如下: 1.我windows装 ...

  6. php 文件大小超出,PHP文件大小超过4Gb

    我正在运行Synology NAS服务器, 我正在尝试使用 PHP来获取文件的文件大小. 我正在尝试找到一个能够成功计算4Gb文件大小的函数. 文件大小($文件);仅适用于文件< 2Gb spr ...

  7. 破解32位NT6内核系统(vista/win7 8G以上)的内存限制,完美支持4GB至128GB内存,全新教程!

    注意:执行本修改后可能在屏幕右下角出现,"测试模式 内部版本 7601"等字样,请勿试图使用"bcdedit /set testsigning off"命令修复 ...

  8. win7下4GB内存提示:找到4GB,可用2GB的解决方法--让你的win7支持4G内存

    今天我给自己的本本扩展了一下内存,但是发现在系统信息中提示"找到4GB,可用2GB"的怪异信息,百度了很久终于悟出了其中的奥妙,在新浪的一篇技术文章中,找到了解决方法,下面是该文章 ...

  9. mac 怎么查找大于200m的文件_U盘无法拷贝大于4GB的文件怎么办?

    相信在经常使用U盘的用户手中,都会或多或少的存有几个U盘,有时候如果我们需要重装系统的时候,就会发现下载的系统居然无法拷贝到U盘当中,这究竟是怎么回事呢? U盘主要有三种格式: FAT32: 缺点:单 ...

最新文章

  1. 数学建模——层次分析法Python代码
  2. [javaSE] 多线程(join方法)
  3. 下坠的小鸟(flappy bird)速算版
  4. boost::math::arcsine用法的测试程序
  5. 面试官让我说出2种@Transactional注解的失效场景,我一口气给他说了六种
  6. javascript历史、作用、三大组成、javascript代码书写位置、注意事项、变量
  7. 【JS】最简单的域名防红方法,QQ/微信打开网站提示浏览器打开
  8. TypeScript 2.0开启空值的严格检查
  9. 【Java从0到架构师】日志处理 - SLF4J、Logback、Log4j 2.x
  10. Using Cobbler Web Interface
  11. [回顾]事件对象——event
  12. enspar启动失败40_适合烘焙新手第一次做的芝士面包,简单易上手,好吃松软零失败...
  13. java mvc接收 时间_Springmvc 如何接收java8的时间localDateTime。
  14. python地理数据处理库geopy
  15. Luogu P1119 灾后重建 【floyd】By cellur925
  16. linux系统日志设置
  17. 7-33 统计素数并求和
  18. 微信小程序图片上传组件
  19. 关键词作用和选择技巧
  20. 读《格鲁夫给经理人的第一课》

热门文章

  1. dos 一行两条命令
  2. 使用DPM 2010备份还原Exchange2010单个邮箱
  3. VS2005 解决应用程序配置不正确,程序无法启动问题
  4. 【转贴】PLSQL不安装客户端连接远程oracle
  5. ppt 的局部分大功能软件介绍.ZoomIt
  6. Android中如何使控件保持固定宽高比
  7. 理解微信小程序Wepy框架的三个事件交互$broadcast,$emit,$invoke
  8. Leetcode643.Maximum Average Subarray I子数组的最大平均数1
  9. CentOS 7下安装Logstash ELK Stack 日志管理系统(上)
  10. HTML5新增标签的汇总与详解