ただいまテスト中 : 掲示板
このフォームからは投稿できません。
name
e-mail
url
subject
comment

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 ファイル一覧 検索 過去ログ

■28 / 親記事)  Navin'Youのバグ修正方法
  
□投稿者/ AERO -(2007/05/19(Sat) 23:26:47)
http://hp.vector.co.jp/authors/VA038157/
    いまさら利用価値のほとんど無い情報かと思いますが...

    Navin'You(PCQ-NYH5とPCQ-NY55DUG)には「GPS/ルートガイド機能設定においてSONY Corp.IPS-5000 SERIESを指定してシリアル通信ポート(IPS-5100G等)にアクセスするとCPU 使用率が 100 % になる」現象が見られます。

    この現象はSonyIPS.dllの欠陥(必要なコードの欠落)により発生していると思われます。

    Serial device monitorを使用して、Navin'You(SonyIPS.dll)がアクセスしているシリアル通信ポートをモニターするとすぐに分かるのですが、IOCTL_SERIAL_GET_COMMSTATUSが異常に短い周期で呼び出されています。(CPU使用率100%の原因)
    IOCTL_SERIAL_GET_COMMSTATUSは、ClearCommError APIの呼び出しにより発生しますので、「受信データの有無をポーリングしているプログラムループ内にSleep APIの呼び出しが欠落している」ことが容易に想像できます。典型的で稚拙なバグだと思われます(^^;

    そこでSonyIPS.dllがClearCommError API呼び出す時に欠陥部分を補完するコードを挿入します。
    補完するコードの挿入方法は一般にAPIフックと呼ばれる手法を使うのが局所的で簡単です。

    1)kernel32.dllをラップするdllを作成してClearCommError = dummy_ClearCommErrorの呼び出し時に以下のコードで補完する。

    BOOL WINAPI dummy_ClearCommError( HANDLE hFile, LPDWORD lpErrors, LPCOMSTAT lpStat )
    {
    BOOL retv = ::ClearCommError( hFile, lpErrors, lpStat );
    if( retv )
    {
    if( lpStat->cbInQue == 0 )
    Sleep( 50 );
    }
    return retv;
    }

    2)SonyIPS.dllのImport Name Tableの名前(kernal32.dll)を1)のファイル名に変更する。
    3)SonyIPS.dllと同じディレクトリに1)のdllを配置する。
    以上

    No16,22で示した補完方法はKernel modeで動作するDriver内で補完するコードを実行すると言う方法なのですが、この方法だと欠陥等無いまともなプログラムでも補完するコードが実行されてしまうため、没としました。

引用返信 削除キー/
■38 / ResNo.1)  Re[1]: Navin'Youのバグ修正方法
□投稿者/ popo -(2007/08/24(Fri) 13:07:03)
    こんにちは、いつも非常に参考にさせていただいています。
    わたしも長い間この問題に困り果て、AERO様の方法を参考にがんばってみたのですがAPIフック攻略できずどうしても完成できませんでした。
    お忙しいとは存じますが修正DLLをUPいただけると助かります。
    どうぞよろしくお願いします。

引用返信 削除キー/
■39 / ResNo.2)  補完用DLL
□投稿者/ AERO -(2007/08/25(Sat) 17:15:41)
http://hp.vector.co.jp/authors/VA038157/
    popoさん、こんにちは。

    No28の1)のDLLをここに置いておきます。

    ※ご使用に当たっては添付のソフトウエア使用許諾契約書に同意していただく必要があります。

_ernel32.zip
/37KB
引用返信 削除キー/
■40 / ResNo.3)  Re[3]: 補完用DLL
□投稿者/ popo -(2007/08/26(Sun) 03:29:17)
    ありがとうございました!
    完璧です。長い間の苦悩の日々から開放されました、本当にありがとうございました。
    差し支えなければ私のどこがが悪かったのかご教授願えませんでしょうか?
    全然違うでも結構ですし、かすっていましたらご指摘いただけると幸いです。

    lernel32.cppの
    //__declspec( naked ) void WINAPI d_ClearCommError() { _asm{ jmp p_ClearCommError } }

    __declspec( dllexport ) BOOL WINAPI d_ClearCommError() { _asm{ jmp p_ClearCommError } }

    BOOL WINAPI dummy_ClearCommError(**

    BOOL WINAPI d_ClearCommError(**
    としてcppの最後に追加

    .net2005でコンパイルしました

引用返信 削除キー/
■41 / ResNo.4)  Re[4]: 補完用DLL
□投稿者/ AERO -(2007/08/26(Sun) 14:28:30)
http://hp.vector.co.jp/authors/VA038157/
    2007/08/26(Sun) 14:35:57 編集(投稿者)

    .DEFファイルによる明示的EXPORTS指定が有効かどうかを確認されてはいかがでしょうか?


引用返信 削除キー/
■42 / ResNo.5)  Re[5]: 補完用DLL
□投稿者/ popo -(2007/08/27(Mon) 23:21:01)
    ご指導ありがとうございました。
    確かにDEFファイルにも思い当たる思いがあります。
    そもそも基本がわかっていないのが最大の原因ですので勉強します。
    ご親切に教えていただきありがとうございました。

引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 ファイル一覧 検索 過去ログ

- Child Tree Antispam Version -