Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Цель работы: получение практических навыков при использовании Win 32 API для исследования процессов



Цель работы: получение практических навыков при использовании Win 32 API для исследования процессов

 

Процесс - это исполняемый экземпляр приложения и набор ресурсов, которые выделяются данному исполняемому приложению. Ресурсами являются:

· виртуальное адресное пространство;

· системные ресурсы, такие как растровые изображения, файлы, области памяти и т.д.;

· модули процесса, то есть исполняемые модули, которые отображены (загружены) в его адресное пространство. Это могут быть динамические библиотеки (DLI), драйверы (DRV) и управляющие элементы (OCX), основной загрузочный модуль (ЕХЕ) процесса, который иногда называют собственно модулем. Модуль данных (или программный модуль) может  находиться на диске, или может быть загружен в физическую память (RAM). Правда, термин «загружен» (loaded) имеет иное значение, относящееся к виртуальному адресному пространству процесса. Здесь больше подходит термин «отображен» (mapped), так как само отображение - это просто назначение виртуальным адресам физических адресов. После того как модуль загружен в физическую память, его физические адреса могут отображаться в различные виртуальные адресные пространства, при этом возможно использование в каждом процессе разных виртуальных адресов. Отображение не обязательно требует физического перемещения реальных данных или программ (хотя бывает и так);

· уникальный идентификационный номер, называемый идентификатором процесса;

· один или несколько потоков управления.

Поток - это внутренняя составляющая процесса, которой операционная система выделяет процессорное время. Каждый процесс должен иметь, по крайней мере, один поток.  Поток включает:

· текущее состояние регистров процессора;

· два стека, один из которых используется при выполнении в режиме ядра,

второй - при выполнении в пользовательском режиме;

· участок памяти для работы подсистем, библиотеки времени выполнения,

· динамические библиотеки;

· уникальный идентификатор, называемый идентификатором потока.

Состояние регистров, содержимое стека и области памяти называют контекстом
 потока.                                                                                                 

Основное назначение потоков - дать процессу возможность поддерживать несколько ветвей управления, то есть выполнять больше «дел» одновременно. В многопроцессорной конфигурации (компьютер с двумя и более процессорами) Windows NT  может назначать разные потоки разным процессорам в различные моменты времени, обеспечивая действительно параллельную обработку. В однопроцессорной конфигурации процессор должен выделять кванты времени каждому исполняемому в данный момент потоку.


Состояния потоков

Потоки могут находиться в одном из нескольких состояний:

· Ready (готов) – находящийся в пуле (pool) потоков, ожидающих выполнения;

· Running (выполнение) - выполняющийся на процессоре;

· Waiting (ожидание), также называется idle или suspended, приостановленный - в состоянии ожидания, которое завершается тем, что поток начинает выполняться (состояние Running) или переходит в состояние Ready;

· Terminated (завершение) - завершено выполнение всех команд потока. Впоследствии его можно удалить. Если поток не удален, система может вновь установить его в исходное состояние для последующего использования.

Приоритет потоков

Термин многозадачность (мультипрограммирование)  обозначает возможность управлять несколькими процессами (или несколькими потоками) на базе одного процессора. Многопроцессорной обработкой  называется управление некоторым числом процессов или потоков на нескольких процессорах.

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

Уровни приоритета потоков

Win32 является многопоточной (multithreaded) ОС, что определяет ее многозадачность. В ней реализована модель вытесняющей (preemptive) многозадачности, в которой операционная система решает, когда каждый поток получает процессорное время, выделяемое квантами времени (time slices), и сколько именно времени выделяется. Временной интервал, выделяемый потокам для выполнения,  в Windows называется квантом.

Продолжительность кванта времени зависит от аппаратуры и может фактически меняться от потока к потоку. Например, базовое значение в Windows 95 со составляет 20 мс, для Windows NT Workstation (на базе процессора Pentium) -30 мс, для Windows NT Server - 180 мс.

Каждый поток в системе имеет уровень приоритета (priority level), который представляет собой число в диапазоне от 0 до 31. Ниже перечислено то самое основное, что нужно знать:

