 
        
        Лабораторные работы / Задания / ЛР 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,которая | акжеприменяетсявнутодногопро | 
 | цесса,выполняет | ||||
| обратноедействие | 
 | - возвращаетдескрмодуляпоимениптор | 
 | 
 | файла (безпути): | 
 | |
