Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение списка процессов в x64 из x32 
:(
    Опции темы
ChinYan
Дата 11.1.2012, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! Возникла необходимость получить список текущих процессов и немного с ним поработать (в частности узнать изпользуемые им DLL)
Нашел вот это. Но оно находит только 32х разрядные процессы, а нужны все. (Приложение должно быть 32х разрядным, но должно иметь возможность получить список и на 64х разрядной системе) Нашел про ZwQuerySystemInformation но не уверен, что оно даст требуемый результат. Кто-то нибудь уже решал подобную проблему?

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


Эксперт
***


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

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



Этот код хоть на паскале но WinAPI он должен видеть все 64 разрядные процессы
Код

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.



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
ChinYan
Дата 11.1.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да даже не понадобился код толком. Нужно было просто получить отладочные привелегии
PM MAIL   Вверх
Dem_max
Дата 12.1.2012, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



В приведенном коде все есть, не тебе так другим пригодится


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
ChinYan
Дата 12.1.2012, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну да. Только плюс что-то не ставится
PM MAIL   Вверх
GremlinProg
Дата 13.1.2012, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(ChinYan @  12.1.2012,  17:27 Найти цитируемый пост)
Ну да. Только плюс что-то не ставится


M
GremlinProg
без проблем, поставил



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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