Win2000/XPは5コア以上のCPUをDirectXで扱うとクラッシュするバグがある

副題 吉里吉里Zの解析 その2

結局 DirectX の d3d9.dllにパッチを当てることにしたんだけど、調べてる途中で、えらいモノ見つけてしまった。

Windows Server 2003 または Windows XP を実行しているコンピューターに 5 つ以上のコアまたは 4 つを超える論理プロセッサがある場合に、アプリケーションでアクセス違反が発生し、クラッシュする。

どうやら、論理コアの判定ができない Windows 2000は アップデート対象外(バグはある)らしい。

しかたないんで、吉里吉里Zのパッチを兼ねたアップデートを作ることにした。

ダウンロードは WLU で Windows 2000/XP Multi(More than 4 processors)DirectX Hotfix(KB953028)ってのを探してね|・ω・)

 SUB_L4B6DF588:
          call    [d3d8thk.dll!OsThunkDdLockD3D]
          jmp    L4B6DF593
 L4B6DF593:
          int3
 SUB_L4B6DF594:
          call    [d3d8thk.dll!OsThunkDdLock]
          jmp    L4B6DF59F

パッチの内容。
まず、d3d8thk.dll の OsThunkDdLock の後にエラー処理追加。

 L4B7EB549:
          cmp    dword ptr [ebp-14h],80004005h
          jnz    L4B690567
          and    dword ptr [L4B7EC034],00000000h
          jmp    L4B690567

ドライバエラーが発生した場合に L4B7EC034 の値を 0x10000000から 0に書き換える

 L4B6903E9:
          test    ah,ah
          jns    L4B6903F6
          mov    ecx,[L4B7EC034]
          mov    [ebp-0Ch],ecx
 L4B6903F6:

もともとここは ecx に強制的に 0x10000000 を代入してたんだけど、これを未使用の L4B7EC034 のアドレス参照に書き換えて、ここから呼び出すようにした。

一度 D3DERR_DRIVERINTERNALERROR が発生したら そのプロセスでは、D3DLOCK_NO_DIRTY_UPDATE フラグを強制的に使用しないようにするという処理。

kkz4
おおきく澄みわたる、あの宇宙へ――|メインページ
このソフトの先行体験版が吉里吉里Zで作られていたので試してみた所うまくいった ・ω・

吉里吉里Zで試しに動かしてみたが、quake命令使いまくりで止まる落とし穴。しばらくは吉里吉里2でいいか。
2015/3/05 23:41:56

公式さんの話によると、現行では、不具合が出てるので吉里吉里Zを使わず吉里吉里2に戻しているとのこと

(勝手に)吉里吉里Z移行ガイド

吉里吉里Zでは、Window.setLayerPos()が削除された。このため、この関数を使っていた
KAGの[quake]は、利用できなくなってしまった(使うとエラーで止まる)。
正直、同人屋としてはかなりキツい。
吉里吉里の開発版の方覗いてみたら、KAGEXと同じような方法でプライマリレイヤを動かさないようにして対応しようとしてるみたい。カツモクして待て!

かなりたってるけど、対応してないらしい。

なんで削除されたかというと、Windows 8でちゃんと動作しないから互換性のために消したっポイ。
|。・ω・) 。o ( Windows 8使えないやつだ )

パッチあてた、D3D9.DLLは一応、XP向け(魔改造版 Windows 2000で使ってる奴)なので、古いのを使ってて、人柱怖いって、人は、アップデートを展開して、 実行ファイルのある場所にコピーして、 実行ファイル.local って空っぽのファイルを作って起動してみるとテストで動作させることが可能。

krkrz_w2k.cab
Windows 2000向けに対応させてコンパイルしたのがこちら。
未確認だけど、魔改造なしでも動くかも

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です