Как получить карту памяти любого процесса 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Как получить карту памяти любого процесса



Для получения карты памяти любого процесса можно использовать следующий алгоритм:

1. С помощью функций Process32First и Process32Next получить список всех процессов в системе, запоминая их идентификаторы;

2. Выбрать из списка интересующий вас процесс;

3. Зная идентификатор процесса получить дескриптор процесса с помощью функции Open Process;

4. Зная дескриптор процесса можно получить карту памяти, используя функцию VirtualQueryEx, которая описана в лабораторной работе № 2.

 

Функция Open Process имеет следующий вид:

function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD):THANDLE;

где

dwDesiredAccess – определяет вид доступа к данному объекту. Возможные значения параметра dwDesiredAccess приведены в таблице 6.7;

bInheritHandle – флаг определяет, может ли полученный дескриптор использоваться дочерними процессами. Если bInheritHandle установить в TRUE, то дескриптор является наследуемым;

dwProcessId – идентификатор процесса.

При успешном выполнении функция OpenProcess возвращает дескриптор процесса.

 

Таблица 6.7 Возможные значения параметра dwDesiredAccess

Параметр dwDesiredAccess Описание
   
PROCESS_ALL_ACCESS Устанавливает все возможные значения флагов для данного объекта
PROCESS_CREATE_PROCESS Дескриптор процесса будет использоваться для создания другого процесса
PROCESS_CREATE_THREAD Дескриптор процесса будет использоваться для создания потока, как удаленного (внедренного в другой процесс), так и локального с помощью функций CreateRemoteThread и CreateThread
PROCESS_DUP_HANDLE Дескриптор процесса будет использоваться для дублирования дескриптора процесса с помощью функции DuplicateHandle

Продолжение таблицы 6.7

   
PROCESS_QUERY_INFORMATION Дескриптор процесса будет использоваться для получения информации о процессе с помощью функций GetExitCodeProcess и GetPriorityClass. Этот флаг также следует использовать для получения карты памяти в приведенном выше алгоритме
PROCESS_SET_INFORMATION Дескриптор процесса будет использоваться для изменения класса приоритета процесса с помощью функции SetPriorityClass
PROCESS_TERMINATE Дескриптор процесса будет использоваться для завершения процесса с помощью функции TerminateProcess f
PROCESS_VM_OPERATION Дескриптор процесса будет использоваться для изменения виртуальной памяти процесса с помощью функций VirtualProtectEx и WriteProcessMemory
PROCESS_VM_READ Дескриптор процесса будет использоваться для чтения содержимого виртуальной памяти процесса с помощью функции ReadProcessMemory
PROCESS_VM_WRITE Дескриптор процесса будет использоваться для записи в виртуальную память процесса с помощью функции WriteProcessMemory
SYNCHRONIZE Дескриптор процесса будет использоваться для ожидания завершения процесса с помощью Wait-функций

Пример использования функций ToolHelp

Пример приложения, использующего функции ToolHelp приведен на рисунке 6.1. Данное приложение выводит на экран список всех процессов и список всех модулей в системе.

Для создания данного приложения выполните следующие действия:

1. Перенесите на форму компоненты, перечисленные в таблице 6.8.

 

Таблица 6.8 Компоненты создаваемого приложения

Компонент Класс Описание
Button1 TButton Командная кнопка «Завершение работы»
Button2 TButton Командная кнопка «Обновить»
Button3 TButton Командная кнопка «Процессы/Модули»
StringGrid1 TStringGrid Таблица

2. В блок Uses включите файл tlhelp32:

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, Buttons,tlhelp32;

 

3. В блок var добавьте список глобальных переменных:

var

Form1: TForm1;

pe32:tProcessEntry32;

me32:tModuleEntry32;

hProcess:THandle;

 

4. Для события формы OnCreate запишите следующий программный код:

procedure TForm1.FormCreate(Sender: TObject);

VAR

x,code:Integer;

s:String;

begin

StringGrid1.Cells[0,0]:='№';

StringGrid1.Cells[1,0]:='Имя файла';

