no way to compare when less than two revisions

差分

このページの2つのバージョン間の差分を表示します。


blog:2011:0414-1407 [2016/02/15 18:45] (現在) – 作成 - 外部編集 127.0.0.1
行 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 · 最終更新: by 127.0.0.1
CC Attribution-Noncommercial-Share Alike 3.0 Unported
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0