Für eins meiner Programme benütige ich eine Liste mit Prozessen (bzw. mit den Pfaden der Prozesse). Dazu hab ich ein Win9x Version (die wunderbar ohne Probleme arbeitet) und eine WinNT Version (auch für 2000 und XP). Die NT Version hat allerdings einige sonderbare Rückgabewerte. Unter allen Prozesspfaden (die einen korrekten Pfad liefern) werden auch follgende Werte zurückgeliefert:
| Zitat: |
\??\c:\windows\system32\csrss.exe
\??\c:\windows\system32\winlogon.exe
{keine Pfadangabe bei "system". Also leere Zeile.}
\systemroot\system32\smss.exe |
Was mich stört ist also ein mal der fehlende Pfad, zwei mal ein "\??\" vor dem Pfad und ein mal "\systenroot\" anstelle des Systempfades. Es ist natürlich kein Problem das zu beseitigen. Nur stelle ich mir die Fragen: Ist das normal? Was bedeuten z.B. die "\??\" vor dem Pfad? Gibts eine Möglichkeit die "normalen" Pfade direkt zu erhalten? Welche anderen Platzhalter (z.B. "\systemroot\") gibt es noch?
Wer meint etwas dazu sagen zu können?
Hier ist die Prozedur mit der ich die Liste sauge.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| uses PsApi, TlHelp32;
procedure CreateWinNTProcessList(List: TStrings); var PIDArray: array [0..1023] of DWORD; cb: DWORD; I: Integer; ProcCount: Integer; hMod: HMODULE; hProcess: THandle; ModuleName: array [0..300] of Char; begin EnumProcesses(@PIDArray, SizeOf(PIDArray), cb); ProcCount := cb div SizeOf(DWORD); for I := 0 to ProcCount - 1 do begin hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PIDArray[I]); if (hProcess <> 0) then begin EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb); GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName)); List.Add(AnsiLowerCase(ModuleName)); CloseHandle(hProcess); end; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin GetProcessList(ListBox1.Items); end; |