StringGrid1.Cells[2,0]:='Идентификатор процесса';

StringGrid1.Cells[3,0]:='Количество потоков';

StringGrid1.Cells[4,0]:='Базовый приоритет';

pe32.dwSize:=SizeOf(tProcessEntry32);

x:=1;

hProcess:=CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS,0);

Process32First(hProcess,pe32);

{ str(pe32.th32ProcessID,StringGrid1.Cells[2,x]);

val(StringGrid1.Cells[2,x],pe32.th32ProcessID,code);}

str(pe32.th32ProcessID,s);

val(s,pe32.th32ProcessID,code);

Repeat

StringGrid1.Cells[0,x]:=IntToStr(x);

StringGrid1.Cells[1,x]:=pe32.szExeFile;

StringGrid1.Cells[2,x]:=IntToStr(pe32.th32ProcessID);

StringGrid1.Cells[3,x]:=IntToStr(pe32.cntThreads);

StringGrid1.Cells[4,x]:=IntToStr(pe32.pcpriClassBase);

x:=x+1;

StringGrid1.RowCount:=x;

until Process32Next(hProcess,pe32)=False;

end;

Данный программный код выводит на экран при запуске приложения список процессов в системе.

5. Для события OnClick кнопки Button1 запишите следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);

begin

Form1.Close;

end;

Данный программный код выполняет закрытие формы.

 

6. Для события OnClick кнопки Button2 запишите следующий программный код:

procedure TForm1.Button2Click(Sender: TObject);

begin

Form1.OnCreate(Sender);

end;

Данный программный код выводит на экран список процессов в системе.

Для события OnClick кнопки Button33 запишите следующий программный код:

procedure TForm1.Button3Click(Sender: TObject);

VAR

x:Integer;

begin

If Button3.Caption='Модули' then

begin

Button3.Caption:='Процессы';

Closehandle(hProcess);

x:=1;

StringGrid1.Cells[0,0]:='№';

StringGrid1.Cells[1,0]:='Модули';

StringGrid1.Cells[2,0]:='';

StringGrid1.Cells[3,0]:='';

StringGrid1.Cells[4,0]:='';

StringGrid1.Cells[5,0]:='';

StringGrid1.ColCount:=2;

me32.dwSize:=SizeOf(tModuleEntry32);

hProcess:=CreateToolhelp32SnapShot(TH32CS_SNAPMODULE,0);

Module32First(hProcess,me32);

Repeat

StringGrid1.Cells[1,x]:=me32.szModule;

x:=x+1;

StringGrid1.RowCount:=x;

until Module32Next(hProcess,me32)=False;

end

else

begin

StringGrid1.ColCount:=6;

StringGrid1.ColWidths[1]:=250;

Button3.Caption:='Модули';

Form1.OnCreate(Sender);

end;

end;

7. Откомпилируйте разработанное приложение.

 

6.4. Задания для самостоятельной работы

1. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать список модулей, используемых данным процессом.

2. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать список потоков данного процесса.

3. Программа, формирующая список всех потоков, выполняющихся на данном компьютере и позволяющая определить имя процесса, которому принадлежит данный поток.

4. Программа, формирующая список всех загруженных модулей и позволяющая определить для каждого модуля процессы, использующие данный модуль.

5. Программа, позволяющая получить информацию о кучах выбранного процесса: сколько куч, их размеры, процент заполнения и т.д.

6. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать содержимое любого блока памяти выбранного процесса (данные выводятся в символьной форме).

7. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать адресное пространство выбранного процесса.

8. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и подсчитывающая информацию о количестве зарезервированных страниц каждого процесса.

9. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и подсчитывающая информацию о количестве выделенных страниц каждого процесса.

10. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и подсчитывающая информацию о количестве регионов в адресном пространстве каждого процесса.

11. Программа, которая выводит на экран список всех процессов и наименования родительских процессов для каждого процесса.

12. Программа, которая выводит на экран список всех процессов и наименования дочерних процессов для каждого процесса.

