为什么EXE不能超过4GB
為什么EXE不能超過4GB
?
前幾天看到大家在討論EXE裝載的問題,很新奇。有的說PE裝載受到進程空間的限制,有的說PE一定是整體裝入,有的用ZIP自解壓包來舉例子。
?
我當時大概想了一下,覺得PE不一定是要整體裝入的。PE文件包含一個PE header,里面定義了各個段,比如代碼,資源等等的偏移地址,裝載的時候應該不會超出這個PE header的定義。也就是說,如果PE header里面定義了最遠的段是10M,但是PE文件有100M的話,應該最多只有10M裝載。
?
于是我寫了一個程序來測試下。首先寫一個簡單的C++的helloworld。然后隨便在硬盤上找了個700M左右的A片,然后執(zhí)行下面的命令把這兩個文件拼合起來成為一個新的EXE:
?
copy /B helloworld.exe /B + 常盤みちる.avi /B largepe.exe /B
?
然后運行這個largepe.exe, 一切正常。在debugger中加載這個largepe.exe后發(fā)現(xiàn),這個module占據(jù)的內(nèi)存空間和helloworld一樣,并沒有包avi那部分。
?
所以我在想,既然是這樣的話,我可以把很大的數(shù)據(jù)放到exe文件后面,然后在exe的實現(xiàn)里面來分段讀取這些數(shù)據(jù),實現(xiàn)自我播放自我解壓之類的。為了再次證明這一點,我用dxshow寫了一個簡單的播放程序,然后用同樣的辦法拼接了一個4G多的高清版本。運行,發(fā)現(xiàn):
?
不能運行。說這個是invalid win32 application。
?
好吧,由此看來,自解壓文件不超過4G的確還是有原因的。但是原因到底是什么呢,難道真的和4GB內(nèi)存空間相關(guān)么?于是我換了個64位的機器,運行,發(fā)現(xiàn):
不能運行。說這個是invalid win32 application。
?
哦,原來64位的機器也不能運行超過4GB的EXE啊,那看來和什么進程內(nèi)存空間沒太大關(guān)系了吧。但是原因到底是什么呢,我拿debugger跟到失敗前的最后一個API,發(fā)現(xiàn)是ZwCreateSection,這個API調(diào)用失敗并且返回STATUS_INVALID_FILE_FOR_SECTION。額,這里已經(jīng)超出我的知識范圍了,于是就去討論組問專家,專家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的結(jié)構(gòu)定義:
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;
轉(zhuǎn)載于:https://www.cnblogs.com/lixiong/archive/2010/07/13/1776284.html
總結(jié)
以上是生活随笔為你收集整理的为什么EXE不能超过4GB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几大出版社
- 下一篇: windows nt service 框