Лабораторные работы / Задания / ЛР 2 ПРОЦЕССЫ И ПОТОКИ
.pdf
|
|
|
Лабораторнаяработа№ |
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,которая |
акжеприменяетсявнутодногопро |
|
цесса,выполняет |
||||
обратноедействие |
|
- возвращаетдескрмодуляпоимениптор |
|
|
файла (безпути): |
|