我当时大概想了一下觉得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
为什么EXE不能超过4GB
我当时大概想了一下觉得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