13. Программа, формирующая список всех модулей системы, размер каждого модуля в байтах и суммарный размер всех модулей.

14. Программа, формирующая список всех процессов, выполняющихся на данном компьютере, которые имеют один поток, и позволяющая просматривать список модулей, используемых данным процессом.

15. Программа, формирующая список трех процессов, выполняющихся на данном компьютере и имеющих самое большое количество потоков (в порядке убывания количества потоков) и идентификаторы всех потоков для каждого процесса.

16. Программа, определяющая, какой модуль используется наиболее часто (наибольшим числом процессов).

17. Программа, формирующая список всех процессов в системе, в порядке убывания приоритета.

18. Программа, выполняющая вывод всех модулей в системе и осуществляющая контекстный поиск модуля по имени.

19. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать содержимое любого блока памяти выбранного процесса (данные выводятся в шестнадцатеричном формате).

20. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать содержимое любого блока памяти выбранного процесса (на экран выводятся коды символов).

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Как получить информацию о всех загруженных процессах?

2. Как получить карту памяти любого процесса?

3. Как получить список потоков выбранного процесса?

4. Как получить список всех блоков выбранной кучи?

5. Как получить список модулей, принадлежащих конкретному процессу?

6. Как получить список всех модулей системы?

 

ЛАБОРАТОРНАЯ РАБОТА № 7

ОБЪЕКТЫ СИНХРОНИЗАЦИИ

Цель работы

Целью данной работы является исследование объектов синхронизации, с помощью которых в многозадачной среде обеспечивается последовательный доступ к совместно используемым ресурсам. В данной работе рассматриваются следующие вопросы:

· Синхронизация потоков с помощью объектов пользовательского режима (критические секции);

· Синхронизация потоков с помощью объектов ядра (объекты Mutex, события, семафоры, процессы и потоки);

· Работа Wait- функций в различных режимах.

Теоретическое введение

Критические секции

Критическая секция — это небольшой участок кода, требующий монопольного доступа к каким-то общим данным. Она позволяет сделать так, чтобы единовременно только один поток получал доступ к определенному ресурсу. Ни один из потоков, которым нужен занятый ресурс, не получит процессорное время до тех пор, пока поток, захвативший критическую секцию, не выйдет за ее границы.

При работе с критическими секциями выполняются следующие действия:

1. Создается экземпляр структуры CRITICAL_SECTION. Например: VAR cs:TRTLCriticalSection;

2. Инициализируется критическая секция. Сделать это надо до обращения какого-либо потока к защищенному ресурсу. Критическая секция инициализируется вызовом процедуры InitializeCriticalSection:

procedure InitializeCriticalSection(var lpCriticalSection: TRTLCriticalSection);

где lpCriticalSection - адрес структуры CRITICAL_SECTION.

3. При обращении к разделяемому ресурсу, вызывается процедура EnterCriticaSecton:

procedure EnterCriticalSection(var lpCriticalSection: TRTLCriticalSection);

где lpCriticalSection – адрес структуры CRITICAL_SECTION.

Процедура EnterCriticalSection допустит выполнение вызвавшего ее потока, если определит, что критическая секция свободна. В ином случае EnterCriticalSection заставит поток ждать, пока критическая секция не освободится. Процедура EnterCriticalSection занимает критическую секцию.

4. Поток, покидая участок кода, где он работал с защищенным ресурсом, должен вызвать процедуру LeaveCriticalSection. Тем самым поток уведомляет систему о том, что разделяемый ресурс освободился. Прцедура LeaveCriticalSection имеет вид:

procedure LeaveCriticalSection(var lpCriticalSection: TRTLCriticalSection);

где lpCriticalSection – адрес структуры CRITICAL_SECTION.

5. Если структура CRITICAL_SECTION больше не понадобится ни одному потоку, ее следует удалить, вызвав процедуру DeleteCriticalSection:

procedure DeleteCriticalSection(var lpCriticalSection: TRTLCriticalSection);

где lpCriticalSection – адрес структуры CRITICAL_SECTION.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 480; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.222.12 (0.038 с.)