http://dsas.blog.klab.org/archives/50908743.html
以下はモジュール名を代入しています。mModはハンドルです。そして(BYTE*)をつけて、かつ、pImpDesc->Nameと足しています。どうして(BYTE*)hModとするのでしょうか。この行がやっていることをおしえてもらってもいいですか。
LPSTR pszModName = (LPSTR)((BYTE*)hMod + pImpDesc->Name);
ここでも同じように出てきています。
pImpByName = (IMAGE_IMPORT_BY_NAME*)
((BYTE*)hMod+ pThunkINT->u1.AddressOfData);
以上、よろしくお願いします。
このソースでは、hModにはGetModuleHandle()ないしLoadLibrary()で得られるハンドル情報が入っていますが、このハンドル情報とは実際にはメモリにロードされたモジュールの先頭アドレスです。
そして、pImpDescのメンバーには、ロードされたモジュールの詳細情報についての、先頭アドレスからの相対アドレス値(バイト単位)が格納されています。
よって、hModの示すアドレス+pImpDescのメンバーが示す相対アドレスの値は、pImpDescのメンバーの情報についての実アドレスを表す事になります。
hModはHMODULE型ですが、これをバイト単位のアドレスとして明確に扱うために、まず最初に(BYTE *)でキャストします。そこにpImpDesc->Nameの値を加えることで、このName情報への実アドレスとなります。最後にその結果を(LPSTR)でキャストすることで、目的である「Name文字列へのポインタ」が得られるわけです。
仰るとおりですね。ありがとうございます。このhModの示すアドレス+pImpDescはOriginalFirstThunkからたどってImage thunk Dataに格納されているアドレスと同じものなのでしょうか。
2012/03/19 18:02:32