Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 29.04.03 14:20 
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.


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

_________________
Popov
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 29.04.03 16:12 
Sofern deine NT-Zielplattform nicht älter als Win2000 ist kannst du auch die ToolHelp-Funktionen nehmen..!

Zu deiner Funktion...
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
    if (hProcess <> 0) then begin 
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb); 
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName)); 
      List.Add(AnsiLowerCase(ModuleName)); 
      CloseHandle(hProcess); 
    end;

In diesem Fall brauchst du kein EnumProcessModules. Übergib an GetModuleFileNameEx statt hMod einfach 0.
MSDN hat folgendes geschrieben:
hModule
[in] Handle to the module whose path is being requested. If this parameter is NULL, GetModuleFileName retrieves the path for the current module.

Stammt zwar aus der Doku von GetModuleFileName, gilt aber auch für GetModuleFileNameEx.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 29.04.03 20:13 
Die tlhlp32 liefert die gleichen Ergebnisse, siehe meine SysInfo.

Die Frage ist ja, was sie bedeuten.
Popov Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 13.05.03 16:02 
Also irgendwie ist die Antwort noch immer nicht gekommen. Ich hab zwar das Problem gelöst in dem ich selbst im Pfad nach "\systemroot\" suche und es durch den Windowspfad ersetzte, aber das ist nur triksen. Es gibt noch andere Platzhalter für ander Pfade.

Da Windows es aber gerne selbst benutzt (die Platzhalter), so gehe ich davon aus, daß es eine Api-Funktion geben muß die die Pfade auflöst.

Zum Beispiel hab ich unter Windows XP solche Pfade gefunden:

%HOMEDRIVE%%HOMEPATH%
%SystemRoot%\explorer.exe

Also muß es eine Funktion geben die solche Pfade auflöst.

_________________
Popov
Burgpflanze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Windows2000 Prof. SP4
Delphi7 Enterprise
BeitragVerfasst: Mi 14.05.03 00:07 
unit Windows oder SysUtils : GetEnvironmentVariable
(Ist in beiden deklariert - unterschiedlich natürlich)


Gruss, Burgpflanze
mortus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mi 14.05.03 00:16 
vielleicht suchst du die funktion ExpandEnvironmentStrings