Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы / Задания / ЛР 2 ПРОЦЕССЫ И ПОТОКИ

.pdf
Скачиваний:
21
Добавлен:
15.02.2021
Размер:
345.59 Кб
Скачать

HMODULE GetModuleHandle(

 

 

 

LPCTSTR IpModuleName

//

Имя модуля.

 

);

 

 

 

 

 

Сиспользованием

приведенных

API-функцийможноразработатьфункцию

(перзаданиевлабораторнойоеработе

 

),которая принимаядескриптор,имяили

олное имя

модуля,возврдваугиеащаетэлемента

 

 

 

своихвыпарамодных

етрах.Возможнычетыре

варианабоэтойфункции.Напры: мер

 

 

 

 

 

1. Получитьдескриптор,имяполноеимяЕХЕ

 

 

.

 

Handle:

&HFFFFFFFF

 

 

 

Name: VB6.EXE

 

 

 

 

FName: G:\Visual Studio\VB98\VB6.EXE

 

2. Получитьимяполнмодуляе

 

 

.

 

Задаем: Handle: &H77E70000

 

 

 

Получаем:

 

 

 

 

Name: User32.dll

 

 

 

 

FName: G:\WINNT\system32\USER32.DLL

 

3. Получитьдескрполноеимяптор

 

 

.

 

Задаем: Name: User32.dll

 

 

 

Получаем:

 

 

 

 

Handle: &H77E70000

 

 

 

FName: G:\WINNT\system32\USER32.DLL

 

4. Получить дескриптор и имя.

 

 

 

Задаем:

FName: G:\WINNT\system32\USER32.DLL

 

Получаем:

 

 

 

 

Handle: &H77E70000

 

 

 

Name: User32.dll

 

 

 

 

Получентекущегоидентификаторапроцесса

Чтобыполучиидентекущегоьификаторпроце,можноспсафунльзовать

 

 

кцию

GetCurrentProcessId,объяв ление которойвыглядиттак:

 

 

DWORD GetCurrentProcess ID(VOID)

 

 

Этафункциявозвращаетидент

ификаторпроцесса.З

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

 

можбытьвведиапазонерхнем

unsigned long, поэтомуможетпотребпреоватьсябразов

ание

возвращаемогозначения.Следует

 

такжеучесть,чтоданнаяфункциярабтовтльаеткущемо

 

 

процессе.Несуще

ствуетспособа

определитьидентификатордру

гогопроцесса,кромекак

 

получитьсписоквсехпроцессвыбраизнегототвь

 

процесс,характеристи

кикоторого

требуются.

 

 

 

 

Полученидентификаторапроокнаецесса

 

 

 

Существует функция FindWindow.Онаобъявляетсяследую

щимобразом:

 

HWND FindWindow(

 

 

 

 

LPCTSTR IpClassName,

 

//Указательнаимякласса.

 

 

LPCTSTR IpWindowName

//Указательнаимяокна.

 

 

);

 

 

 

 

Функцияиспоимлилиьассазагуетокнадляловокполучендескрипторая

 

 

окна. Имея

дескриптор,можновызватьфункцию

GetWindowThreadProcessId, возвращающуюидентификатор

потока,котс данноездалрый

окно,идентифика

торп ,оцессакоторомупринадлежитданный

 

поток.Синтаксисвыглядит:

 

 

 

 

DWORD GetWindowThreadProcessId(

 

 

 

HMD hWnd,

 

//Дескрипторокна.

 

LPDWORD IpdwProcessId

 

//Адреспереме

ннойдляидентификатора

 

 

//процесса.

 

 

);

Даннаяфункциявозвращаетидентификаторпотока.Кр,еслимегоейпередается

указательна DWORD в IpdwProcessIdl(), вцелпеременнойвойвоз вращаеидентсяификатор процесса.

Получениеимд скрипторовмодулей

Обычноодномупроцессупринадлежитмнмодул,загруженныхго в гой

 

 

адресное

пространство,иэто

 

усложнязадачуполдескрчентипя

торовиме

нмодулей.

Для Windows 9x

и Windows NT необходимо использоватьсовершенноразныеметоды

.

 

Windows NT

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

 

мой PSAPI.DLL,

