Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Узнать о запущенных процессах как можно больше


Автор: SlaUr 12.11.2007, 09:15
Здраствуйте.

В прикрепленных файлах находятся исходники программ для получения информации о запущенных процессах.
Но меня интересует как получить путь к файлу процесса, который запущен (AVZ это умеет 
вернее он показывает не путь к файлу а коммандную строку (он даже показал что программа запущенна с определенными параметрами)).Как сие узнать?


И вообще что еще можно узнать о запущенных прцессах,кроме того что узнается в примерах приклепленных к топику.

Автор: MetalFan 12.11.2007, 09:39
Цитата(SlaUr @  12.11.2007,  09:15 Найти цитируемый пост)
как получить путь к файлу процесса

уже http://forum.vingrad.ru/forum/topic-151374/hl/getmodulefilenameex/index.html http://forum.vingrad.ru/forum/topic-131134/hl/getmodulefilenameex/index.html этот вопрос! в поиск.

Автор: SlaUr 12.11.2007, 13:25
Спасибо

Где искать GetModuleFileNameEx ? (компилятор ругается)
Подскажите а то самому долго искать.


Кстати насколько я понял это функция возращает путь а AVZ еще и показывает опции коммандной строки видимо она пользуется не этой функцией.


Автор: MetalFan 12.11.2007, 13:31
Цитата(SlaUr @  12.11.2007,  13:25 Найти цитируемый пост)
Где искать GetModuleFileNameEx ? 

PsAPI

Добавлено через 3 минуты и 59 секунд
Цитата(SlaUr @  12.11.2007,  13:25 Найти цитируемый пост)
еще и показывает опции коммандной строки

а вторую сылку смотрел?

Автор: SlaUr 12.11.2007, 14:41
Посмотрю попозже , спасибо

Я уже тоже нашел где эта функция и меня посетила идея сделать програму которая будет автоматически искать проседуры и функции (в delphi и в .dll) чтобы всем было проще.


Все таки вопрос остается открытым : что-то еще можно узнать о процессах кроме того что есть в прикрепленных файлов (сейчас еще добавилась возможность узнать путь) ?

Автор: MetalFan 12.11.2007, 14:50
Цитата(SlaUr @  12.11.2007,  14:41 Найти цитируемый пост)
что-то еще можно узнать о процессах кроме того что есть в прикрепленных файлов

не знаю, что там в "прикрепленных файлов", но узнать можно все, что сам процесс о себе знает. главное знать, где брать)

Автор: SlaUr 13.11.2007, 16:19
Попробовал 3 способа 

Код

unit pathproc ;
interface
uses    Windows, SysUtils,TlHelp32,PsAPI;
{  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,myproc2, StdCtrls, ExtCtrls,mysys,mystr,tlhelp32,PsAPI;}
type
 TModuleArray = array of TModuleEntry32;
// Возвращает список описаний (TModuleEntry32) модулей по идентификатору процесса

Function PidProc2Path(Pid:word):string;
Function HandleProc2Path(wnd:tHandle):string;

implementation

Function HandleProc2Path(wnd:tHandle):string;
var pid:word;
begin
GetWindowThreadProcessId(Wnd,@Pid);
Result:=PidProc2Path(pid);
end;

function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray;
var
 hSnapshot : THandle;
 lpme : TModuleEntry32;

 procedure AddModuleToList;
   begin
     SetLength(Result,High(Result)+2);
     Result[high(Result)]:=lpme;
   end;

begin
 SetLength(Result,0);
 hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessId);
 if hSnapshot=-1 then
   RaiseLastWin32Error;
 lpme.dwSize:=SizeOf(lpme);
 if Module32First(hSnapshot,lpme) then
   begin
     AddModuleToList;
     while Module32Next(hSnapshot,lpme) do
       AddModuleToList;
   end;
end;


Function PidProc2Path(Pid:word):string;
var  modarr : TModuleArray;i:integer;
     hHandle:THandle;
DW,StrAddr:dWord;GCL:cardinal;
NumWriteRead:cardinal;
str:string;
begin
str:='';
Result:='';

hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, PID);
GCL:=Cardinal(GetProcAddress(GetModuleHandle('kernel32.dll'),'GetCommandLineA'));
        if GCL<>0 then
            begin
              if ReadProcessMemory(hHandle,Pointer(GCL+1),@DW,4,NumWriteRead)and(NumWriteRead=4)and
              ReadProcessMemory(hHandle,Pointer(DW),@StrAddr,4,NumWriteRead)and(NumWriteRead=4) then
             begin
              SetString(Result, nil, MAX_PATH);
              if ReadProcessMemory(hHandle,Pointer(StrAddr),@Result[1],Length(Result),NumWriteRead) then
                begin
                   SetLength( Result,Pos(#0, Result)-1);
                end else   Result:='';
             end;
            end;
str:=str+result+'|';

modarr:=GetModulesListByProcessId(Pid);
 for i:=0 to High(modarr) do
   begin
     if Integer(modarr[i].modBaseAddr)=$400000 then
       begin
         Result:=modarr[i].szExePath;
         break;
       end;
  end;
str:=str+result+'|';

Result:='';
SetLength (Result, MAX_PATH);
hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, PID);
if hHandle<>0 then
 begin
  if GetModuleFileNameEx (hHandle, 0, PChar (Result), MAX_PATH) > 0 then
    SetLength (Result, StrLen (PChar (Result)));
 end;

str:=str+result+'|';

result:=str;

end.


Не один из них  не показал путь к системному процессу CSRSS.EXE
Некий ALG.EXE тоже не показал (третий вариант показал мусор - "tNЌ") 
Один из SVCHOST.EXE тоже не виден путь.

видимо есть еще какие-то варианты получения пути потому что AVZ показывает все.


Автор: dumb 13.11.2007, 16:59
включи 'SeDebugPrivilege' с помощью этой функции: http://forum.vingrad.ru/index.php?showtopic=105008&view=findpost&p=799225

Автор: Rennigth 13.11.2007, 17:30
Цитата(dumb @  13.11.2007,  16:59 Найти цитируемый пост)
включи 'SeDebugPrivilege' с помощью этой функции: http://forum.vingrad.ru/index.php?showtopi...st&p=799225

Ага, сам сталкивался... или если без,то информацию излекать через SystemQueryInfomation.

Автор: MetalFan 13.11.2007, 21:41
Цитата(Rennigth @  13.11.2007,  17:30 Найти цитируемый пост)
через SystemQueryInfomation.

имелось ввиду NtQuerySystemInformation ?

Автор: Ak47black 13.11.2007, 22:16
У Rouse_, на сайте есть пример неплохой про процессы http://rouse.drkb.ru/winapi.php#taskmon
Называется 
Цитата

Информация о процессах.


Автор: SlaUr 14.11.2007, 07:13
Цитата

 на сайте есть пример неплохой про процессы http://rouse.drkb.ru/winapi.php#taskmon

Так он (и еще один пример) и находится в прикрепленных файлах.В этом примере и применяется NtQuerySystemInformation,как я ни пытался информацию об запускающем файле мне получить не удалось.


dumb, Спасибо помогло.
Кстати интересно что к процессам SMSS.EXE,CSRSS.EXE путь показывает только 3 способ в моем примере (см.выше) .

Удачи.


Автор: Rennigth 14.11.2007, 11:13
Цитата(MetalFan @  13.11.2007,  21:41 Найти цитируемый пост)
имелось ввиду NtQuerySystemInformation ? 

Nt или Zw

Автор: Rouse_ 14.11.2007, 14:29
Цитата(SlaUr @  12.11.2007,  10:15 Найти цитируемый пост)
Но меня интересует как получить путь к файлу процесса

WMI позволяет отобразить как путь к процессу так и параметры командной строки.

Автор: SlaUr 14.11.2007, 14:59
Окончательный вариант модуля
(обьедены 2 способа получения пути)
2й способ показывает путь всегда , зато первый показывает параметры коммандной строки.
Код

unit pathproc ;
interface
uses  Windows,SysUtils,PsAPI;
Function PidProc2Path(Pid:word):string;
Function HandleProc2Path(wnd:tHandle):string;

implementation


function SetPrivilege(aPrivilegeName: string; aEnabled: boolean ): boolean;
var
 TPPrev, TP: TTokenPrivileges;
 hToken: THandle;
 dwRetLen: DWord;
begin
 Result:= False;
 OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
 TP.PrivilegeCount:=1;
 if (LookupPrivilegeValue(nil, PChar(aPrivilegeName), TP.Privileges[0].LUID)) then
   begin
     if (aEnabled) then TP.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED
     else TP.Privileges[0].Attributes:=0;
     dwRetLen:=0;
     Result:=AdjustTokenPrivileges(hToken,False,TP, SizeOf(TPPrev), TPPrev,dwRetLen);
   end;
 CloseHandle(hToken);
end;




Function HandleProc2Path(wnd:tHandle):string;
var pid:word;
begin
GetWindowThreadProcessId(Wnd,@Pid);
Result:=PidProc2Path(pid);
end;


Function PidProc2Path(Pid:word):string;
var   hHandle:THandle;
GCL:cardinal;DW,StrAddr:dWord;
NumWriteRead:cardinal;
st1:string;
begin
Result:='';
SetPrivilege('SeDebugPrivilege',True);

//начало 1 способа
hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ{PROCESS_ALL_ACCESS}, True, PID);
if hHandle<>0 then
begin
GCL:=Cardinal(GetProcAddress(GetModuleHandle('kernel32.dll'),'GetCommandLineA'));
        if GCL<>0 then
            begin
              if ReadProcessMemory(hHandle,Pointer(GCL+1),@DW,4,NumWriteRead)and(NumWriteRead=4)and
              ReadProcessMemory(hHandle,Pointer(DW),@StrAddr,4,NumWriteRead)and(NumWriteRead=4) then
             begin
              SetString(St1, nil, MAX_PATH);
              if ReadProcessMemory(hHandle,Pointer(StrAddr),@St1[1],Length(St1),NumWriteRead) then
                begin
                   SetLength( St1,Pos(#0, St1)-1);
                end else   St1:='';
             end;
            end;
end;
Result:=Result+st1+'|';
St1:='';
//начало 2 способа
hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ{PROCESS_ALL_ACCESS}, True, PID);
if hHandle<>0 then
 begin
  SetLength (St1, MAX_PATH);
  if GetModuleFileNameEx (hHandle, 0, PChar (St1), MAX_PATH) > 0 then
    SetLength (St1, StrLen (PChar (St1))) else St1:=''
 end;
//убираем мусор
While(length(St1)>0)and((St1[1]='?')or(St1[1]='\')) do Delete(St1,1,1);
Result:=Result+st1;


SetPrivilege('SeDebugPrivilege',False);
end;



end.




Rouse_, разбираться с WMI пока некогда , цель достигнута и меня она устраивает.Но спасибо еще за одно направление (я немного прочитал про WMI и заинтересовался тем что можно очень много узнать о "железе",буду иметь ввиду)

Добавлено через 20 мин:
Нашел запускаемый файл на основе WMI так вот ко многим процессам путь не показывает.
Вот этот файл (с исходниками) http://www.delphikingdom.com/zip/wmi.zip
И статья которую я бегло прочитал http://www.delphikingdom.com/asp/viewitem.asp?catalogid=698 (ссылка на wmi.zip в конце статьи)

Автор: RamIreZz 10.3.2008, 15:38
Сам парился над этим около двух дней и вот, что у получилось:

Код

unit main;

interface

uses
  Windows, SysUtils, Classes, Forms, Tlhelp32, PSAPI, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure GetProcessList(var sl: TStrings);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.GetProcessList(var sl: TStrings);
var
  ProcHandle: THandle; //дескрипторы процесса и снимка
  mh: hmodule; //дескриптор модуля
  procs: array[0..$FFF] of dword; //массив для хранения дескрипторов процессов
  count, cm: Cardinal; //количество процессов
  i: integer;
  ModName: array[0..max_path] of char; //имя модуля
begin
  sl.Clear;
  begin
    if not EnumProcesses(@procs, sizeof(procs), count) then
    begin
      exit;
    end;
    for i := 0 to count div 4 - 1 do
    begin
      ProcHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        false, procs[i]);
      if ProcHandle > 0 then
      begin
        EnumProcessModules(ProcHandle, @mh, 4, cm);
        GetModuleFileNameEx(ProcHandle, mh, ModName, sizeof(ModName));
        sl.Add(string(ModName));
        CloseHandle(ProcHandle);
      end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);

var
  tmp: TStrings;
begin
  tmp := memo1.Lines;
  GetProcessList(tmp);
end;

end.


Работает на 100%, проверял не раз.

Автор: ivan219 10.3.2008, 22:35
Цитата(RamIreZz @  10.3.2008,  15:38 Найти цитируемый пост)
Работает на 100%, проверял не раз.

Враки уменя он 24 процеса показал а на самом деле 32 кде ещё 8 штук ааааа.
И ещё что это такое:
Код

?
\SystemRoot\System32\smss.exe
\??\C:\WINDOWS\system32\winlogon.exe

Что за вопросы?

Автор: MetalFan 11.3.2008, 12:04
Цитата(ivan219 @  10.3.2008,  22:35 Найти цитируемый пост)
Что за вопросы? 

наверное потому что пора уже потихоньку на юникод переходить)))

Автор: labvictx 30.7.2011, 23:49
Плиз, братва, профи, помогите с примером smile , как узнать список запущенных процессов на удаленном компе, на Delphi???? Весь инет уже как месяц лажу smile  нет не чего стоящего 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)