Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список процессов с путями, Windows Seven! 64-bit 
V
    Опции темы
Attack
Дата 14.12.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Здравствуйте, у меня проблема с получением полного пути к процессам, под Windows Seven (64-bit).
Сам список "exe" файлов получается нормально, делаю это вот так:
Код

var
     hSnapShot: THandle;
     ProcInfo: TProcessEntry32;
begin
     ListBox1.Clear;
     hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     if (hSnapShot <> THandle(-1)) then
     begin
          ProcInfo.dwSize := SizeOf(ProcInfo);
          if (Process32First(hSnapshot, ProcInfo)) then
          begin
               while (Process32Next(hSnapShot, ProcInfo)) do
               Begin
                    ListBox1.Items.Add(ProcInfo.szExeFile);
               End;
          end;
          CloseHandle(hSnapShot);
     end;
end;

Соответственно в ListBox1 получаю полный список процессов, от всех пользователей.
Дальше мне необходимо получить путь к каждому процессу. Делаю это так:

Код

var
     hSnapShot: THandle;
     ProcInfo: TProcessEntry32;
     ModInfo: TModuleEntry32;
     hSnapShotM: THandle;
begin
     ListBox1.Clear;
     hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     if (hSnapShot <> THandle(-1)) then
     begin
          ProcInfo.dwSize := SizeOf(ProcInfo);
          ModInfo.dwSize := sizeof(ModInfo);

          if (Process32First(hSnapshot, ProcInfo)) then
          begin
               while (Process32Next(hSnapShot, ProcInfo)) do
               Begin
                    hSnapShotM := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcInfo.th32ProcessID);
                    Module32First(hSnapShotM,ModInfo);
                    ListBox1.Items.Add(ModInfo.szExePath);
                    CloseHandle(hSnapShotM);
               End;
          end;
          CloseHandle(hSnapShot);
     end;
end;


Но путь определяется не правильно! Некоторым процессам приписываются пути других.
Так как грамотно получить пути всех процессов под Севеном?

PM   Вверх
Keeper89
Дата 14.12.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Это смотрели?


--------------------
PM MAIL WWW   Вверх
Attack
Дата 14.12.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Keeper89, да, смотрел )) Та же самая проблема!
PM   Вверх
Keeper89
Дата 14.12.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



К сожалению нет у меня семерки и проверить не могу.  smile 


--------------------
PM MAIL WWW   Вверх
ksili
Дата 14.12.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



У меня есть 64-битная 7-ка. правда прямо сейчас проверить не могу. Пока такие замечания:
Какой разрядности ваше приложение?
А проблемы случайно не с 64-битными приложениями? (например диспетчер задач - taskmgr.exe - 64-битный)

Про фукнцию CreateToolhelp32Snapshot в MSDN написано:
Цитата

If the specified process is a 64-bit process and the caller is a 32-bit process, this call will fail. Note that you can use the QueryFullProcessImageName function to retrieve the full name of an executable image for both 32- and 64-bit processes from a 32-bit process.





--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Attack
Дата 14.12.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



ksili, программа у меня 32-битная.
А что нужно в Uses прописать для QueryFullProcessImageName?
PM   Вверх
Maks1509
Дата 14.12.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.8.2007
Где: г. Тольятти

Репутация: 3
Всего: 5



По хорошему нужно создавать 64-битное приложение, но на данный момент компилятор Delphi этого сделать не может.
Немного иной способ решения данной проблемы я обнаружил на немецком форуме. Посмотрите, может поможет на 7, но в XP x64 работает превосходно.
http://forum.sources.ru/index.php?showtopi...&st=0&#

Это сообщение отредактировал(а) Maks1509 - 14.12.2009, 22:28
PM MAIL ICQ   Вверх
Attack
Дата 15.12.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Maks1509, спасибо, код работает, хотя и значительно обрастает дополнительными функциями ))

Добавлено:
Код не определяет 2 процесса!
Первый с PID = 4 ну это понято это "System"
А вот второй это "audiodg.exe", при выполнении OpenProcess возвращает 0. Порыл в нете, люди говорят что этот процесс защищён, и в него можно залезть только из службы, как то так... мне этот процесс не важен, однако обидно! Причём Диспетчер задач путь его нормально отображает.

Это сообщение отредактировал(а) Attack - 15.12.2009, 01:32
PM   Вверх
ksili
Дата 15.12.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(Attack @  15.12.2009,  00:47 Найти цитируемый пост)
А что нужно в Uses прописать для QueryFullProcessImageName?

Что-то я сразу не заметил, что эта тема в Delphi.
Для Visual Studio я качал WinSDK for Windows 7, чтобы использовать функции, которые появились в висте и семёрке.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Демо
Дата 15.12.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Attack @  14.12.2009,  20:47 Найти цитируемый пост)
А что нужно в Uses прописать для QueryFullProcessImageName?


Ну можно описатьтак, например:

Код

function QueryFullProcessImageNameA(Process: THandle; Flags: DWORD;
  Buffer: PChar; Size: PDWORD): DWORD; stdcall; external 'kernel32.dll';