чтоозначает

API состоянияпроцесса(

Process Status API)Эта.

библи,несовместимаятека

Windows 9x,экспортируетфункциипер

ечисления всехпроцесдрайвероввсиствсехме

 

устройств.Онапред ставляетзмож

 

ностьполученияинформацииобовсемодулях,исполняемых

 

 

даннымпроцессом.

 

Для перечисленияпотоковоперационнойсистеме

Windows NT нужно

использоватьдинамическуюбиб

лиотеку PDH.DLL,чтоозначаетвспомогательная« системадля

 

оценкихарактеристикпроизводительности» (

Performance Data Helper),которая

поставляется

комплектеинструментальныхср дств

NT Resource Toolkit.

 

 

Сдругойстороны

Windows

9хподдерживаетфункции

Toolhelp (вспомога тельные

средства)своейверсиидинамическойбиблиотеки

KERNEL32.DLL. Ониисподльзуются

фиксациисостоянияоблп любмятистипр.оюцесса

Используяэтотснимок« »па, ожнояти

 

полюбуюучитьинформациютеку

 

 

щихпроцессах,такжем

 

одуляхипотокахкаждого

 

 

процесса(

вотли чиеот

PSAPI.DLL здесьотсутствуети

нфодрайверахрмацияустройств

 

).

 

Такимобразом,

для Windows NT и Windows 9x придетсяписать

разныепрограммы.

 

 

 

 

 

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

 

 

 

 

Функция 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ВсредеWindowsвызових95/98приведет. NT

 

 

 

 

кнарушенсистемызащитыбезопасностиюNT

 

 

-процесс.Поэтприло,которыемувжения

используютфункции ToolH

 

elp32,работолькоподспособны

 

 

управлеWindowsноием 95/98,

indows NT.

 

 

 

ТиопределенияыфункцийТоо

 

lНе1р32размещаютсявмодулеTlHelp32,поэтомупри

 

работесэтимифунзабудьтекциямивключегоимяспинструкциитьсокuses (

 

 

 

в Delphi).

 

 

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

 

 

БлагодамногозадачнойпрсредыиродеяWin32такие

 

 

 

бъекты,какпроцессы,потоки,

модулит.п.по, создразрушаютсятоянно, имодифицируются.Ипосостояниекольку

 

 

 

 

компьютеранепрерывноизменя,системнаяинформацтся,кот,в раязможно,будетиметья

 

 

 

 

значевданныймоментие,чсекундурезуженикого

 

 

 

 

незаинтересует.Например,

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

 

 

 

всистему.Посколькуоперационнаясистевлюбоевремможпрвыполнениерватьпотока,

 

 

 

отрабвапрограммутывающегошу,чтобыпредоставить

 

 

какие-токвантывременидругому

 

потокувсистеме,модулитеоретическимогутсоздразрушатьсяватьсядажемомент

 

 

 

 

выборкиинформации. х

 

 

 

 

Вэтойдинамическойсредеимбысмыслломгновениезаморозитьсис,ч емуобы

 

 

 

получитьта

куюсистемнуюинформаци

 

ю.ВТоо

lНе1р32непредусмосредстврено

 

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

 

 

 

 

систезаданныйв момвр.еЭтантмефуназываетсякцияCreateToolhelp32

 

Snapshot(),иее

 

