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 でいいんじゃね?
と書き換えてみたところ・・・

snd

動きました…。
2400秒前後まで増やせるようになったよ・ω・

日本語版
WindowsLU-KB957495-v2-JPN.wlu
English version
WindowsLU-KB957495-v2-INTL.wlu

とりえず置いときます
XP/2000にインストール可能

おすすめ

1件の返信

  1. ちゅーりっぷ より:

    変更方法は該当箇所のJLE命令をJBE命令に書き換えるということですね。
    変更箇所はGlobalMemoryStatus関数が使われているところの後ろで、
    2箇所あってはバイナリでいうと(7EXX837D1000で検索)
    7E17→7617
    7E2E→762E
    2ヶ所ですね。計2バイト。

コメントを残す

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