Kommt drauf an, was du genau wissen willst.
Es gibt noch sowas wie NtQueryProcessInformation
oder einfach direkt mit ausprobieren:
Delphi-Quellcode:
procedure ListProcessIDsNT;
var i: DWord;
dwProcess: DWord;
dwPriv: DWord;
begin
SetDebugPrivilege(SE_PRIVILEGE_ENABLED,dwPriv);
for i := 0 to High(Word) div 4 do
begin
dwProcess := OpenProcess(PROCESS_ALL_ACCESS,false,i*4);
if (dwProcess <> 0) then
begin
CloseHandle(dwProcess);
Writeln(i*4);
Writeln(GetExeFileNameAExNT(i*4));
end;
end;
//Writeln(GetExeFileNameAExNt(FindProcess('explorer')));
SetDebugPrivilege(dwPriv);
ReadLn;
end;
mit dem richtigen Wissen kommst so auch an die Dateinamen usw. Ich bastel mir gerade selbst was schönes wie z.b.
Delphi-Quellcode:
function GetExeFileNameAExNt(dwProcessID: DWord): String; stdcall;
var
PEB : TPEBNT;
dwProcessID2: DWord;
LdrData : TLdrData;
dwRead : DWord;
ModuleEntry : TModuleEntry;
begin
Result := '';
dwProcessID2 := OpenProcess(PROCESS_ALL_ACCESS,False,dwProcessID);
if (dwProcessID2 <> 0) then
dwProcessID := dwProcessID2;
if ReadProcessMemory(dwProcessID,Pointer($7FFDF000),@PEB,SizeOf(TPEBNT),dwRead) and
(dwRead = SizeOf(TPEBNT)) then
begin
if (PEB.pLdrData = nil) then
ReadProcessMemory(dwProcessID,Pointer(PEB.pEventLogSection),@PEB,SizeOf(TPEBNT),dwRead);
if (ReadProcessMemory(dwProcessID,PEB.pLdrData,@LdrData,SizeOf(TLdrData),dwRead)) and (dwRead = SizeOf(TLdrData)) then
begin
if (ReadProcessMemory(dwProcessID,LdrData.InLoadOrderModuleList,@ModuleEntry,SizeOf(TModuleEntry),dwRead)) and
(dwRead = SizeOf(TModuleEntry)) then
Result := ReadPWideChar(dwProcessID,ModuleEntry.ModuleName);
end;
end;
if (dwProcessID2 <> 0) then
CloseHandle(dwProcessID);
end;
Aber mehr gibts von mir zur Zeit nicht dazu, da gerade alle Funktionen für 9x und NT nachbaue ;>
für die, die es unter NT mal testen wollen:
http://uall.overclock.ch/public/GetExeFileNameAEx.exe