WOW64上での挙動

実はこのコードは、WOW64上の32bitバイナリでは、WOW64のプロセスのコマンドラインしかとれない。というのも、相手プロセスが64bitだった場合、NtQueryInformationProcess(ProcessBasicInformation)が失敗する。冷静に考えれば分かるけど、PVOIDとかを含んでいる構造体である以上、sizeof(PROCESS_BASIC_INFORMATION)が変わってしまうのだから当たり前だ。逆に言えば、WOW64のプロセスでは正常に動作していることが不思議なぐらいだ。

そう思っていたのだけれども、現実はもうちょっと複雑らしい。実は、NtQueryInformationProcessは失敗していない。PebBaseAddressのゼロチェックをやっているのが裏目に出ているらしい。その証拠に、GetLastErrorは0を返すし、UniqueProcessIdには正しいプロセス番号が入っている。どうやら、NtQueryInformationProcessには、WOW64用の対策がなされているようだ。ただし、64bitのプロセスでは、PEBは、かなり上位のアドレスにあり(今回調べた感じでは、7FFFFFDB000h)、正直なところ、32bitのプロセスではこのアドレスがとれないし、とれたところで、ReadProcessMemoryできない。結局、どうしようもない。