как узнать путь к exe по хэндлу процесса или id

Тема в разделе "WASM.ASSEMBLER", создана пользователем asm0day01, 23 июн 2024.

  1. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    132
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
  3. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    Как заставить работать код с функцией GetModuleFileNameExW для всех процессов в юзермоде? Например для хрома и т.д.

    Ибо работает не для всех.
    Код (C):
    1. #include <Windows.h>
    2. #include <Psapi.h>
    3.  
    4. int main()
    5. {
    6.      HWND foregroundWindow = GetForegroundWindow();
    7.      DWORD processId;
    8.      GetWindowThreadProcessId(foregroundWindow, &processId);
    9.  
    10.      HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION |   PROCESS_VM_READ, FALSE, processId);
    11.  
    12.      if (processHandle != NULL)
    13.      {
    14.           WCHAR fileName[MAX_PATH];
    15.  
    16.           if (GetModuleFileNameExW(processHandle, NULL, fileName, MAX_PATH) != 0)
    17.           {
    18.                std::wcout << L"Имя процесса: " << fileName << std::endl;
    19.           }
    20.           CloseHandle(processHandle);
    21.      } return 0;
    22. }
    Не сочтите за флуд, для Т.С-а. возможно тоже надобен более полный охват процессов, а не их небольшой части.
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    А как должен работать твой код? Чьё окно он должен получить?
    Ведь на момент запуска фокус передаётся твоему приложению, его окно выходит на передний план, и оно получит путь само для себя. Вряд ли это то, что ты задумывал.
     
  5. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    HoShiMin, код работает в отдельном потоке, когда юзер открывает/переключает на новое окно в текстовый файл сохраняется имя процесса.

    Эта часть кода выполняется в вечном цикле, с функцией Sleep():
    Код (C++):
    1. HWND foregroundWindow = GetForegroundWindow();
    2.      DWORD processId;
    3.      GetWindowThreadProcessId(foregroundWindow, &processId);
    4.      HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION |   PROCESS_VM_READ, FALSE, processId);
    5.      if (processHandle != NULL)
    6.      {
    7.           WCHAR fileName[MAX_PATH];
    8.           if (GetModuleFileNameExW(processHandle, NULL, fileName, MAX_PATH) != 0)
    9.           {
    10.                std::wcout << L"Имя процесса: " << fileName << std::endl; //вместо этого, запись fileName в txt
    11.           }
    12.           CloseHandle(processHandle);
    13.      }
    Если в потоке вызвать GetForegroundWindow и GetWindowText, то сохраняется WindowText всех окон, на которые переключает юзер. Хотелось сделать сохранение имен всех процессов.

    Интересно, это возможно?
    Да.
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.320
    Я не понимаю, у тебя есть пид процесса, который ты получил из окна, просто перечисли все процессы и найди среди них тот пид, который ты получил. Зачем тебе открывать процесс? Некоторые процессы ты в принципе не сможешь открыть, даже для квери_информацион.
     
  7. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    Rel, благодарю. Получилось так:

    Код (Pascal):
    1. {$APPTYPE CONSOLE}
    2. uses
    3.   Windows, TlHelp32;
    4.  
    5. const
    6.   dw_time = 100;
    7. type
    8.   ProcList = record
    9.     ExeName: string;
    10.     Pid: dword;
    11.   end;
    12.  
    13.   TProcList = array of ProcList;
    14. procedure GetProcessList(var Buffer: TProcList);
    15. var
    16.   Handle: THandle;
    17.   processEntry: TProcessEntry32;
    18. begin
    19.   SetLength(Buffer, 0);
    20.   Handle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    21.   if Handle <> INVALID_HANDLE_VALUE then
    22.   begin
    23.     processEntry.dwSize := SizeOf(TProcessEntry32);
    24.     if Process32First(Handle, processEntry) then
    25.     begin
    26.       repeat
    27.         SetLength(Buffer, Length(Buffer) + 1);
    28.         Buffer[Length(Buffer) - 1].ExeName := processEntry.szExeFile;
    29.         Buffer[Length(Buffer) - 1].Pid := processEntry.th32ProcessID;
    30.       until not Process32Next(Handle, processEntry);
    31.     end;
    32.     CloseHandle(Handle);
    33.   end;
    34. end;
    35. var
    36.   i: integer;
    37.   Buffer: TProcList;
    38.   last_pid, current_pid: DWORD;
    39. begin
    40.   last_pid := 0;
    41.   while true do
    42.   begin
    43.     GetWindowThreadProcessId(GetForegroundWindow(), @current_pid);
    44.     if last_pid <> current_pid then
    45.     begin
    46.       last_pid := current_pid;
    47.       GetProcessList(Buffer);
    48.       for i := 0 to Length(Buffer) - 1 do
    49.       begin
    50.         if Buffer[i].Pid = current_pid then
    51.         begin
    52.           Writeln('Exe name: ' + Buffer[i].ExeName);
    53.         end;
    54.       end;
    55.     end;
    56.     Sleep(dw_time);
    57.   end;
    58.   ReadLn;
    59. end.
     
  8. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    132
    а можно поподробней по поводу квери_информацион.
    ?