2000/XPのサウンドレコーダーのバグ、僅か2バイトの修正で改善することが判明
サウンド レコーダーで .wav ファイルの録音時にエラー メッセージ "メモリ不足のためこの操作を実行できません" が表示される
2 GB を超える RAM が搭載されたコンピュータでサウンド レコーダーを使用して .wav ファイルを録音するときに、次のエラー メッセージが表示されます。
メモリ不足のためこの操作を実行できません。Windows アプリケーションをいくつか終了して空きメモリ領域を増やしてから、再実行してください。 注 : この問題は、空きメモリの容量が 2 GB を超える場合にのみ発生します。 原因 この問題は、サウンド レコーダーの仕様上の制限が原因で発生します。内部のマルチメディアの問題によるものではありません。 状況 マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。 |
アホですか・ω・!
と思ったのでちょっと解析してみた
call [KERNEL32.dll!GlobalMemoryStatus] mov edi,[ebp-14h] mov eax,00100000h cmp edi,eax jge L01007836 mov edi,eax |
GlobalMemoryStatus 関数
を使って、メモリ比較時にエラーにとんでいる。
4GB を超えるメインメモリを実装したコンピュータでは、GlobalMemoryStatus 関数は誤った情報 を返す可能性があります。Windows 2000 は、-1 という値を使ってオーバーフローを表します。Windows NT の従来のバージョンは、実際のメモリに対する 4GB の剰余( たとえば 5GB の場合、剰余は 1GB)を返します。この理由により、Windows 2000 では代わりに GlobalMemoryStatusEx 関数を使ってください。 |
あれ? -1返すのなら、比較しても問題ないんじゃね?
L01007836: push [L01017984] push [L0101825C] call SUB_L01007733 add eax,edi cmp esi,eax jle L0100787B cmp dword ptr [ebp+10h],00000000h |
実際のコード unsigned int じゃなくて intで メモリ比較
メモリサイズが負になることはないんだから、 unsigned int でいいんじゃね?
と書き換えてみたところ・・・
動きました…。
2400秒前後まで増やせるようになったよ・ω・
日本語版
WindowsLU-KB957495-v2-JPN.wlu
English version
WindowsLU-KB957495-v2-INTL.wlu
とりえず置いときます
XP/2000にインストール可能
変更方法は該当箇所のJLE命令をJBE命令に書き換えるということですね。
変更箇所はGlobalMemoryStatus関数が使われているところの後ろで、
2箇所あってはバイナリでいうと(7EXX837D1000で検索)
7E17→7617
7E2E→762E
2ヶ所ですね。計2バイト。