Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проверка наличия запущенного процесса по полному "пути к образу" / 9 сообщений из 9, страница 1 из 1
20.07.2017, 11:42:22
    #39492195
Q640
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия запущенного процесса по полному "пути к образу"
Необходимо определить запущен ли процесс, зная его "Путь к образу" (как это названо в Диспетчере Задач), то есть полный путь к файлу, например: C:\Windows\System32\calc.exe
Мне известен такой способ:

Код: pascal
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
function FindTask(ExeFullPath: String): Boolean;
var FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; ExeFile: String;
begin
Result:=False;
Log.Debug('Приступили к поиску >'+ExeFullPath+'<');
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (FSnapshotHandle<>INVALID_HANDLE_VALUE) then
    begin
    Log.Debug('Toolhelp32Snapshot успешно создан');
    FillChar(FProcessEntry32, SizeOf(FProcessEntry32), 0);
    FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);
    ExeFullPath:=AnsiUpperCase(Trim(ExeFullPath));
    if Process32First(FSnapshotHandle, FProcessEntry32) then
        begin 
        Log.Debug('Входим в цикл по процессам');
        repeat
            ExeFile:=FProcessEntry32.szExeFile;
            Log.Debug('Найдено: >'+ExeFile+'<');
            ExeFile:=AnsiUpperCase(Trim(ExeFile));
            if AnsiCompareText(ExeFullPath, ExeFile)=0 then
                begin
                Log.Debug('Совпало с искомым, поиск завершён');
                Result:=True;
                break;
                end
            else
                Log.Debug('Не совпало с искомым, продолжаем поиск...');
        until
            not Process32Next(FSnapshotHandle, FProcessEntry32);
        Log.Debug('Следующего нету, вышли из цикла по процессам');
        end
    else
        Log.Error('Process32First ничего не нашёл');
    if CloseHandle(FSnapshotHandle) then
        Log.Debug('Toolhelp32Snapshot успешно закрыт')
    else
        Log.Error('Закрытие Toolhelp32Snapshot провалилось');
    end
else
    Log.Error('Создание Toolhelp32Snapshot провалилось');
end;



Но тут проблема в том что сравнивается с TProcessEntry32.szExeFile, а оно содержит только имя файла, без пути (во всяком случае у меня на Win7).
Можно конечно впендюрить ExtractFileName(), но представим что у нас есть "calc.exe" в нескольких папках - и проверка будет работать некорректно.

Подскажите что-нибудь? Спасибо!
...
Рейтинг: 0 / 0
20.07.2017, 11:46:26
    #39492199
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия запущенного процесса по полному "пути к образу"
Q640Подскажите что-нибудь?
Мсдн молчит? https://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx
...
Рейтинг: 0 / 0
20.07.2017, 11:58:27
    #39492215
Q640
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия запущенного процесса по полному "пути к образу"
оу... Спасибо... Значит что теперь имеется?
* Использовать Module32First/Module32Next вместо Process32First/Process32Next
* QueryFullProcessImageName
* GetModuleFileNameEx
* GetProcessImageFileName
гм... И какой же "лучше"?
...
Рейтинг: 0 / 0
20.07.2017, 13:20:52
    #39492325
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия запущенного процесса по полному "пути к образу"
20.07.2017 11:42, Q640 пишет:
> Необходимо определить запущен ли процесс, зная его "Путь к образу"

зачем?
какова цель?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.07.2017, 15:21:09
    #39492452
Mikhalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия запущенного процесса по полному "пути к образу"
Код: pascal
1.
OpenProcess(PROCESS_QUERY_INFORMATION, false, Process_Id);

а затем: QueryFullProcessImageName
...
Рейтинг: 0 / 0
20.07.2017, 15:23:54
    #39492456
Mikhalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия запущенного процесса по полному "пути к образу"
Да, через EnumProcesses получить список id.

Enumerating All Processes
...
Рейтинг: 0 / 0
20.07.2017, 19:09:38
    #39492634
Q640
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия запущенного процесса по полному "пути к образу"
Это как бы и есть цель. Есть полный путь к чужому exe. Надо узнать условно грубо говоря "работает" он или нет.
Пока без подсчёта количества экземпляров, просто "есть ли хоть один такой процесс".

