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

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

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

 

 

 

Лабораторнаяработа№

2

 

 

 

 

 

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

 

 

 

 

Цельработы:

получепрактическихнавыковие

использования Win32

 

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),который

представляетсобойчислодиапазонедо031Нижеперечислено. тосамоеосновное,что

 

 

 

 

 

 

нужнознать:

 

 

 

 

 

 

 

 

еслиуществуюткакие

-либоп

отокиспр оритетомко31,ребуюторые

 

процессорнвремени,тоестьненаходятсясостояниигоожидания(

 

not idle),

операционнаясистемаперебираетэтипотокинезависимо( того,какимпроцессам

 

 

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

 

 

времени.Потокамс

болеенизки

приоритетомквантывременисо

всемневыделяются,поэтомуни

 

выполняю.Еслинетактивныхсприоритетомсяок31,операционнаявсистема

 

 

ищетактивныепотокисуровнемприоритета30

 

ит.д.Однако

потокидовольночасто

простаивают.Тотфакт,чтоприложезагружено,неоз,чтовсеачаетиеегопотоки

 

 

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

 

 

раб.Болеетоготать,еслипользовнажимаеткл,относящуюсятельвишукпроцессу,

 

 

потокикоторого

 

простаивают,операционнаясиствремвыделяетенно

 

процессорноевремясоответствпот,чтобымогкунобработатьющемунажатие клавиши;

приозарез0 итисключительнорвированзаспец стемнымальнымпот, око

которназпотокомываенулевойс сяраницы

(zero page thread)Оносвобождает.

незадействованныеоблп .Существуетмястииакжепоток

idle,которыйработаетс

уровнемпри0,прашиваяритесиспоискахтемукакой

-нибудьработы;

еслипотокпроизвольнымприоритевыполнятомомт,когдометсянт

апотокус

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

потсбо.льшимкуТак

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

емуквремениант;

 

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

переключениеконтекста(

context switch)Этопроцедура. ,сохраняющаясостояние

 

процерегистров( стексора)

 

загрузкисоответствующихзначенийдругого

 

потока.

 

 

 

 

 

Назначениеприоритетапотоку

 

 

Назначениепотоку

приоритетапроисхвдваэтапа.Водит

-первых,каждпрвоцессуму

моментсозданияприсвклприоритетаиваетсясс.Узнклассприоритетатьможнос

 

 

 

помощьюфункци

и GetPriorityClass,аизменить

- спомощьюфункции

SetPriorityClass.Ниже

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

 

 

 

используютсяэтимивышеупомянутымифункциямикак( сфункцией

 

 

CreateProcess).

Имякласса

Уровень

 

Символьнаяконстанта

 

приоритета

приоритетакласса

 

 

 

Idle

4

IDLE_PRIORITY_CLASS=&H40

Normal

8

NORMAL_PRIORITY_CLASS=&H20

High

13

HIGH_ PRIORITY_CLASS=&H80

Realtime

24

REALTIME_ PRIORITY_CLASS=&H100

Большинпроцедолжнполучствосов

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

Normal (обычный).

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

 

 

болееуместприоритетназначать

Idle (ожида)Наз. приоритетаначения

Realtime

(реальноговремени)обычноследуизб,пегать

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

 

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

 

 

клавиатурымыши,очисткикэшаобработкинажатияклав ш

 

Ctrl+Alt+Del.Такой

приориможетбыподходящимьетдлякрат,кросрочных

итичнквремениыполнениях

процессвзаимодейс,которыеотносятсяаппара. туройвию

 

 

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

 

 

уровнюклассаприоритетапроцесса,создапотокнныйвш.Темменеего,можно

 

 

использоватьфункцию SetThreadPriority,чтобыизмениприот:ритетьока

 

BOOL SetThreadPriority (

 

 

НANDLЕ hThread,

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

 

int nPriority

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

 

);

 

 

Параметр nPriority использудляизмприоритетанениятсяпотокаотносительно

приорипроцесса,которомупринадлежитетаданныйпот.Возначениякможныепараметра nPriority иэффектихвоздействиянауровеньприоритетапотокаприведниж: ены

_______________________________________________________________________

Константа Уровеньприоритетапотоков

_______________________________________________________________________

THREAD_PRIORITY_NORMAL

Уровеньприоритетакласса

 

THREAD_PRIORITY_ABOVE_NORMAL

Уровень приоритета класса + 1

THREAD_PRIORITY_BELOW_N0RMAL

Уровень приоритета класса - 1

THREAD_PRIORITY_HIGHEST

Уровень приоритета класса + 2

THREAD_PRIORITY_LOWEST

Уровеньприоритетакласса

- 2

THREAD_PRIORITY_IDLE

Устанауроприоритетавливаетеньдля1

 

всехкласспроцессовприоритетаза

 

исключением

Realtime.Вэтомслучае

 

устанавливаетуровеньприоритета16.

THREAD_PRIORITY_TIME_CRITICAL Устанауроприоритетавливаетень15для

всехкласспроцессовприоритетаза

исключениемRealtimeВэтомслучае.

устанавливаетуровеньприоритета31.

____________________________________________________________________

Повышениеприоритетапотокакв

 

антизмененийприоритета

Диапазонприоротдо1известен15тетакакдиапазондинамприоритеческого

та,а

диапазонот16до31

- какдиапазонприоритетареальноговремени

.

В Windows NT прио,находящритеттокавдинамическомапазоне,йсяможет

временно повышатьсяоперационнойсистемой

 

. Нижнийуровеньприоритетапотока

(установленныйпрограпомощьюмистом

 

 

API фу)называетсякцииуровнемегобазового

приоритетa. API функция Windows NT SetProcessPriorityBoost можетисподльзоваться

разрешенияилизапр

ещенвременныхизмененийяприоритета(

priority boosting).

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

 

 

увеличиваются.

 

 

 

Стремясьплавновыпоперации,лнять

 

Windows будетповышатьпри илиритеттока

увеличиватьпродолжительность

егоквантавремениприследующихусловиях:

еслипотокпринадлежитприо ите,оцессутоь,номуцессукоторого активноимеетфокусввода;

еслипотокпервошелсостояниеыможидания;

еслипотоквыхизсодитстоянияожидания;

еслипотоксов семнеполучапроцвременит.ссорного

Дескрипидентпроцессовификаторы

Разницумеждудескриптоидентификатироцеможнустасоврами

новить,

анализируя API-функцию CreateProcess. ОбъявлениеVC++записывтакимобр: етсязом

 

BOOL CreateProcess(

 

LPCTSTR lpApplicationName,

 

LPTSTR lpCommandLine,

 

LPSECURITY_ATTRIBUTES lpProcessAttributes,

 

LPSECURITY_ATTRIBUTES lpThreadAttributes,

 

BOOL bInheritHandles,

 

DWORD dwCreationFlags,

 

LPVOID lpEnvironment,

 

 

 

LPCTSTR lpCurrentDirectory,

 

 

 

LPSTARTUPINFO lpStartupInfo,

 

 

 

LPPROCESS_INFORMATION lpProcessInformation

 

 

);

 

 

 

 

Параметры API-функцию CreateProcess:

 

 

lpApplicationName, lpCommandLine

- определяютимяисполняемогофайла,которым

 

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

 

передаваемую этомупроцессу.

 

lpProcessAttributes, lpThreadAttributes – этипараметры

позволяютопределитьнужные

 

атрибутызащитыдляобъектовпроцесс« »ипоток«»соответственно.Вэтипараметры

 

 

 

можнозанести

NULL,исистемазакрепитданнымиобъдескрипктзамищитыпооры

 

 

умолчанию.Вкачесальтвеернативыожнобъявитьинициализиров

 

атьдвеструктуры

 

SECURITY_ATTRIBUTES;темсамВсоздадитеымприсвоиобъектеам

«процесс»и

 

«поток»своиатрибутызащиты.

Вид

структуры SECURITY_ATTRIBUTES приведен

ниже:

 

 

 

 

typedef struct _SECURITY_ATTRIBUTES { // sa

 

 

DWORD nLength;

 

 

 

LPVOID lpSecurityDescriptor;

 

 

 

BOOL bInheritHandle;

 

 

 

} SECURITY_ATTRIBUTES;

 

 

 

bInheritHandles - указывает,наслиновыйедовалпроцессдескрипторыотпроцесса

 

 

запроса.ЕслиИСТИНА,каждыйнаследственныйоткрытыйдескпроцессеиптор

 

 

 

запроунановымследованп

роцессом.

 

 

 

dwCreationFlags - определфлаги,влинатоя,какетющиеименносоздаетсяновый

 

 

процесс.Имд флаговетсясять,котмогуткомбинироватьсярыебулевымоператоромОК.

 

 

 

lpEnvironment – указываетнаблокпамяти,хранящийстрокипеременныхокружения,

 

 

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

 

 

 

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

 

енныхокруженияот

 

родительскогопроцесса.

 

 

 

 

lpCurrentDirectory – позволяетустановитекущиедискика. алогь

Еслиегозначение

NULL,рабочийкаталновпроцогбудетже,ссачмиуприложения,его

 

 

 

породившего.

 

 

 

 

lpStartupInfo – этотпарамеуказываетнастр уру

 

STARTUPINFO:

 

typedef struct _STARTUPINFO { // si

 

 

 

DWORD

cb;

 

 

 

LPTSTR lpReserved;

LPTSTR lpDesktop;

LPTSTR lpTitle;

DWORD dwX;

DWORD dwY;

DWORD dwXSize;

DWORD dwYSize;

DWORD dwXCountChars;

DWORD dwYCountChars;

DWORD dwFillAttribute;

DWORD dwFlags;

WORD wShowWindow;

WORD cbReserved2;

LPBYTE lpReserved2;

HANDLE hStdInput;

HANDLE hStdOutput;

HANDLE hStdError;

} STARTUPINFO, *LPSTARTUPINFO;

Элементыструктуры

STARTUPINFO используются Windows-функциямипри

создании

процесса.Приэтомбольшинствоприложенийпорождаетпроцессыатрибутами

 

 

умолчанию.НовэтомслучаеВыдолжны

 

инициализировать всеэлементыструктуры

 

STARTUPINFO хотябы

нулевызначениями,вэлемент

cb – заноситьразмерэтой

 

структуры.

 

 

 

lpProcessInformation – указывает на структуру PROCESS_INFORMATION:

typedef struct _PROCESS_INFORMATION ( HANDLE hProcess;

HANDLE hTHread;

DWORD dwProcessID;

DWORD dwThreadID;

) PROCESS_INFORMATION;

Еечленывсоответстви

исдокуимеютследующентацизнач нияйе

 

:

HProcess возвращаетдескривн вьзданногопроцессатор;

 

 

Hthread возвращаетдескрипторпервич

ного потокавнс вьзданногопро

цесса.

 

Дескрипторисподспецификациильзуетсяданнпотокаввсехго

 

 

 

функциях,которые

 

выполняютоперациисобъектом

Thread;

 

 

 

 

 

DwProcessId

возвращаетглобаль

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

 

 

жизни

 

идентификатора - смоментасозданияпроцдомоментаегосса

 

 

завершения;

 

DwThreId

возвращаетглобальныйидентификаторп

 

 

отока.Времяжи

зни

 

идентификатора - смоментсозданияподомоментаокаегозавершения

 

 

 

.

 

Такимобразом,междудескриптор

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

 

 

ли потока)

