Windows-8

FSX 在 Windows 8 下啟動時崩潰

  • July 19, 2014

嘗試在Windows 8下執行**Microsoft Flight Simulator X *(豪華版,帶 Service Pack 1)***在啟動時遇到崩潰:

在此處輸入圖像描述

而 FSX 確實可以在 Windows 7 上執行。

  • 有人在 Windows 8 下嘗試過 FSX 嗎?
  • FSX 是否適用於 Windows 8 下的任何人?
  • 有人在 Windows 8 下得到錯誤嗎?
  • 有沒有人在 Windows 8 下修復了這個錯誤?
  • 有誰知道這是否是 Windows 8 下的已知問題?

補充說明

技術資訊

我得到的錯誤非常常見(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設為 TheCrashingCall already detectsnull` 參數並且什麼都不做:

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,它們可以在此處找到: SP1SP2。那裡還有更多關於它們的資訊以及它們的錯誤修復。

另外,請嘗試刪除 fsx 系統資料庫項(先查看它,以免弄亂您的系統)。某處有一個密鑰(不記得在哪裡,抱歉),您可以刪除它,它應該可以解決問題。

引用自:https://gaming.stackexchange.com/questions/105888