Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Получение списка процессов в x64 из x32


Автор: ChinYan 11.1.2012, 16:59
Здравствуйте! Возникла необходимость получить список текущих процессов и немного с ним поработать (в частности узнать изпользуемые им DLL)
Нашел вот http://forum.vingrad.ru/topic-75232.html. Но оно находит только 32х разрядные процессы, а нужны все. (Приложение должно быть 32х разрядным, но должно иметь возможность получить список и на 64х разрядной системе) Нашел про ZwQuerySystemInformation но не уверен, что оно даст требуемый результат. Кто-то нибудь уже решал подобную проблему?

Автор: Dem_max 11.1.2012, 17:46
Этот код хоть на паскале но 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.

Автор: ChinYan 11.1.2012, 18:56
Да даже не понадобился код толком. Нужно было просто получить отладочные привелегии

Автор: Dem_max 12.1.2012, 03:02
В приведенном коде все есть, не тебе так другим пригодится

Автор: ChinYan 12.1.2012, 15:27
Ну да. Только плюс что-то не ставится

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


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

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