内容へ移動
ぽかんらぼ@DokuWiki
現在位置:
Top
»
Blog
»
2011年
»
falcnvrtを64bitビルド
文書の表示
管理
サイトマップ
ログイン
検索
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
**<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~~
文書の表示
以前のリビジョン
メディアマネージャー
文書の先頭へ