◀ANSI版開発トップへ
  • 4586 VC8アプリをWin95で動作させる
    • 4589 Re:VC8アプリをWin95で動作させる
      • 4591 Re2:VC8アプリをWin95で動作させる
        • 4592 Re3:VC8アプリをWin95で動作させる
          • 4594 Re4:VC8アプリをWin95で動作させる
        • 4593 Re3:VC8アプリをWin95で動作させる
  • [4586] VC8アプリをWin95で動作させる ryoji 2006年09月21日 00:18

    >>dev:4259 より
    > VS2005 でコンパイルすると、Release 設定でも Kernel32.dll の IsDebuggerPresent() を参照しにいくようになるため、Win95 では動作しなくなります。

    裏技があるようです。

    http://jet.breeze.jp/program/tips/forceimp.htm

    | 以下のコードを自分のソースファイルに入れるだけです。
    | EXTERN_C BOOL WINAPI _imp__IsDebuggerPresent(void)
    | { return FALSE; }
    | ※ ソースファイルが C の場合は、EXTERN_C は不要です。

    だそうな。

    ちょっとやってみたら確かに Win95 でも動きました。
    • [4589] Re:VC8アプリをWin95で動作させる げんた 2006年09月23日 11:53

      ▼ ryojiさん
      > http://jet.breeze.jp/program/tips/forceimp.htm
      > ちょっとやってみたら確かに Win95 でも動きました。
      これで問題が無くなるなら,リリース版もVS2005でbuildしたほうが良いですよね.
      現在はVS2003 Toolkitでbuildしているのですが,ライブラリがシングルスレッドしか無いというのも(今のところは問題ないですが)ちょっと気になってますし.
      • [4591] Re2:VC8アプリをWin95で動作させる ryoji 2006年09月23日 19:03

        > これで問題が無くなるなら,リリース版もVS2005でbuildしたほうが良いですよね.
        C ランタイムの中から IsDebuggerPresent() が呼ばれるようにデバッガから設定して動かしてみたところ、自前の _imp__IsDebuggerPresent() には来ないでぜんぜん違う場所(メモリ内容 ?? になっている場所)にすっ飛んで行ってしまいました。
        逆アセンブルでは自前関数への正しいアドレスを指しているように見えるのですが...
        ちょっとわけがわかりません。
        IsDebuggerPresent()が呼ばれるのは、異常を自己検出した場合なので正常動作している間は問題無さそうですが、ちょっと妖しいですね。

        > 現在はVS2003 Toolkitでbuildしているのですが,ライブラリがシングルスレッドしか無いというのも(今のところは問題ないですが)ちょっと気になってますし.
        自分のところの Toolkit にはマルチスレッド版も入ってますけど?
        libcmt.lib : C マルチスレッド、静的リンク
        libcpmt.lib : C++ マルチスレッド、静的リンク
        • [4592] Re3:VC8アプリをWin95で動作させる ジェット 2006年09月24日 01:24

          > http://jet.breeze.jp/program/tips/forceimp.htm
          の記事を書いた当事者です。

          | EXTERN_C BOOL WINAPI _imp__IsDebuggerPresent(void)
          | { return FALSE; }

          だけでは問題があることを、こちらでも確認しました。

          理由としては、もともと「__imp__IsDebuggerPresent@0」(装飾済み)は関数ではなく変数であり、例えば CRT が IsDebuggerPresent を呼び出す、invarg.c 171行目

          | wasDebuggerPresent = IsDebuggerPresent();

          では、アセンブラは「変数 __imp__IsDebuggerPresent@0」から関数アドレスを取得して実行していることが分かりました。

          そこで新しい回避コードを作成しました。上記のページに更新してあるのでそちらを利用してください。なお、新しいコードは Windows 95 でもテスト(呼び出しテスト)をしているので大丈夫だと思われます。

          お手数かけますがよろしくお願いします。
          • [4594] Re4:VC8アプリをWin95で動作させる ryoji 2006年09月24日 01:50

            ▼ ジェットさん
            うわ、当事者さんが現れてくださるとは。
            4593とすれ違い(汗)

            > そこで新しい回避コードを作成しました。上記のページに更新してあるのでそちらを利用してください。なお、新しいコードは Windows 95 でもテスト(呼び出しテスト)をしているので大丈夫だと思われます。
            このコードはちょっと強引ですね...
            いや、同様のをたまにやることありますけど。σ(^^;
        • [4593] Re3:VC8アプリをWin95で動作させる ryoji 2006年09月24日 01:35

          > 逆アセンブルでは自前関数への正しいアドレスを指しているように見えるのですが...

          正しくなかったです。
          _imp__IsDebuggerPresent() の先頭にある4バイトが 33 C0 C3 8B で、8BC3C033 に飛んでる。
          処理として実行されるつもりの箇所は実は間接コールのアドレスとして扱われるところなのでした。