Но лучше использовать динамическую линковку.


--------------------
    
PM MAIL ICQ Skype   Вверх
Демо
Дата 15.12.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Attack @  15.12.2009,  00:46 Найти цитируемый пост)
А вот второй это "audiodg.exe", при выполнении OpenProcess возвращает 0

Открывай этот процесс с привилегией PROCESS_QUERY_LIMITED_INFORMATION ($1000).



--------------------
    
PM MAIL ICQ Skype   Вверх
Attack
Дата 15.12.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Демо, спасибо, однако только сейчас заметил один странный глюк:

user posted image

Слева программа запущена из среды(F9), а справа просто из системы (с правами админа)
почему csrss.exe не опознался?
PM   Вверх
Демо
Дата 15.12.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



У меня одинаково.

Привилегии на отладку получаешь?


--------------------
    
PM MAIL ICQ Skype   Вверх
Attack
Дата 15.12.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Демо, нет конечно =) Сейчас попробую.

Добавлено:
Вот что получилось:

Код

unit Unit1;

interface

uses
     TLHelp32,
     PsAPI,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  
function QueryFullProcessImageNameW(Process: THandle; Flags: DWORD; Buffer: PChar; Size: PDWORD): DWORD;
     stdcall; external 'kernel32.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

Function GetProcessFilePath(PID: Cardinal): String;
     Function IsWin2k: Boolean;
     begin
          Result := (Win32MajorVersion = 5) and (Win32Platform = VER_PLATFORM_WIN32_NT);
     end;

     Function IsWinNT4: Boolean;
     begin
          Result := (Win32MajorVersion = 4) and (Win32Platform = VER_PLATFORM_WIN32_NT);
     end;
Const
     PROCESS_QUERY_LIMITED_INFORMATION = $1000;
var
     hP        :    THandle;
     Buffer    :    Array[0..MAX_PATH] of Char;
     S         :    DWORD;
begin
     Result := '';

     if PID > 0 then
     begin
          if IsWinNT4 or IsWin2K then
          begin
               hP := OpenProcess(PROCESS_QUERY_INFORMATION, False, PID);
               if hP > 0 then
                    if GetModuleFileNameEx(hP, 0, Buffer, Length(Buffer)) > 0 then Result :=
                         StringReplace(Buffer, '\??\', '', [rfReplaceAll, rfIgnoreCase]);
          end
          else
          begin
               hP := OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, PID);
               if hP > 0 then
                    if QueryFullProcessImageNameW(hP, 0, @Buffer, @S) > 0 then Result := String(Buffer);
          end;
          CloseHandle(hP);
     end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
     hSnapShot: THandle;
     ProcInfo: TProcessEntry32;


     hToken              :    THandle;
     SeDebugNameValue    :    Int64;
     tkp                 :    TOKEN_PRIVILEGES;
     ReturnLength        :    Cardinal;
begin
     ListBox1.Clear;

///   Добавляем привилегию   /////////////////////////////////////////////////////////////////////////////////
     if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then     ///
          exit;                                                                                            ///
                                                                                                           ///
     if not LookupPrivilegeValue( nil, 'SeDebugPrivilege', SeDebugNameValue ) then                         ///
     begin                                                                                                 ///
          CloseHandle(hToken);                                                                             ///
          exit;                                                                                            ///
     end;                                                                                                  ///
                                                                                                           ///
     tkp.PrivilegeCount:= 1;                                                                               ///
     tkp.Privileges[0].Luid := SeDebugNameValue;                                                           ///
     tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;                                                 ///
                                                                                                           ///
     AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength);                                 ///
     if GetLastError() <> ERROR_SUCCESS  then exit;                                                        ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////


     hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     if (hSnapShot <> THandle(-1)) then
     begin
          ProcInfo.dwSize := SizeOf(ProcInfo);
          if (Process32First(hSnapshot, ProcInfo)) then
          begin
               while (Process32Next(hSnapShot, ProcInfo)) do
               Begin
                    case ProcInfo.th32ProcessID of
                         4: ListBox1.Items.Add('[System]');
                    else
                         ListBox1.Items.Add(GetProcessFilePath(ProcInfo.th32ProcessID));
                    end;
               End;
          end;
          CloseHandle(hSnapShot);
     end;

///   Удаляем привилегию   ///////////////////////////////////////////////////////////
     tkp.Privileges[0].Attributes := 0;                                            ///
     AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);    ///
     if GetLastError() <>  ERROR_SUCCESS then exit;                                ///
//////////////////////////////////////////////////////////////////////////////////////
end;

end.


Всем большое СПАСИБО!

Это сообщение отредактировал(а) Attack - 15.12.2009, 22:38
PM   Вверх
Демо
Дата 15.12.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Attack @  15.12.2009,  21:25 Найти цитируемый пост)
 if QueryFullProcessImageNameW(hP, 1, @Buffer, @S) > 0 then Result :=


Если тебе сразу путь нужно получить без пути с устройством, то нужно было параметр 0 использовать просто:
Код

 QueryFullProcessImageNameW(hP, 0, @Buffer, @S)



--------------------
    
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1421 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.