· если существуют какие-либо потоки с приоритетом 31, которые требуют процессорного времени, то есть не находятся в состоянии ожидания (not idle), операционная система перебирает эти потоки (независимо от того, каким процессам они принадлежат), выделяя по очереди каждому из них кванты времени. Потокам с более низким приоритетом кванты времени совсем не выделяются, поэтому они не выполняются. Если нет активных потоков с приоритетом 31, операционная система ищет активные потоки с уровнем приоритета 30 и т.д. Однако потоки довольно часто простаивают. Тот факт, что приложение загружено, не означает, что все его потоки активны. Поэтому у потоков с более низким приоритетом все же есть возможность работать. Более того, если пользователь нажимает клавишу, относящуюся к процессу, потоки которого простаивают, операционная система временно выделяет процессорное время соответствующему потоку, чтобы он мог обработать нажатие клавиши;

· приоритет 0 зарезервирован исключительно за специальным системным потоком, который называется потоком нулевой страницы (zero page thread). Он освобождает незадействованные области памяти. Существует также поток idle, который работает с уровнем приоритета 0, опрашивая систему в поисках какой-нибудь работы;

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

· для того чтобы перейти с одного потока на другой, система осуществляет переключение контекста (context switch). Это процедура, сохраняющая состояние процессора (регистров и стека) и загрузки соответствующих значений другого потока.

Дескрипторы модулей

Каждый модуль (DLL, OCX, DRV и т.д.), загруженный в пространство процесса, имеет свой дескриптор (module handle), называемый также логическим номером экземпляра (instance handle). В 16-разрядной Windows данными терминами обозначались разные объекты, в 32-разрядной системе это один и тот же объект.

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

Базовый адрес загрузочного (ЕХЕ) модуля, создаваемого VC++, по умолчанию имеет значение &Н400000. Однако программист в VC++ может изменить этот адрес по умолчанию, и есть серьезные основания поступать именно так для того, чтобы избежать конфликта с другими модулями (перераспределение памяти, связанное с конфликтом базовых адресов, требует слишком большого объема физической памяти и временных затрат). Кроме того, модули, создаваемые другими программными средами, могут иметь другие базовые адреса, устанавливаемые по умолчанию.

Дескрипторы модулей часто используются для вызова API-функций, которые выделяют ресурсы данному процессу. Например, функция LoadBitmap загружает ресурс растровой картинки из загрузочного файла данного процесса.  Ее декларация записывается так:

HBITMAP LoadBitmap(

HINSTANCE hInstance,    // Дескриптор экземпляра приложения.

 LPCTSTR IpBitmapeName  // Адрес имени ресурса растровой картинки.

 );

Обратите внимание на то, что дескриптор модуля загрузочного файла процесса часто ошибочно называют дескриптором модуля процесса, а об имени загрузочного файла говорят как об имени модуля процесса.

Идентификация процесса

Следующие четыре объекта часто встречаются в программировании API, связанном с процессами:

· идентификатор процесса;

· дескриптор процесса;

· полное имя загрузочного файла;

· дескриптор модуля загрузочного файла процесса.

Псевдодескрипторы процессов

 Функция GetcurrentProcess возвращает псевдодескриптор текущего процесса:

HANDLE GetCurrentProcess ( VOID )

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

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

Windows предоставляет возможность получения настоящего дескриптора по псевдодескриптору при помощи API-функции DuplicateHandle.  Она определяется так:

 

BOOL DuplicateHandle (

HANDLE hSourceProcessHandle ,        // Дескриптор процесса-источника.
HANDLE hSourceHandle ,            // Копируемый дескриптор.
HANDLE hTargetProcessHandle ,          // Дескриптор процесса-приемника.
LPHANDLE IpTargetHandle ,             // Указатель на копию дескриптора.
DWORD dwDesiredAccess ,                // Доступ к копии дескриптора.
BOOL bInheritHandle ,                        // Флаг наследования дескриптора.
DWORD dwOptions                             // Необязательные опции.

)

С использованием выше приведенных API-функций можно разработать программу 

(второе задание в лабораторной работе), которая будет выполнять следующее:

1. Используя функцию GetCurrentProcessId определяет идентификатор текущего процесса.

2. Используя функцию GetCurrentProcess  определяет псевдодескриптор текущего процесса.

3. Используя функцию DuplicateHandl и значение псевдодескриптора определяет дескриптора текущего процесса.

4. Используя функцию OpenProcess определяет копию дескриптора текущего процесса.

5. Закрывает дескриптор, полученный функцией DuplicateHandl .

