**2011年4月14日** ====== 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仕様だと\\ typedef struct _IMAGE_OPTIONAL_HEADER { // ~略~ DWORD AddressOfEntryPoint; DWORD BaseOfCode; DWORD BaseOfData; DWORD ImageBase; DWORD SectionAlignment; // ~略~ } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; なのが64bit仕様だと\\ typedef struct _IMAGE_OPTIONAL_HEADER64 { // ~略~ DWORD AddressOfEntryPoint; DWORD BaseOfCode; ULONGLONG ImageBase; DWORD SectionAlignment; // ~略~ } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64; となってて 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]]を使えばいいらしい?(日本語の情報が無い・・・)\\ そこでブレークポイント設定関数を\\ BOOL SetBreakPoint32(HANDLE hThread, DWORD dwAddress) { CONTEXT ctx = { CONTEXT_DEBUG_REGISTERS }; GetThreadContext( hThread, &ctx ); ctx.Dr0 = dwAddress; ctx.Dr7 |= 0x00000001; return SetThreadContext( hThread, &ctx ); } 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 ); } として#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~~