日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么EXE不能超过4GB

發布時間:2024/4/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么EXE不能超过4GB 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。