объявление (в 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().

 

 

Обрабинфопроцессахткамации

 

Имеядес

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

 

двумяфункциямиToolHelp32,котпорыезвпоследляютпросведениявательномотретьобо

 

всехпроцессахвсистеме.Функции

Process32First() и Process32Next() определены следующим

образом:

 

 

 

function Process32First(hSnapshot: THandle; var Ippe: TProcessEntry32): BOOL; stdcall; function Process32Next(hSnapshot: THandle; var Ippe: TProcessEntry32): BOOL; stdcall;

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

функциейCreateToolhelp32Snapshot

().

Второйпарам, Ippe,представляеттрсобойзаписьTProcessEntry32,котоперпоедаетсяая

 

ссылке.Помепреохпэлемождперечисленфункцииятамбудутзаполнятьэтузапис

 

информациейследующемпроцес.Запись

TProcessEntry32 определяется так:

type TProcessEntry32 = record

 

dwSize: DWORD;

 

cntUsage: DWORD;

 

th32ProcessID: DWORD;

 

th32DefaultHeapID: DWORD;

 

th32ModuleID: DWORD;

 

cntThreads: DWORD;

 

th32ParentProcessID: DWORD;

 

pcPriClassBase: Longint;

 

dwFlags; DWORD;

 

szExeFile: array[Q..MAX_PATH - 1] of Char;

 

end;

 

•ВполеdwSizeсодержитразапимерTProcessEntry32сияДоиспользованияэтой .

 

заполеисиdwSizeдолжнобытьинициализированозначениемSizeOf (TProcessEntry32).

 

•ВполеcntUsageхразнаитсячение

етчикассылокпроцесса.Когдаэтозн чение

станетравнымнулю,операционнаясистемавыг .узитоцесс

 

•Вполеth32ProcessIDсодержитсяидентификационныйномерпроцесса.

 

•Полеth32DefaultHeapIDпредляназхраидентификаторааченоия{ID}длякучи

 

проц,дейсспоумолчаниютвующей.ЭтотимеетIDзначениетолькодляфункций

 

ToolHelp32,иегонельзяиспользоватьдругимифункциямиWin32.

 

•ПолеthHodulelDидентифицируимеетмодуль,связанныйпроц.Этоессомле значениетолькодляфункцийToolH elp32.

•ПозначениюполяcntThreadsможносудитьтом,сколькопотоковначаловып лняться вданнпр.оцессем

•Полеth32ParentProcessIDидентифицируетродитепроцессданнльскийя.оцессаго

•ВполеpcPriClassBaseхранитсябазовыйприоритетпроцес используетэтозначениедляуправленияработо, ковй

•ПолеdwFlagsзарезервировано.

•ВполеszExeFileсодержитсястрокаогр ничивающимуль представляетсобойпутьимяфайлаЕХЕ процессом.

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

функциюProcess32Next()дотехпор, нкавернетзнач Дляотобрзнвместеачкаженияименемприложения,что

профессможвид, испнола ьзоватьный

са.Операционнаясистема

 

-символом,которая

-программыилидрайвера

,связданнымого

ениеFalse.

ридастпрограммеболее

API-функцию ExtractIcon измодуля ShellAPI.

 

Обрабинформациипотокахтка

Длясоставленияспискапотонекопртвоцесрого

савToolHelp32предусмотреныдве

функции,которыеаналогичныфункциям,предназначеннымдлярегистрациипроцессов:

 

Thread32First()иThread32NextЭти

().

функции объявляются следующим образом;

function Thread32First(hSnapshot: THandle; var Ipte: TThreadEntry32): BOOL; stdcall;

ПомимообычногопараметраhSnapshot,этимфункциямтакжеперпоссылкедается

 

параметртипаTThreadEntry32Какивслучаефункций,работающихспроцесс.,кажднз мия

 

нихзаполняетзаписьTThreadEntry32,объявлениекоторойимеетвид

 

type

 

 

TThreadEntry32 = record

 

dwSize: DWORD;

 

cntUsage: DWORD;

 

th32ThreadID: DWORD;

 

th32OwnerprocessiD: Dword;

 

tpBasePri: Longint;

 

tpDeltaPri: Longint;

 

dwFlags: DWORD;

 

end;

 

 

•ПолеdwSizeопрелеляетразмерзаписи,поэтондобытьмулжноинициализи

ровано

значениемSizeOfдоиспользования(TThreadEntry32)этойзаписи.

 

•ВполеcntUsageсодержитсясчетчикссылокданногопот.Приобнулениикаэтого счетчипотовыгружкоперационнойсистемойется.

•Полеth32ThreadIDпредставляетсобойидентификаци онныйномерпот,которыйка имеетзначениетолькодляфункцийToolHelp32.

•Вполеth320wnerProcessIDсодержитсяидентификаткоторому(ID)процесса,

принданныйпотокдлеж.ЭтотIDможноитспсдругимильзоватьфункциямиWin32.

•ПолеtpBasePriпред ставляетсобойбазовыйклассприоритетапотока.Этозначение одинаководлявсехпотоковданнпр.Возможныецессагознэтогоченияп лябычнолежатв диапазонеотдо424Описанияэтих. значенийприведеныследующейтаблице.

Значение

Описание

4

Ожидающий

8

Нормальный

13

Высокий

24

Реальноевремя

• ПолеtpDeltaPriпредставляетсобойдельта

 

-приоритетразницу(),определяющий

 

величотлреальнинучияприоритетаотзначениягоtpBasePriЭточислосознаком,которое.в

 

 

 

сочетаниибазовымклассомприори

теотображаетобщприпотй.Критетоканстанты,

 

определенныедлявсехвозможныхзначдельтаний

 

-приоритета,перечисленыв

следующей

таблице.

 

 

 

Константа

 

Значение

 

THREAD_PRIORITY_IDLE

 

-15

 

THREAD_PRIOR ITY_LOWEST

 

-2

 

THREAD PRIORITY BELOW NORMAL

-1

 

THREAD_PRIOR IT Y_NORMAL

 

0

 

THREAD_PRIOR I TY_ABOVE_NORHAL

1

 

THREAD_PRIOR ITY_H IGHEST

 

2

 

THREAD_PRI OR ITY_TIME_CRIT ICAL

15

 

• ПолеdwFlagsвданныймоментзарезервирнедолжноисп .ванользваться

 

 

Спискипот, оковлученныеспомощьюфункцийToolHel

p32не

связываются

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

 

ьнопроверять

результат,такчтопотокибысвязанылнтересующимвасп

роцессом.

 

 

Обрабинформациимодуляхтка

 

Опросмодулейвыполняетсяпрактическитакже,

копроцессовилипотоков.Для

 

этоговТо

lНе1р32предусмотреныдвефункц: Module32First()ииModule32Next(),которые

 

опредслеобразомляду:ютсящим

 

 

function Module32First(hSnapshot: THandle; var Ipme: TModuleEtitry32): BOOL; stdcall;

function Module32Next(hSnapshot: THandle; var Ipme: TModuleEntry32): BOOL; stdcall;

Первымпараобфункцияхеихтромявляетсядескрсн,авторымимкаптор

 

var-

параметром — запись TModuleEntry32Ее.

определение имеет следующий вид:

 

type TModuleEntry32 = record

 

 

dwSize: DWORD;

 

 

th32HoduleID: DWORD;

 

 

th32ProcessID: DWORD;

 

 

GlblcntUsage: DWORD;

 

 

ProccntUsage: DWORD;

 

 

modBaseAddr: PBYTE;

 

 

modBaseSize: DWORD;

 

 

hHodule: HMODULE;

 

 

szModule: array[0 .. MAX_MODULE_NAME32 + 1] of Char;

 

szExePath: array[0 .. MAX_PATH + 1] of Char;

 

end;

 

 

 

• Поле dwSize определяет размер записи и поэтомудолжнобытьинициализировано

 

значениемSizeOfдоиспользования(TModuleEntry32)этойзаписи.

 

 

•Полеth32ModuleIDпредставляетсобойидентифмодуля,которыйимееткаторзначение

 

 

толькодляфункцийТоо1Не1

р32.

 

 

•Полеth32processсодержитидентификатор(ID

)опрашиваемогопроцесса.Э

тотID

можноиспсдругимильзоватьфункциямиWin32.

 

 

•ПолеGlblcntUsageсодержитглобальныйсчетчикссылокданногомодуля.

 

 

•ПолеProccntUsageсодержитсчетчикссылокмодул

явконтекстепроцесса

-владельца.

• ПолеmodBaseAddrпредставляетсобойбазовыйадресмодуляпам.Этозначениети

 

 

дейсттольковконтекстеительиде процессатификатораth32Process

ID.

 

•ПолеmodBaseSizeопределяетразмерв(байтах)модулявпам. ти

 

 

• ВполеhHoduleсодержитсядескриптормодуля.Этозначениедейсттольковительно

 

 

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

 

 

•ВполеszHodoleсодержитсястрокаименеммодуля,завершающаясянуль

 

-символом.

• ПолеszExepathпредназначенодляхран

ениястрограничивающимки нуль

-

символ,содержащейп путьмлныймодуля.