教えてください。次のリンクのソースコードを見ています。ここでわからない行があるので教えてください。


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);

以上、よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/03/19 17:31:09
  • 終了:2012/03/23 20:51:49

回答(1件)

id:hissssa No.1

hissssa回答回数423ベストアンサー獲得回数1272012/03/19 17:49:21

ポイント100pt

このソースでは、hModにはGetModuleHandle()ないしLoadLibrary()で得られるハンドル情報が入っていますが、このハンドル情報とは実際にはメモリにロードされたモジュールの先頭アドレスです。
そして、pImpDescのメンバーには、ロードされたモジュールの詳細情報についての、先頭アドレスからの相対アドレス値(バイト単位)が格納されています。
よって、hModの示すアドレス+pImpDescのメンバーが示す相対アドレスの値は、pImpDescのメンバーの情報についての実アドレスを表す事になります。

hModはHMODULE型ですが、これをバイト単位のアドレスとして明確に扱うために、まず最初に(BYTE *)でキャストします。そこにpImpDesc->Nameの値を加えることで、このName情報への実アドレスとなります。最後にその結果を(LPSTR)でキャストすることで、目的である「Name文字列へのポインタ」が得られるわけです。

id:mai_mai_mail

仰るとおりですね。ありがとうございます。このhModの示すアドレス+pImpDescはOriginalFirstThunkからたどってImage thunk Dataに格納されているアドレスと同じものなのでしょうか。

2012/03/19 18:02:32

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません