Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Псевдодескрипторы процессов ⇐ ПредыдущаяСтр 4 из 4
Функция GetcurrentProcess возвращает псевдодескриптор текущего процесса: HANDLE GetCurrentProcess ( VOID ) Псевдодескриптор (pseudohandle) представляет собой упрощенный вариант дескриптора. По определению, псевдодескриптор - это зависимое от процесса число, которое служит идентификатором процесса и может использоваться в вызовах тех API-функций, которым требуемся дескриптор процесса. Хотя назначение псевдодескрипторов и обычных дескрипторов почти одно и то же, у них все же есть некоторые существенные различия. Псевдодескрипторы не могут наследоваться порожденными процессами, как настоящие дескрипторы (real handler). К тому же псевдодескрипторы ссылаются только на текущий процесс, а настоящие дескрипторы могут ссылаться и на внешний (foreign). Windows предоставляет возможность получения настоящего дескриптора по псевдодескриптору при помощи API-функции DuplicateHandle. Она определяется так:
BOOL DuplicateHandle ( HANDLE hSourceProcessHandle , // Дескриптор процесса-источника. ) С использованием выше приведенных 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 доступно только в варианте Типы и определения функций ТооlНе1р32 размещаются в модуле TlHelp32, поэтому при работе с этими функциями не забудьте включить его имя в список инструкции uses ( в Delphi). Моментальные снимки Благодаря многозадачной природе среды Win32 такие объекты, как процессы, потоки, модули и т.п., постоянно создаются, разрушаются и модифицируются. И поскольку состояние компьютера непрерывно изменяется, системная информация, которая, возможно, будет иметь значение в данный момент, через секунду уже никого не заинтересует. Например, предположим, что вы хотите написать программу для регистрации всех модулей, загруженных в систему. Поскольку операционная система в любое время может прервать выполнение потока, отрабатывающего вашу программу, чтобы предоставить какие-то кванты времени другому потоку в системе, модули теоретически могут создаваться и разрушаться даже в момент выборки информации о них. В этой динамической среде имело бы смысл на мгновение заморозить систему, чтобы получить такую системную информацию. В ТооlНе1р32 не предусмотрено средств замораживания системы, но есть функция, с помощью которой можно сделать "снимок" системы в заданный момент времени. Эта функция называется CreateToolhelp32Snapshot(), и ее объявление (в Delphi) выглядит следующим образом: function CreateToolhelp32Snapshot(dwFlags, th32ProcesslD: DWORD): THandle; stdcall; • Параметр dwFlags означает тип информации, подлежащий включению в моментальный снимок. Этот параметр может иметь одно из перечисленных в таблице значений.
• Функция 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; Просмотров: 882; Нарушение авторского права страницы