существуютследующиеосновныеразл

ичия:

 

 

 

 

 

дескриптордействупределахт

«своего» процесса,

врамкахкоторогоонбылсоздан,

 

в

 

товремякакидентифи

каторработаетнасистемномуровне;

 

 

 

 

 

укаждогопроцесса

есть толькоодинидентификатор,номожбытьсколько

 

 

 

 

 

дескрипторов;

 

 

 

 

 

 

некоторым API-функциямтребуется

идентификатор,ввремякакд у

 

гим -

 

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

 

 

 

 

 

 

 

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

 

 

 

 

одинпроцесс

можимдетскдругьприпт.оИнымицессагословамир,если

 

 

 

процессАимд скрипторет

 

процессаВ,этотдескриидентифицируетрпро

 

цессВ,нодействуеттолькопроцессеА.

 

 

ОнможетиспользоватьсяпроцессеА

 

длявызованекоторых

 

API-функций,которыеимеют

 

отношениекпроцессуВ

(о днакопамятьпроцессаВостает

 

 

сянедоступнойдляпроцессаА

 

).

 

 

 

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

 

 

 

 

Каждыймодуль(

DLL, OCX, DRV ит.д.),загруженный

впространпроце,имеетствоса

 

свой

дескриптор(

module handle),называемыйтакжелогическимномеро

 

 

 

экземпляра(

instance handle)В.

16-разрядной Windows даннымитерминамиобо

 

значались разныеобъекты,в 32

 

-разрядной

сисэтоодинеметотжеобъ

 

ект.

 

 

 

 

 

 

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

 

 

 

 

 

данного

исполняеммодулявадресномпр процестранго.Этообъясняет, твеса

 

 

 

 

почемутакой

дескрипимеетсмыслтольковор

рамкахпроцесса,включающего

 

данныймодуль.

 

 

БазовыйадресзагрузЕХЕ()модуля,создаваемогочного

 

 

 

VC++,поумолча

нимеетю

значениеН&400000

.Однакопрограммиств

VC++можетизменить

 

этотадреспоумолчанию,

 

естьерьезныеоснованияпоступатьименнотак

 

для того,чтобыизбежатьконфликтасдругими

 

 

модулямип(

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

 

 

 

 

 

 

слишкомбольшогообъемафизическойп мятивре

 

 

менныхзатрат

). Крто, гоме

модули,

создаваеругимыеи

прогсраммными,едами

 

огутимет

ьдругиебазо

 

выеадреса,

устанавливпоумолч. аемыению

 

 

 

 

 

 

 

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

 

 

API-функций,которые

 

выделяют

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

 

Например,функция

LoadBitmap загружаетресурсрастровой

