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%> | ||
+ | |||
+ | ====== 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 | ||
+ | DWORD | ||
+ | DWORD | ||
+ | DWORD | ||
+ | DWORD | ||
+ | // ~略~ | ||
+ | } IMAGE_OPTIONAL_HEADER32, | ||
+ | </ | ||
+ | なのが64bit仕様だと\\ | ||
+ | <code c> | ||
+ | typedef struct _IMAGE_OPTIONAL_HEADER64 { | ||
+ | // ~略~ | ||
+ | DWORD | ||
+ | DWORD | ||
+ | ULONGLONG | ||
+ | DWORD | ||
+ | // ~略~ | ||
+ | } IMAGE_OPTIONAL_HEADER64, | ||
+ | </ | ||
+ | となってて ImageBase が BaseOfData とくっついてULONGLONGに・・・\\ | ||
+ | IMAGE_OPTIONAL_HEADER を IMAGE_OPTIONAL_HEADER32 と明示的に宣言するようにしてこの問題は解決。 | ||
+ | |||
+ | ==== Get/ | ||
+ | しかしまだブレークポイントで止まらない。\\ | ||
+ | 色々調べてると64bitアプリから32bitアプリ(WOW64で動作)のものに対しては、\\ | ||
+ | [[http:// | ||
+ | そこでブレークポイント設定関数を\\ | ||
+ | <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 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 ); | ||
+ | } | ||
+ | </ | ||
+ | として# | ||
+ | ビルドして試してみると無事ブレークポイントで止まるように! | ||
+ | |||
+ | ===== 完成 ===== | ||
+ | これで一応falcnvrtの64bit版は完成。\\ | ||
+ | 公開はどうしようかな。 | ||
+ | |||
+ | ===== あとがき ===== | ||
+ | ただ[[http:// | ||
+ | XPの64bit版も32bitアプリはWOW64で動作のはずだけどこのAPI使えないよなぁ。 | ||
+ | |||
+ | |||
+ | {{tag> | ||
+ | |||
+ | |||
+ | ~~DISCUSSION~~ | ||