6. Закрывает дескриптор, полученный функцией OpenProcess .

 

Настоящий дескриптор обязательно должен быть закрыт, а псевдодескриптор закрывать не нужно. Вывод на компьютере может быть таким:

Идентификатор текущего процесса: 183

Псевдодескриптор: 4294967295

Дескриптор, полученный функцией DuplicateHandle : 412

Дескриптор, полученный функцией OpenProcess : 392

Закрываем дескриптор, полученный функцией OpenProcess : 392

Закрываем дескриптор, полученный функцией DuplicateHandle : 412







Перечисление процессов

Рассмотрим  проблему  перечисления процессов, потоков и модулей в  операционной системе Windows (это третье задание в этой работе). Способы ее решения в Windows NT и Windows 9x  различны.

    Перечисление процессов в Windows 9x (использование ToolHelp32)

ToolHelp32 — это семейство функций и процедур, составляющих подмножество Win32 API, которые позволяют получить сведения о некоторых низкоуровневых аспектах работы ОС, В частности, сюда входят функции, с помощью которых можно получить информацию обо всех процессах, выполняющихся в системе в данный момент, а также потоках, модулях, принадлежащих каждому процессу. Большинство данных, получаемых от функций ToolHelp32, используется главным образом приложениями, которые должны заглядывать "внутрь" ОС.

Семейство процедур и функций ToolHelp32 API доступно только в варианте
 реализации Win32 для Windows 95/98. В среде Windows NT вызов их приведет
к нарушению системы защиты и безопасности NT-процессов. Поэтому приложения, которые используют функции ToolHelp32, работоспособны только под
управлением Windows 95/98, но не Windows NT.

Типы и определения функций ТооlНе1р32 размещаются в модуле TlHelp32, поэтому при работе с этими функциями не забудьте включить его имя в список инструкции uses ( в Delphi).




Моментальные снимки

Благодаря многозадачной природе среды Win32 такие объекты, как процессы, потоки, модули и т.п., постоянно создаются, разрушаются и модифицируются. И поскольку состояние компьютера непрерывно изменяется, системная информация, которая, возможно, будет иметь значение в данный момент, через секунду уже никого не заинтересует. Например, предположим, что вы хотите написать программу для регистрации всех модулей, загруженных в систему. Поскольку операционная система в любое время может прервать выполнение потока, отрабатывающего вашу программу, чтобы предоставить какие-то кванты времени другому потоку в системе, модули теоретически могут создаваться и разрушаться даже в момент выборки информации о них.

В этой динамической среде имело бы смысл на мгновение заморозить систему, чтобы получить такую системную информацию. В ТооlНе1р32 не предусмотрено средств замораживания системы, но есть функция, с помощью которой можно сделать "снимок" системы в заданный момент времени. Эта функция называется CreateToolhelp32Snapshot(), и ее объявление  (в Delphi) выглядит следующим образом:

function CreateToolhelp32Snapshot(dwFlags, th32ProcesslD: DWORD): THandle; stdcall;

• Параметр dwFlags означает тип информации, подлежащий включению в моментальный снимок. Этот параметр может иметь одно из перечисленных в таблице значений.

 

Значение Описание
TH32CS_INHERIT Означает, что дескриптор снимка будет наследуемым
TH32CS_SNAPALL   Эквивалентно заданию значений TH32CS_snapheaplist, TH32CS_SNAPMODULE, TH32CS_SNAPPROCESS И TH32CS_SNAPTHREAD
TH32CS_SNAPHEAPLIST Включает в снимок список куч заданного процесса Win32
TH32CS_SNAPMODULE Включает в снимок список модулей заданного процесса Win32
TH32CS_SNAPPROCESS Включает в снимок список процессов Win32
TH32CS_ SNAPTHREAD Включает в снимок список потоков Win32

 

• Функция CreateToolhelp32Snapshot() возвращает дескриптор созданного снимка или -1 в случае ошибки. Возвращаемый дескриптор работает подобно другим дескрипторам Win32 относительно процессов и потоков, для которых он действителен.

Следующий код создает дескриптор снимка, который содержит информацию обо всех процессах, загруженных в настоящий момент (EToolHelpError — это исключительная ситуация, определенная программистом):

var

Snap: THandle;

begin

Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if Snap = -1 then