картинкииззагру

зочногофайла

даннпр.оцессаго

Еедекла

рациязаписываетсятак:

 

HBITMAP LoadBitmap(

 

 

 

 

 

HINSTANCE hInstance,

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

 

 

LPCTSTR IpBitmapeName

//Адресим нисурса

растровойкартинки

.

);

 

 

 

 

 

 

Обратитевнимание

ачто, де

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

 

сач асто

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

 

 

 

зочногофайлаговоряткак

обимениодуляпроцесса.

 

 

 

 

 

 

 

 

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

 

 

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

 

 

API,

связанномс

процессами:

 

 

 

 

 

 

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

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

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

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

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

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

 

ситле,льногко

но обратная

опеврливозможнаацияядпо(крайнмер,п).еямой

 

 

 

 

Поидентификаторум жнопределдескриптлюбпртьопомогцессар

 

 

 

щьюфункции

OpenProcess:

 

 

 

 

HAMDLE OpenProcess(

 

 

 

 

DWORD dwDesiredAccess,

// Флаг доступа.

 

 

 

BOOL bInheritHandle,

//Флагнаслдедованияскриптора.

 

 

 

DWORD dwProcessID

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

 

 

);

 

 

 

 

 

dwDesiredAccess - имеетотношениекправамдоступаможет

 

приниматьразличные

значения:

 

 

 

 

PROCESS_ALL_ACCESS эквивалентноустановке

флагполногодоступа;в

 

 

PROCESS_DUP_HANDLE используетдескакисходногорипрт,такцессар

 

 

и

 

принимающеговфункции

DuplicateHandle длякопированиядубли(

 

рования)

 

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

 

 

 

 

PROCESS_QUERY_INFORMATTON задейдескптвуетрдляоцессаипчтеор

 

ния

 

информациобъектази

Process;

 

 

 

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

PROCESS_TERMINATE работаетдлязавеп шениясоцегодескрипторомсавфункции

TerminateProcess;

process_vm_read применяетдлячтения

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

 

 

функции ReadProcessMemory;

 

 

 

 

PROCESS_VM_WRITE используетдлязапвв сиртуальнуюпамятьпроцессаего

 

 

 

 

дескрипторвфункции

WriteProcessMernory;

 

 

 

SYNCHRONIZE (Windows NT)работаетдескпроцессаипторомвлюбой

 

из функций

 

ожидания,так

ихкак WaitForSingleObject,дляожиданиязавепр.шенияоцесса

 

bInheritHandle - уставзначениеовлен

True,длятогочтпобы

зволитьпорожденным

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

 

 

 

 

родительскогопроцесса.Отметим,чтозн

 

 

чениедескриптораможетизменяться.

 

 

dwProcessID - должениметьзначеидентификаторатогоиепроцес

 

са,дескоторогориптор

нужуз.натьо

Функция OpenProcess возвращаетдеск

рипторуказанногопроцесса.

 

Полученныйдес

крипторобязателдолжбытзакрыт,еьонслинобольшененужен.Это

 

 

 

делаетсяпутемвызовафункции

 

CloseHandle:

 

 

 

BOOL CloseHandle(

 

 

 

 

HANDLE hObject

// Дескрипторзакрываемого

объекта.

);

 

 

 

 

 

 

 

 

 

 

Именафайловидескрипторымодулей

 

 

 

Перейоти

именифайламодулядескриптмодулянаоборотнесоставру

 

 

 

ляетособого

труда,покрмер,йнвпреойдпроцессаелахного.Функция

 

 

GetModuleFileName принимает

дескриптормодуля,чтобывернутьполноеимя( путь)исполняемогофайла:

 

 

 

 

DWORD GetModuleFileName(

 

 

 

 

HMODULE hModule,

// Дескриптор модуля.

 

LPTSTR IpFilename,

//Указатнабуферль

 

-приемникпутимодулю

.

DWORD nSize

 

// Размербуферавсимволах.

 

 

);

 

 

 

 

 

 

 

Этафункцияра

 

ботаеттолькоизтогпроцесса,дескр

 

иптормодулякоторого

задается.Ее

нельзяиспользовать

 

издругпр.огоцесса

 

 

 

 

Функция GetModuleHandle,которая

акжеприменяетсявнутодногопро

 

цесса,выполняет

обратноедействие

 

- возвращаетдескрмодуляпоимениптор

 

 

файла (безпути):