Registriert seit: 3. Sep 2004
4.629 Beiträge
Delphi 10.2 Tokyo Starter
|
AW: Dienste und PID?
3. Aug 2015, 18:41
Ja klar, die Prozesspfade hat das System selbstverständlich. Ich werde das gleich selbst mal testen. Bei mir zumindest liegt die cdrom.sys allerdings an genau der genannten Stelle (C:\Windows\system32\drivers\cdrom.sys).
Mein nicht optimierter, auf die Schnelle zusammengeschusterter Testcode:
Delphi-Quellcode:
procedure PrintServicePaths(IncludeDrivers, IncludeInactive: Boolean);
type
ENUM_SERVICE_STATUSW = record
lpServiceName: LPWSTR;
lpDisplayName: LPWSTR;
ServiceStatus: SERVICE_STATUS_PROCESS;
end;
PENUM_SERVICE_STATUSW = ^ENUM_SERVICE_STATUSW;
var
SvcMgr,
Svc: SC_HANDLE;
SvcType,
SvcState,
SizeNeeded,
ServiceCount: DWord;
Services,
Service: PENUM_SERVICE_STATUSW;
I: Integer;
Config: PQueryServiceConfigW;
begin
SvcMgr :=
OpenSCManager(nil, nil, SC_MANAGER_CONNECT or SC_MANAGER_ENUMERATE_SERVICE);
if (SvcMgr <> 0) then
try
SvcType := SERVICE_WIN32;
if (IncludeDrivers) then
begin
SvcType := SERVICE_WIN32 or SERVICE_DRIVER;
end;
SvcState := SERVICE_ACTIVE;
if (IncludeInactive) then
begin
SvcState := SERVICE_STATE_ALL;
end;
if not EnumServicesStatusExW(SvcMgr, SC_ENUM_PROCESS_INFO, SvcType,
SvcState, nil, 0, @SizeNeeded, @ServiceCount, nil, nil) then
begin
if (GetLastError <> ERROR_MORE_DATA) then
begin
RaiseLastOsError;
end;
end;
GetMem(Services, SizeNeeded);
try
if not EnumServicesStatusExW(SvcMgr, SC_ENUM_PROCESS_INFO, SvcType,
SvcState, PByte(Services), SizeNeeded, @SizeNeeded, @ServiceCount,
nil, nil) then
begin
RaiseLastOsError;
end;
Service := Services;
for I := 0 to ServiceCount - 1 do
begin
WriteLn(Format('[%4d] %s', [Service^.ServiceStatus.dwProcessId,
Service^.lpServiceName]));
Svc :=
OpenService(SvcMgr, Service^.lpServiceName, SERVICE_QUERY_CONFIG);
if (Svc <> 0) then
try
if not QueryServiceConfig(Svc, nil, 0, SizeNeeded) then
begin
if (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
begin
RaiseLastOsError;
end;
end;
GetMem(Config, SizeNeeded);
try
if not QueryServiceConfig(Svc, Config, SizeNeeded, SizeNeeded) then
begin
RaiseLastOsError;
end;
WriteLn(' Path: ' + Config^.lpBinaryPathName);
finally
FreeMem(Config);
end;
finally
CloseServiceHandle(Svc);
end else RaiseLastOsError;
Inc(Service);
end;
finally
FreeMem(Services);
end;
finally
CloseServiceHandle(SvcMgr);
end else RaiseLastOsError;
end;
Erhalte für laufende Prozess wie erwartet eine PID, für Treiber und inaktive Prozesse 0. Die Pfade habe ich stichprobenartig überprüft und die stimmen auch soweit.
Geändert von Zacherl ( 3. Aug 2015 um 19:25 Uhr)
|