ERROR_INVALID_ADDRESS

とある事情があってWinsockのフックDLLを作る。


たぶん一番まっとうなやり方はSPIを作ってかませるやり方だと思うが、作ったことがないし環境もないので諦めて泥臭いやり方で。
ws2_32.dllという名前のDLLを作って、ローカルディレクトリに置き、本来のAPIをバイパスする。


ws2_32.dllがエクスポートするほぼ全てのAPIのスタブを書き、その中からGetProcAddressで取得した本来のws2_32.dllのAPIを呼び出す。
Platform Builder環境だったらws2_32.libが手に入るので全部のスタブを書かなくても、フックしたい関数だけ書いてws2_32.libにリンクするだけでいいので楽なんだけどなぁ。defファイルでエクスポート名だけ置き換えればいい。


さて作るまでは良かったのだが、実行すると何故かLoadLibraryでエラーになる。GetLastErrorしてみると、487(ERROR_INVALID_ADDRESS)が返ってくる。初めて見るエラーだ…
ググっても直接参考になりそうな情報は出てこなかったが、色々な情報を総合するとおそらくロード時に仮想アドレス空間内での再配置とかで問題があったと予想される。


結局、リンカのベースアドレス指定をデフォルトの 0x00001000 から 0x00010000 に変更したらエラーがなくなった。なんとなくはわかるけど、詳しい原因は未だによくわからない…
同じファイル名で同じベースアドレスの(パスだけが異なる)DLLをロードするとカーネルがちゃんとアドレス解決してくれないということなのだろうかね。