差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

blog:2011:0414-1407 [2016/02/15 18:45] (現在)
ライン 1: ライン 1:
 +**<fs 130%>​2011年4月14日</​fs>​**
 +
 +====== falcnvrtを64bitビルド ======
 +せっかく64bit環境な訳だし64bit版を作るべくVC2010EE+WindowsSDK7.1環境で設定してビルドをポチっと。\\
 +出るわ出るわwarningの山。\\
 +ただsize_tが64bit値になっているせいで出ているのが大半で後はDWORD_PTR系程度で簡単にビルド完了。\\
 +UNICODEも有効にしてたけどもともとTCHARベースで開発してたおかげでこれまた問題なし。\\
 +とりあえず簡単な動作テストはクリアして拍子抜け・・・
 +
 +===== デバッグ関数 =====
 +ただ一つだけ懸念していたのがデバッグ関数。\\
 +イース6とフェルガナのconfig.exeから画像抽出するのにデバッグ関数使っていたのが案の定ダメ。\\
 +ブレークポイントに引っかからずに起動してしまう。\\
 +64bitプロセスから32bitプロセスをデバッグ起動してすんなりいく訳は無いわな。
 +
 +==== IMAGE_NT_HEADERS ====
 +まず IMAGE_NT_HEADERS の ImageBase を利用していたのだが32bit仕様だと\\
 +<code c>
 +typedef struct _IMAGE_OPTIONAL_HEADER {
 +//  ~略~
 +    DWORD   ​AddressOfEntryPoint;​
 +    DWORD   ​BaseOfCode;​
 +    DWORD   ​BaseOfData;​
 +    DWORD   ​ImageBase;​
 +    DWORD   ​SectionAlignment;​
 +//  ~略~
 +} IMAGE_OPTIONAL_HEADER32,​ *PIMAGE_OPTIONAL_HEADER32;​
 +</​code>​
 +なのが64bit仕様だと\\
 +<code c>
 +typedef struct _IMAGE_OPTIONAL_HEADER64 {
 +//  ~略~
 +    DWORD       ​AddressOfEntryPoint;​
 +    DWORD       ​BaseOfCode;​
 +    ULONGLONG ​  ​ImageBase;​
 +    DWORD       ​SectionAlignment;​
 +//  ~略~
 +} IMAGE_OPTIONAL_HEADER64,​ *PIMAGE_OPTIONAL_HEADER64;​
 +</​code>​
 +となってて ImageBase が BaseOfData とくっついてULONGLONGに・・・\\
 +IMAGE_OPTIONAL_HEADER を IMAGE_OPTIONAL_HEADER32 と明示的に宣言するようにしてこの問題は解決。
 +
 +==== Get/​SetThreadContext ====
 +しかしまだブレークポイントで止まらない。\\
 +色々調べてると64bitアプリから32bitアプリ(WOW64で動作)のものに対しては、\\
 +[[http://​msdn.microsoft.com/​en-us/​library/​ms680632%28v=VS.85%29.aspx|SetThreadContext]]じゃなく[[http://​msdn.microsoft.com/​en-us/​library/​ms681668%28v=VS.85%29.aspx|Wow64SetThreadContext]]を使えばいいらしい?<​fs 80%>​(日本語の情報が無い・・・)</​fs>​\\
 +そこでブレークポイント設定関数を\\
 +<code c>
 +BOOL SetBreakPoint32(HANDLE hThread, DWORD dwAddress)
 +{
 + CONTEXT ctx = { CONTEXT_DEBUG_REGISTERS };
 + GetThreadContext( hThread, &ctx );
 + ctx.Dr0 = dwAddress;
 + ctx.Dr7 |= 0x00000001;
 + return SetThreadContext( hThread, &ctx );
 +}
 +</​code>​
 +<code c>
 +BOOL SetBreakPoint64(HANDLE hThread, DWORD dwAddress)
 +{
 + WOW64_CONTEXT ctx = { WOW64_CONTEXT_DEBUG_REGISTERS };
 + Wow64GetThreadContext( hThread, &ctx );
 + ctx.Dr0 = dwAddress;
 + ctx.Dr7 |= 0x00000001;
 + return Wow64SetThreadContext( hThread, &ctx );
 +}
 +</​code>​
 +として#​ifdef _WIN64で切り替えて使うように変更。\\
 +ビルドして試してみると無事ブレークポイントで止まるように!
 +
 +===== 完成 =====
 +これで一応falcnvrtの64bit版は完成。\\
 +公開はどうしようかな。
 +
 +===== あとがき =====
 +ただ[[http://​msdn.microsoft.com/​en-us/​library/​ms681668%28v=VS.85%29.aspx|Wow64SetThreadContext]]って対応OSがVista以降なんだけどXP64bit版はどうするんだ?\\
 +XPの64bit版も32bitアプリはWOW64で動作のはずだけどこのAPI使えないよなぁ。
 +
 +
 +{{tag>​falcnvrt プログラム}}
 +
 +
 +~~DISCUSSION~~
  
blog/2011/0414-1407.txt · 最終更新: 2016/02/15 18:45 (外部編集)
CC Attribution-Noncommercial-Share Alike 3.0 Unported
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0