FSX 在 Windows 8 下啟動時崩潰
嘗試在Windows 8下執行**Microsoft Flight Simulator X *(豪華版,帶 Service Pack 1)***在啟動時遇到崩潰:
而 FSX 確實可以在 Windows 7 上執行。
- 有人在 Windows 8 下嘗試過 FSX 嗎?
- FSX 是否適用於 Windows 8 下的任何人?
- 有人在 Windows 8 下得到錯誤嗎?
- 有沒有人在 Windows 8 下修復了這個錯誤?
- 有誰知道這是否是 Windows 8 下的已知問題?
補充說明
- 嘗試在 Windows XP 和 Windows 7兼容模式下執行
- 嘗試以管理員身份執行(即 Windows XP 兼容模式)
- 是雙 DVD 的全新安裝
- 我一直在嘗試獲取故障轉儲,所以我可以開始調試它,但是在 Windows 8 中獲取故障轉儲是一件非常痛苦的事情
- 帶有媒體中心的 Windows 8 專業版,64 位
技術資訊
我得到的錯誤非常常見(Bing for simprop c0000005)。審核日誌顯示粗略的錯誤詳細資訊,訪問衝突(錯誤程式碼
C0000005
)在simprop.dll
.在調試器下執行 FSX 向我展示了實際問題:
*** ERROR: Symbol file could not be found. Defaulted to export symbols for D:\Games\Microsoft Flight Simulator X\simprop.dll - eax=0274e8e0 ebx=02bc4f58 ecx=530ca1df edx=0274ed90 esi=00000010 edi=00000008 eip=20c46da7 esp=000cf250 ebp=000cf26c iopl=0 nv up ei pl nz ac po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010212 simprop!SimPropertySymbols_LoadFromFile+0x1d17: 20c46da7 3b0f cmp ecx,dword ptr [edi] ds:002b:00000008=????????
問題是
edi
要解決的問題0x08
。當它嘗試進行比較時:cmp ecx,[edi]
它因試圖讀取地址 0x00000008 的訪問衝突(錯誤程式碼 0xc0000005)而崩潰。
試圖對程式碼進行逆向工程,我想出了:
simprop.20C4A6A0(Arg1, Arg2, Arg3, Arg4) { ... eax = Arg2.Method10(Arg2); //Method10 returns 0x08, the source of the AV eax = TheCrashingCall(eax); //pass the bad address ... } simprop.Method10(Arg1); { //return Arg1.28.30 + 8; eax = Arg1 ecx = eax+28^ eax = ecx+30^ //eax+30^ is nil (i.e. 00000000) return eax+8 //this is the source of the invalid 0x08 value //null+8 = 00000008 //Later on we will try to access that address. //It seems that Arg1 points to an object //Arg1.Offset28.Offset30 is null //and the code never checks that Arg1.Offset28.Offset30 is null //before dereferencing it } simprop.TheCrashingCall(Arg1) { ... //if (Arg1 == something) eax = Arg1^ edi = EAX ecx = EDI^ cmp ecx,[edi] ... }
黑客修復
我能夠做的是修改
simprop.dll
,以便如果 Arg1 無效,則將其null. The code in
設為 TheCrashingCallalready detects
null` 參數並且什麼都不做:simprop.TheCrashingCall(Arg1) { ... if (Arg1 == 0x00000008) //<---added fix Arg1 = null; if (Arg1 != null) { if (Arg1 == something) { eax = Arg1^ edi = EAX ecx = EDI^ cmp ecx,[edi] ... } } }
下一步
我得到的印像是,查看堆棧跟踪,這
simprop.dll
是一個重新發明的 XML 解析器(所謂的*“AceParser”*)。這將表明 FSX 附帶的 xml 文件之一,例如:
- 支持動畫.xml
- propautogen.xml
- 道具材料.xml
- proplaunch.xml
- 道具.xml
- propui.xml
不是解析器所期望的;或者可能是與他們的解析器使用的作業系統中的某些東西的版本兼容性。真正的解決方法是找出導致問題的 XML 文件的哪一部分、原因和解決方法。
無論哪種方式,程式碼似乎都
nil
錯誤地引用了一個指針。Object1 { dword offset0; dword offset4; dword offset8; ... Object2 offset28; } Object2 { dword offset0; dword offset4; dword offset8; ... Object3 offset30; //is sometimes null, causing AV } Object3 { dword offset0; dword offset4 dword offset8; //code tries to access junk }
這樣當我們訪問
object1.offset30.offset8
我們得到一個 AV。我想確定 Object1 是否是標準的 Windows COM 對象(例如 MS XML DOMDocument)
這並不能真正解決您的問題,但是我已經在 Windows 8 上執行了一段時間 fsx,一切執行良好,它偶爾會給我帶來致命錯誤,但只有當我將設置推得太高時;)
確保您安裝了兩個 SP,它們可以在此處找到: SP1和 SP2。那裡還有更多關於它們的資訊以及它們的錯誤修復。
另外,請嘗試刪除 fsx 系統資料庫項(先查看它,以免弄亂您的系統)。某處有一個密鑰(不記得在哪裡,抱歉),您可以刪除它,它應該可以解決問題。