Как получить хэндлы всех пpоцессов, котоpые запущены на данный момент в системе
Под Windows 95 это возможно с использованием вспомогательных инфоpмационных функций (tool help functions). Для получения списка пpоцессов надо делать следующее:
// Получение снимка состояния системы
hSnapshot := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
// Получене инфоpмации о пеpвом пpоцессе в списке
Process32First();
// Получение инфоpмации о следующем пpоцессе в списке
Далее в цикле Process32Next();
unit KernlUtl;
interfaceuses
TlHelp32, Windows, Classes, Sysutils;
procedure GetProcessList(List: TStrings);
procedure GetModuleList(List: TStrings);
function GetProcessHandle(ProcessID: DWORD): THandle;
procedure GetParentProcessInfo(var ID: DWORD; var Path: string);
const
PROCESS_TERMINATE = $0001;
PROCESS_CREATE_THREAD = $0002;
PROCESS_VM_OPERATION = $0008;
PROCESS_VM_READ = $0010;
PROCESS_VM_WRITE = $0020;
PROCESS_DUP_HANDLE = $0040;
PROCESS_CREATE_PROCESS = $0080;
PROCESS_SET_QUOTA = $0100;
PROCESS_SET_INFORMATION = $0200;
PROCESS_QUERY_INFORMATION = $0400;
PROCESS_ALL_ACCESS =
STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $0FFF;
implementationprocedure GetProcessList(List: TStrings);
var
I: Integer;
hSnapshoot: THandle;
pe32: TProcessEntry32;
begin
List.Clear;
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshoot = -1) then
Exit;
pe32.dwSize := SizeOf(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) thenrepeat
I := List.Add(Format('%x, %x: %s',
[pe32.th32ProcessID, pe32.th32ParentProcessID, pe32.szExeFile]));
List.Objects[I] := Pointer(pe32.th32ProcessID);
untilnot Process32Next(hSnapshoot, pe32);
CloseHandle (hSnapshoot);
end;
procedure GetModuleList(List: TStrings);
var
I: Integer;
hSnapshoot: THandle;
me32: TModuleEntry32;
begin
List.Clear;
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
if (hSnapshoot = -1) then
Exit;
me32.dwSize := SizeOf(TModuleEntry32);
if (Module32First(hSnapshoot, me32)) thenrepeat
I := List.Add(me32.szModule);
List.Objects[I] := Pointer(me32.th32ModuleID);
untilnot Module32Next(hSnapshoot, me32);
CloseHandle (hSnapshoot);
end;
procedure GetParentProcessInfo(var ID: DWORD; var Path: string);
var
ProcessID: DWORD;
hSnapshoot: THandle;
pe32: TProcessEntry32;
begin
ProcessID := GetCurrentProcessID;
ID := -1;
Path := '';
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshoot = -1) then
Exit;
pe32.dwSize := SizeOf(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) thenrepeatif pe32.th32ProcessID = ProcessID thenbegin
ID := pe32.th32ParentProcessID;
Break;
end;
untilnot Process32Next(hSnapshoot, pe32);
if ID <> -1 thenbeginif (Process32First(hSnapshoot, pe32)) thenrepeatif pe32.th32ProcessID = ID thenbegin
Path := pe32.szExeFile;
Break;
end;
untilnot Process32Next(hSnapshoot, pe32);
end;
CloseHandle (hSnapshoot);
end;
function GetProcessHandle(ProcessID: DWORD): THandle;
begin
Result := OpenProcess(PROCESS_ALL_ACCESS, True, ProcessID);
end;
end.
Приведенный код - это модуль Delphi, содержащий несколько процедур для взаимодействия с процессами и модулями операционной системы Windows. Каждая процедура выполняет следующую функцию:
GetProcessList(List: TStrings): Эта процедура получает список всех запущенных процессов на системе и добавляет их идентификаторы, идентификаторы родительских процессов и имена исполняемых файлов в предоставленный список строк TStrings.
GetModuleList(List: TStrings): Аналогично GetProcessList, эта процедура получает список всех загруженных модулей (DLL и EXE) на системе и добавляет их имена модулей и handles в предоставленный список строк TStrings.
GetParentProcessInfo(var ID: DWORD; var Path: string): Эта процедура находит идентификатор родительского процесса и путь к исполняемому файлу текущего процесса, а затем хранит их в предоставленных переменных.
GetProcessHandle(ProcessID: DWORD): THandle: Функция открывает handle для указанного процесса с помощью API-функции OpenProcess.
Чтобы получить handles всех запущенных процессов, можно использовать процедуру GetProcessList. Вот пример:
В этом коде создается объект TStringList, вызывается процедура GetProcessList для заполнения списка процессной информацией, а затем итерируется по списку для получения handle каждого процесса с помощью функции GetProcessHandle. Handle получается путем кастинга идентификатора процесса в DWORD.
Получить хэндлы всех процессов, запущенных в системе, можно с помощью функции CreateToolhelp32Snapshot и цикла Process32Next под Windows 95.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.