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


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



 Функция 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().


Поделиться:



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


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