Welcher (64-Bit-?)Prozeß hat denn 32-Bit-Module geladen, hhhuut und ggf. auch die anderen?
Du hast das glaube ich ein wenig falsch verstanden. Es geht darum, dass wenn ich die EXE mit obenstehender Prozedur als 32bit compiliere, dann zeigt das Programm, wenn ich einen 32bit-Prozess auswähle, alle geladenen Module an. Wenn ich einen 64bit-Prozess auswähle, dann zeigt es nichts an, da 32bit Programme nicht berechtigt sind, in irgendeiner Weise mit 64bit Programmen zu interagieren.
Wenn ich mein Programm mit obenstehender Prozedur allerdings als 64bit compiliere, dann zeigt das Programm bei einem ausgewählten 64bit-Prozess alle geladenen Module an, bei einem 32bit Prozess allerdings nichts, da es in diesem Fall nur nach 64bit-Modulen sucht, die es bei einem reinen 32bit-Prozess ja nicht gibt. Um meinem 64bit-Programm also zu sagen, dass es auch nach geladenen 32bit-Modulen schauen soll, sodass ich auch bei 32bit-Prozessen die geladenen Module angezeigt bekomme, brauche ich die zusätzliche Konstante "TH32CS_SNAPMODULE32".
Die gesamte Prozedur für 64bit sieht also folgendermaßen aus:
Delphi-Quellcode:
procedure ListProcessModules(cThreadID: Cardinal; var SL: TStringList);
var
Snapshot: THandle;
Module: TModuleEntry32;
begin
Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE Or TH32CS_SNAPMODULE32, cThreadID);
if (Snapshot <> 0) and (Snapshot <> INVALID_HANDLE_VALUE) then
begin
try
ZeroMemory(@Module, SizeOf(TModuleEntry32));
Module.dwSize := SizeOf(TModuleEntry32);
if Module32First(Snapshot, Module) then
repeat
SL.Add(StrPas(Module.szModule));
until not Module32Next(Snapshot, Module);
finally
CloseHandle(Snapshot);
end;
end;
end;