掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
プロセスのベースアドレスの取得のしかた (ID:49069)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
先日、以下のスレッドで、プロセスの列挙についてアドバイスをいただきましたが、 そこで列挙されたプロセスをファイルとして保存するプログラムを作成したいと思っています。 https://www.petitmonte.com/bbs/answers?question_id=8828 先ずは、先日のスレッドの中でもご紹介いただいた、Mr.XRAY様の以下のサンプルを参考に、 ListViewのOnDoubleClicに以下のコードを追加しました。 [06_Toolhelp32Snapshot を使用したプロセスの列挙でフルパスを取得] http://mrxray.on.coocan.jp/Delphi/plSamples/330_AppProcessList.htm#06 procedure TForm1.ListView1DblClick(Sender: TObject); var str : string; int : integer; pnt : pointer; pmc : PPROCESS_MEMORY_COUNTERS; cb : Integer; hProcHandle : THandle; begin int := listview1.ItemIndex; selected := strtoint(ListView1.Items[int].SubItems[0]); str := ListView1.Items[int].Caption; str := ExtractFileName(str); cb := SizeOf(_PROCESS_MEMORY_COUNTERS); GetMem(pmc, cb); pmc^.cb := cb; hProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, selected); GetProcessMemoryInfo(hProcHandle, pmc, cb); FreeMem(pmc); pnt := GetModuleBaseAddress(hProcHandle ,str); if pnt = nil then showmessage('unko'); end; そして、そこから呼び出されるベースアドレスの取得関数GetModuleBaseAddressを、 以下の通り追加しました。 function GetModuleBaseAddress(PHandle: Thandle; MName: String): Pointer; var Modules : Array of HMODULE; cbNeeded, i : Cardinal; ModuleInfo : TModuleInfo; ModuleName : Array[0..MAX_PATH] of Char; Pandle : THandle; begin Result := nil; SetLength(Modules, 1024); cbNeeded := 0; if (PHandle <> 0) then begin try EnumProcessModules(PHandle, @Modules[0], 1024 * SizeOf(HMODULE),cbNeeded); except Exit; end; SetLength(Modules, cbNeeded div SizeOf(HMODULE)); if (Length(Modules) > 0) then begin for i := 0 to Length(Modules) - 1 do begin try GetModuleBaseName(PHandle, Modules[i], ModuleName, SizeOf(ModuleName)); if (Pos(MName, ModuleName) > 0) then begin GetModuleInformation(PHandle, Modules[i], @MoDuleInfo, SizeOf(ModuleInfo)); Result := ModuleInfo.lpBaseOfDll; Exit; end; Except end; end; end; end; end; しかし、Length(Modules)が常に0になるためループに入らず、結果Resultは毎回nilを返します。 EnumProcessModulesのPHandleの値が変化しても結果が変わらないので、呼び方が間違っている様なのですが、 MSDNのヘルプを読んでもどこが違うのか良く分かりません。どこが間違っているのでしょうか? OSは64bit Windows7 professional Delphiは7です。 Delphi 10.2でも試しましたが、結果は同じでした。 よろしくおねがいします。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.