А чего, через CreateToolhelp32Snapshot() не все процессы найдутся? Или почему-то другому не рекомендуете?

Спасибо большое, будем попробовать!
...
Рейтинг: 0 / 0
21.07.2017, 05:15:26
    #39492739
Mikhalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия запущенного процесса по полному "пути к образу"
Q640А чего, через CreateToolhelp32Snapshot() не все процессы найдутся? Или почему-то другому не рекомендуете?
Каких-либо религиозных предпочтений нет - главное чтобы работало.
Это я дернул из куска моего кода, а там было через EnumProcesses.
И EnumProcesses немного побыстрей работает (дергает из системы меньше инфы, поэтому накладные расходы меньше).
EnumProcesses() vs CreateToolhelp32Snapshot()
...
Рейтинг: 0 / 0
27.07.2017, 05:46:35
    #39495689
Проверка наличия запущенного процесса по полному "пути к образу"
Вот вам волшебная функция для определения полного пути по PID процесса. Просто добавьте это в свой код. Но только помните, что в 64-битной системе всегда используйте 64-битную версию вашего ПО, т.к. 32-битная программа не может определять полный путь к 64-битным процессам (в противном случае используйте QueryFullProcessImageName, но эта шняга не работает в XP и 2003, так что лучше способ выше). Если выполнять эти условия по битности, то это самая надежная функция определения полного пути, никогда не подводила от XP до Windows 10.

Код: pascal
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
function mywin_set_privilege(const sPrivilege: string; const bEnabled: boolean): boolean;
var
  hToken: THandle;
  TokenPriv: TOKEN_PRIVILEGES;
  PrevTokenPriv: TOKEN_PRIVILEGES;
  ReturnLength: Cardinal;
begin
  Result := true;
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
  begin
    if LookupPrivilegeValue(nil, PChar(sPrivilege), TokenPriv.Privileges[0].Luid) then
    begin
      TokenPriv.PrivilegeCount := 1;
      case bEnabled of
        true:
          TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        false:
          TokenPriv.Privileges[0].Attributes := 0;
      end;
      ReturnLength := 0;
      PrevTokenPriv := TokenPriv;
      if not AdjustTokenPrivileges(hToken, false, TokenPriv, SizeOf(PrevTokenPriv), PrevTokenPriv, ReturnLength) then
        Result := false;
    end
    else
      Result := false;
    CloseHandle(hToken);
  end
  else
    Result := false;
end;


function mywin_get_pidpath(const pid: Cardinal; const name: String): String;
var
  b: boolean;
  HM: THandle;
  me: TModuleEntry32;
begin
  Result := '';
  HM := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
  if HM <> INVALID_HANDLE_VALUE then
  begin
    me.dwSize := SizeOf(me);
    b := Module32First(HM, me);
    while b do
    begin
      if FileExists(me.szExePath) and (AnsiLowerCase(me.szModule) = AnsiLowerCase(name)) then
        if (AnsiLowerCase(ExtractFileExt(me.szModule)) = '.exe') and (AnsiPos(':', me.szExePath) > 0) then
        begin
          if AnsiLowerCase(ExtractFileName(me.szExePath)) = AnsiLowerCase(name) then
          begin
            Result := me.szExePath;
            break;
          end;
        end;
      b := Module32Next(HM, me);
    end;
    CloseHandle(HM);
  end;
  if Result = '' then
    Result := name;
end;


Вызывать так

Перед вашей функцией нужно добавить вызов (чтобы мы смогли получать полные пути к системным сервисам и службам):

Код: pascal
1.
mywin_set_privilege('SeDebugPrivilege', true);



а в саму вашу функцию добавить вот такое получение пути по PID ну и далее сравнение сами допишете, если искомый путь и путь определенный для PID совпадает, значит процесс запущен:

Код: pascal
1.
2.
3.
pid_path := mywin_get_pidpath(FProcessEntry32.th32ProcessID, FProcessEntry32.szExeFile);

if (AnsiLowerCase(search_path) = AnsiLowerCase(pid_path)) then ...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проверка наличия запущенного процесса по полному "пути к образу" / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]