[新しく発言をつくる] [HPへ戻る] [『ファンタシースターオンライン』 裏シークレットBBS]

エセ!先月のPSOはどうって事なかったろ? の続きの続きの続き

  エセ!先月のPSOはどうって事なかったろ? の続きの続きの続き 道場主 2014/09/01 01:56:38 
  改造!先月のPSOはどうって事なかったろ? 道場主 2014/10/01 08:27:01 
  │└続き。 道場主 2014/10/01 08:28:57  (修正1回)
  │ └続き。 道場主 2014/10/01 08:30:54 
  │  └続き。 道場主 2014/10/01 08:32:26  (修正2回)
Re: 続き。 [返事を書く]
続き。

09/30、
PhotoShop 3.0.5Jのパッチ作成を継続。
動作をトレースしてみると、
KERNEL32.GlobalMemoryExを呼んだ時に、
INVALID_PARAMETERエラーが出てるらしい。つまり、引数が間違ってるって事?
どうやら調べてみると、GlobalMemoryStatusExの構造体内のdwLengthで、
構造体自体のサイズを指定して渡さないといけないらしい。
しかもこの構造体、GlobalMemoryStatusの32バイト構造体と違って、
64バイトになっているという……。
dwLengthが20h(32)で渡されてたのがエラーの原因っぽい。

ちなみに、
MSDNの日本版にはロクな情報が無いという、いつも通りの役に立たなさ(笑)。

で、パラメータを40h(64)にしてみると、
GlobalMemoryStatusExはちゃんと動作した。
が、構造体のサイズが違うので、
このままだと余剰の32バイト分のスタックを壊してしまう。

正常動作のためには、もうちょっと大きなパッチが必要かな……。

ところで、メモリ関連のチェックをしているルーチンで、
とんでもないバグが有るのを発見。

-----
005CFB2A 817C24 10 00000600 CMP DWORD PTR SS:[ESP+10],PHOTOSHP.00600000
005CFB32 0F8C C6000000 JL PHOTOSHP.005CFBFE
005CFB38 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
005CFB3C 034424 10 ADD EAX,DWORD PTR SS:[ESP+10]
005CFB40 3D 00004001 CMP EAX,1400000
005CFB45 0F8C B3000000 JL PHOTOSHP.005CFBFE
-----

実は、[ESP+10]が全物理メモリ量、[ESP+C]が使用可能ページファイル量で、
「物理メモリが約6MB以下か、物理メモリ+使用可能スワップファイルが
 約20MB以下の場合はメモリ不足判定」という事をやってる。

桁あふれも考えずに訳の分からん足し算をやってるのは、
まぁ当時はそんな大きなメモリ量のマシンを想定してないだろうから、
ともかくだけど(ほめられはしないけど)、
必要メモリ量判定の条件分岐がヒドい。
メモリ量がマイナスになる訳が無いんだから、
条件分岐は『JL』じゃなくて『JB』を使わなければ駄目。
ヒドいなぁ……。


続く。
** この記事は2回修正されてます 道場主 <olwlsovmys> 2014/10/01 08:32:26 [ノートメニュー]
  │   └続き。 道場主 2014/10/01 08:33:44  (修正1回)
  │    └続き。 道場主 2014/10/01 08:35:41 
  │     └続き。 道場主 2014/10/01 08:36:27 
  不条理!先月のPSOはどうって事なかったろ? 道場主 2014/11/01 05:36:43 
  時代が追い付いた!先月のPSOはどうって事な... 道場主 2014/12/01 07:07:18 

[『ファンタシースターオンライン』 裏シークレットBBS] [HPへ戻る]
新規発言を反映させるにはブラウザの更新ボタンを押してください。



[レンタルPHP] [無料小説] [DVD]