raise EToolHelpError.Create('CreateToolHelp32Snapshot failed');

 end;

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

СОДЕРЖАНИЕ ОТЧЕТА

1. Наименование лабораторной работы, ее цель.

2. Программа, которая

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

· будет выполнять последовательно по шагам следующее:

§ Используя функцию GetCurrentProcessId определит идентификатор текущего процесса.

§ Используя функцию GetCurrentProcess  определит псевдодескриптор текущего процесса.

§ Используя функцию DuplicateHandl и значение псевдодескриптора определит дескриптора текущего процесса.

§ Используя функцию OpenProcess определит копию дескриптора текущего процесса.

§ Закроет дескриптор, полученный функцией DuplicateHandl .

§ Закроет дескриптор, полученный функцией OpenProcess .

 

· выдает список перечисления всех  процессов, потоков, модулей и их свойства в системе: 

§ для Windows NT ( и список загруженных драйверов устройств).

 

3. Примеры разработанных приложений (результаты и тексты программ).

 

Цель работы: получение практических навыков при использовании Win 32 API для исследования процессов

 

Процесс - это исполняемый экземпляр приложения и набор ресурсов, которые выделяются данному исполняемому приложению. Ресурсами являются:

· виртуальное адресное пространство;

· системные ресурсы, такие как растровые изображения, файлы, области памяти и т.д.;

· модули процесса, то есть исполняемые модули, которые отображены (загружены) в его адресное пространство. Это могут быть динамические библиотеки (DLI), драйверы (DRV) и управляющие элементы (OCX), основной загрузочный модуль (ЕХЕ) процесса, который иногда называют собственно модулем. Модуль данных (или программный модуль) может  находиться на диске, или может быть загружен в физическую память (RAM). Правда, термин «загружен» (loaded) имеет иное значение, относящееся к виртуальному адресному пространству процесса. Здесь больше подходит термин «отображен» (mapped), так как само отображение - это просто назначение виртуальным адресам физических адресов. После того как модуль загружен в физическую память, его физические адреса могут отображаться в различные виртуальные адресные пространства, при этом возможно использование в каждом процессе разных виртуальных адресов. Отображение не обязательно требует физического перемещения реальных данных или программ (хотя бывает и так);

· уникальный идентификационный номер, называемый идентификатором процесса;

· один или несколько потоков управления.

Поток - это внутренняя составляющая процесса, которой операционная система выделяет процессорное время. Каждый процесс должен иметь, по крайней мере, один поток.  Поток включает:

· текущее состояние регистров процессора;

· два стека, один из которых используется при выполнении в режиме ядра,

второй - при выполнении в пользовательском режиме;

· участок памяти для работы подсистем, библиотеки времени выполнения,

· динамические библиотеки;

· уникальный идентификатор, называемый идентификатором потока.

Состояние регистров, содержимое стека и области памяти называют контекстом
 потока.                                                                                                 

Основное назначение потоков - дать процессу возможность поддерживать несколько ветвей управления, то есть выполнять больше «дел» одновременно. В многопроцессорной конфигурации (компьютер с двумя и более процессорами) Windows NT  может назначать разные потоки разным процессорам в различные моменты времени, обеспечивая действительно параллельную обработку. В однопроцессорной конфигурации процессор должен выделять кванты времени каждому исполняемому в данный момент потоку.


Состояния потоков

Потоки могут находиться в одном из нескольких состояний:

· Ready (готов) – находящийся в пуле (pool) потоков, ожидающих выполнения;

· Running (выполнение) - выполняющийся на процессоре;

· Waiting (ожидание), также называется idle или suspended, приостановленный - в состоянии ожидания, которое завершается тем, что поток начинает выполняться (состояние Running) или переходит в состояние Ready;

· Terminated (завершение) - завершено выполнение всех команд потока. Впоследствии его можно удалить. Если поток не удален, система может вновь установить его в исходное состояние для последующего использования.

Приоритет потоков

Термин многозадачность (мультипрограммирование)  обозначает возможность управлять несколькими процессами (или несколькими потоками) на базе одного процессора. Многопроцессорной обработкой  называется управление некоторым числом процессов или потоков на нескольких процессорах.

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


Поделиться:



Последнее изменение этой страницы: 2019-03-20; Просмотров: 507; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.072 с.)
Главная | Случайная страница | Обратная связь