Дескриптор (англ. Handle) — це структура даних, яка представляє відкритий екземпляр базового об'єкта операційної системи, наприклад, файл, ключ реєстру, об’єкт синхронізації тощо. Дескриптор однозначно ідентифікує створений об'єкт і надає доступ до об'єкта, дозволяючи читати та змінювати його стан.
Дескриптори об'єктів операційної системи
Дескриптор може бути використаний будь-яким потоком процесу для доступу до властивостей об’єкта, і саме його передають функціям, які працюють з об’єктами. Для покращення надійності у роботі операційної системи Microsoft забезпечила залежність дескрипторів від конкретного процесу. Тому, якщо передати дескриптор іншому процесу, він не зможе використовувати відповідний об'єкт ядра.
При ініціалізації процесу система створює в ньому таблицю дескрипторів об'єктів ядра, яка містить інформацію про всі використані ним об’єкти та набір привілеїв доступу до них. Коли процес ініціалізується, таблиця дескрипторів порожня. При кожному виклику функції, що створює об'єкт, відразу після його створення ядро переглядає таблицю дескрипторів процесу, знаходить перший вільний запис і записує у нього дані про об’єкт (вказівник на область пам’яті, за якою знаходиться об’єкт, та параметри доступу). Всі функції, які створюють об'єкти ядра, повертають прив'язані до конкретного процесу дескриптори, що можуть бути використані в будь-якому потоці цього процесу. Значення дескриптора є байтовим зміщенням від початку таблиці дескрипторів процесу.
Якщо при звертанні до об’єкта ядра відповідній функції передати неправильний дескриптор, вона завершиться з помилкою ERROR_INVALID_HANDLE (недопустимий дескриптор). Якщо виклик функції, яка створює об'єкт ядра, невдалий, то звичайно повертається значення 0 (NULL). Така ситуація можлива при гострій нестачі пам'яті або за наявності проблем із доступом.
Робота з дескриптором
Програма отримує дескриптор під час створення нового або відкривання існуючого об'єкта. Наприклад, при створенні потоку за допомогою функції CreateThread вона повертає дескриптор створеного потоку. Незалежно від того, яким чином отримано дескриптор, при закінченні роботи його потрібно закрити викликом функції CloseHandle:
function CloseHandle(hObject: THandle): BOOL;
Ця функція спочатку перевіряє таблицю дескрипторів викликаючого процесу, щоб переконатися, чи ідентифікує переданий їй дескриптор об'єкт, до якого цей процес дійсно має доступ. Якщо переданий індекс правильний, система отримує адресу структури даних об'єкта й зменшує в цій структурі лічильник числа користувачів (а як тільки лічильник обнулиться, ядро видалить об'єкт із пам'яті).
Якщо дескриптор неправильний, функція CloseHandle повертає значення false.
Перед поверненням у викликаючу програму CloseHandle видаляє відповідний запис із таблиці дескрипторів: після цього дескриптор вже недійсний у процесі й використовувати його не можна. При цьому запис видаляється незалежно від того, знищений об'єкт ядра чи ні. Після виклику CloseHandle процес більше не отримає доступу до цього об'єкта ядра (але якщо його лічильник не обнулено, об'єкт залишається в пам'яті).
Після завершення процесу операційна система автоматично звільняє всі ресурси, які йому належали, і у випадку об'єктів ядра діє так: у момент завершення процесу переглядає його таблицю дескрипторів і закриває всі відкриті дескриптори. Дескриптори є процесо-залежними, проте часто виникає необхідність їх сумісного використання кількома процесами. У Windows реалізовано такі механізми сумісного доступу до об’єктів ядра кількома процесами: спадкування дескрипторів, їх іменування та дублювання. Спадкування стосується лише споріднених процесів (батьківський-дочірній). Батьківський процес при створенні може передати права доступу до своїх об’єктів ядра дочірньому процесу. Для цього поле bInheritHandle структури SECURITY_ATTRIBUTES слід встановити у true.
При такому наслідуванні система, крім копіювання записів з таблиці дескрипторів, збільшує значення лічильників відповідних об'єктів ядра, оскільки вони тепер використовуються обома процесами. Щоб знищити якийсь об'єкт ядра, його дескриптор повинні закрити (викликом CloseHandle) обидва процеси.
Успадковуються тільки дескриптори об'єктів, що існують на момент створення дочірнього процесу. Якщо батьківський процес створить після цього нові об'єкти ядра з успадковуваними дескрипторами, вони будуть недоступні дочірньому процесу.
При спадкуванні дочірній процес «не знає», що він успадкував якісь дескриптори, тому йому окремо передають значення очікуваного ним дескриптора об'єкта ядра (наприклад, як аргумент у командному рядку чи змінну оточення). Дескриптори дозволяють різним процесам використовувати системні об'єкти. Інший спосіб, який дозволяє кільком процесам спільно використовувати об'єкти ядра, пов'язаний з іменуванням цих об'єктів. Іменувати можна багато (але не всі) об'єкти ядра. Наприклад, іменовані об'єкти створюють такі функції: CreateMutex, CreateEvent, CreateSemaphore, CreateFileMapping тощо.
За відомим іменем об’єкта інші процеси можуть відкрити його дескриптор і отримати таким чином до нього доступ. Ще один механізм спільного використання об'єктів ядра кількома процесами — це застосування функції DuplicateHandle, яка отримує запис у таблиці дескрипторів одного процесу й створює її копію в таблиці іншого. Як і при спадкуванні, процес-приймач ніяк не повідомляється про те, що він одержав доступ до нового об'єкта ядра, тому його потрібно спеціально інформувати про це.
Дескриптор захисту
Об'єкти ядра можна захистити дескриптором захисту (security descriptor), який описує, хто створив об'єкт і хто має право доступу до нього. Майже всі функції, що створюють об'єкти ядра, приймають аргумент – вказівник на структуру SECURITY_ATTRIBUTES. Більшість програм замість цього аргументу передає NULL, що приводить до створення об'єкта із захистом за замовчуванням. Така ситуація передбачає, що творець об'єкта й будь-який користувач групи адміністраторів отримує до нього повний доступ, а всі інші не допускаються. Однак для зміни цієї поведінки можна самостійно створити й ініціалізувати структуру SECURITY_ATTRIBUTES, а потім передати її адресу функції створення об’єкта. Вона має такий вигляд (описано мовою Delphi):
_SECURITY_ATTRIBUTES = record nLength: DWORD; // Розмір структури lpSecurityDescriptor: Pointer; // Адреса дескриптора захисту bInheritHandle: BOOL; // Чи успадковувати дескриптор end; SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES;
Лише один елемент цієї структури має стосунок до захисту — lpSecurityDescriptor. Якщо слід обмежити доступ до об'єкта, потрібно створити дескриптор захисту й ініціалізувати структуру SECURITY_ATTRIBUTES. Проте специфічний захист об'єктів використовують рідко.
Інші види дескрипторів
Дескриптори віртуальних адрес (virtual address descriptors, VAD) — це структури даних, які використовуються диспетчером пам'яті для обліку адрес віртуальної пам'яті, задіяних процесом.
Примітки
- Коноваленко, І. В.; Федорів, П. С. (2012). Системне програмування у Windows з прикладами на Delphi (DjVu) (українською) . Тернопіль: ТНТУ. с. 319. оригіналу за 8 серпня 2016. Процитовано 3 червня 2016.
- Ріхтер, Джеффрі (2001). Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows [Windows для професіоналів: створення ефективних Win32 застосунків з урахуванням специфіки 64-розрядної версії Windows] (російською) (вид. 4-е). Санкт-Петербург, Москва: Пітер, Издательско-торговый дом «Русская редакция».
Це незавершена стаття про операційні системи. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Deskriptor angl Handle ce struktura danih yaka predstavlyaye vidkritij ekzemplyar bazovogo ob yekta operacijnoyi sistemi napriklad fajl klyuch reyestru ob yekt sinhronizaciyi tosho Deskriptor odnoznachno identifikuye stvorenij ob yekt i nadaye dostup do ob yekta dozvolyayuchi chitati ta zminyuvati jogo stan Deskriptori ob yektiv operacijnoyi sistemiDeskriptor mozhe buti vikoristanij bud yakim potokom procesu dlya dostupu do vlastivostej ob yekta i same jogo peredayut funkciyam yaki pracyuyut z ob yektami Dlya pokrashennya nadijnosti u roboti operacijnoyi sistemi Microsoft zabezpechila zalezhnist deskriptoriv vid konkretnogo procesu Tomu yaksho peredati deskriptor inshomu procesu vin ne zmozhe vikoristovuvati vidpovidnij ob yekt yadra Pri inicializaciyi procesu sistema stvoryuye v nomu tablicyu deskriptoriv ob yektiv yadra yaka mistit informaciyu pro vsi vikoristani nim ob yekti ta nabir privileyiv dostupu do nih Koli proces inicializuyetsya tablicya deskriptoriv porozhnya Pri kozhnomu vikliku funkciyi sho stvoryuye ob yekt vidrazu pislya jogo stvorennya yadro pereglyadaye tablicyu deskriptoriv procesu znahodit pershij vilnij zapis i zapisuye u nogo dani pro ob yekt vkazivnik na oblast pam yati za yakoyu znahoditsya ob yekt ta parametri dostupu Vsi funkciyi yaki stvoryuyut ob yekti yadra povertayut priv yazani do konkretnogo procesu deskriptori sho mozhut buti vikoristani v bud yakomu potoci cogo procesu Znachennya deskriptora ye bajtovim zmishennyam vid pochatku tablici deskriptoriv procesu Yaksho pri zvertanni do ob yekta yadra vidpovidnij funkciyi peredati nepravilnij deskriptor vona zavershitsya z pomilkoyu ERROR INVALID HANDLE nedopustimij deskriptor Yaksho viklik funkciyi yaka stvoryuye ob yekt yadra nevdalij to zvichajno povertayetsya znachennya 0 NULL Taka situaciya mozhliva pri gostrij nestachi pam yati abo za nayavnosti problem iz dostupom Robota z deskriptoromPrograma otrimuye deskriptor pid chas stvorennya novogo abo vidkrivannya isnuyuchogo ob yekta Napriklad pri stvorenni potoku za dopomogoyu funkciyi CreateThread vona povertaye deskriptor stvorenogo potoku Nezalezhno vid togo yakim chinom otrimano deskriptor pri zakinchenni roboti jogo potribno zakriti viklikom funkciyi CloseHandle function CloseHandle hObject THandle BOOL Cya funkciya spochatku pereviryaye tablicyu deskriptoriv viklikayuchogo procesu shob perekonatisya chi identifikuye peredanij yij deskriptor ob yekt do yakogo cej proces dijsno maye dostup Yaksho peredanij indeks pravilnij sistema otrimuye adresu strukturi danih ob yekta j zmenshuye v cij strukturi lichilnik chisla koristuvachiv a yak tilki lichilnik obnulitsya yadro vidalit ob yekt iz pam yati Yaksho deskriptor nepravilnij funkciya CloseHandle povertaye znachennya false Pered povernennyam u viklikayuchu programu CloseHandle vidalyaye vidpovidnij zapis iz tablici deskriptoriv pislya cogo deskriptor vzhe nedijsnij u procesi j vikoristovuvati jogo ne mozhna Pri comu zapis vidalyayetsya nezalezhno vid togo znishenij ob yekt yadra chi ni Pislya vikliku CloseHandle proces bilshe ne otrimaye dostupu do cogo ob yekta yadra ale yaksho jogo lichilnik ne obnuleno ob yekt zalishayetsya v pam yati Pislya zavershennya procesu operacijna sistema avtomatichno zvilnyaye vsi resursi yaki jomu nalezhali i u vipadku ob yektiv yadra diye tak u moment zavershennya procesu pereglyadaye jogo tablicyu deskriptoriv i zakrivaye vsi vidkriti deskriptori Deskriptori ye proceso zalezhnimi prote chasto vinikaye neobhidnist yih sumisnogo vikoristannya kilkoma procesami U Windows realizovano taki mehanizmi sumisnogo dostupu do ob yektiv yadra kilkoma procesami spadkuvannya deskriptoriv yih imenuvannya ta dublyuvannya Spadkuvannya stosuyetsya lishe sporidnenih procesiv batkivskij dochirnij Batkivskij proces pri stvorenni mozhe peredati prava dostupu do svoyih ob yektiv yadra dochirnomu procesu Dlya cogo pole bInheritHandle strukturi SECURITY ATTRIBUTES slid vstanoviti u true Pri takomu nasliduvanni sistema krim kopiyuvannya zapisiv z tablici deskriptoriv zbilshuye znachennya lichilnikiv vidpovidnih ob yektiv yadra oskilki voni teper vikoristovuyutsya oboma procesami Shob znishiti yakijs ob yekt yadra jogo deskriptor povinni zakriti viklikom CloseHandle obidva procesi Uspadkovuyutsya tilki deskriptori ob yektiv sho isnuyut na moment stvorennya dochirnogo procesu Yaksho batkivskij proces stvorit pislya cogo novi ob yekti yadra z uspadkovuvanimi deskriptorami voni budut nedostupni dochirnomu procesu Pri spadkuvanni dochirnij proces ne znaye sho vin uspadkuvav yakis deskriptori tomu jomu okremo peredayut znachennya ochikuvanogo nim deskriptora ob yekta yadra napriklad yak argument u komandnomu ryadku chi zminnu otochennya Deskriptori dozvolyayut riznim procesam vikoristovuvati sistemni ob yekti Inshij sposib yakij dozvolyaye kilkom procesam spilno vikoristovuvati ob yekti yadra pov yazanij z imenuvannyam cih ob yektiv Imenuvati mozhna bagato ale ne vsi ob yekti yadra Napriklad imenovani ob yekti stvoryuyut taki funkciyi CreateMutex CreateEvent CreateSemaphore CreateFileMapping tosho Za vidomim imenem ob yekta inshi procesi mozhut vidkriti jogo deskriptor i otrimati takim chinom do nogo dostup She odin mehanizm spilnogo vikoristannya ob yektiv yadra kilkoma procesami ce zastosuvannya funkciyi DuplicateHandle yaka otrimuye zapis u tablici deskriptoriv odnogo procesu j stvoryuye yiyi kopiyu v tablici inshogo Yak i pri spadkuvanni proces prijmach niyak ne povidomlyayetsya pro te sho vin oderzhav dostup do novogo ob yekta yadra tomu jogo potribno specialno informuvati pro ce Deskriptor zahistuOb yekti yadra mozhna zahistiti deskriptorom zahistu security descriptor yakij opisuye hto stvoriv ob yekt i hto maye pravo dostupu do nogo Majzhe vsi funkciyi sho stvoryuyut ob yekti yadra prijmayut argument vkazivnik na strukturu SECURITY ATTRIBUTES Bilshist program zamist cogo argumentu peredaye NULL sho privodit do stvorennya ob yekta iz zahistom za zamovchuvannyam Taka situaciya peredbachaye sho tvorec ob yekta j bud yakij koristuvach grupi administratoriv otrimuye do nogo povnij dostup a vsi inshi ne dopuskayutsya Odnak dlya zmini ciyeyi povedinki mozhna samostijno stvoriti j inicializuvati strukturu SECURITY ATTRIBUTES a potim peredati yiyi adresu funkciyi stvorennya ob yekta Vona maye takij viglyad opisano movoyu Delphi SECURITY ATTRIBUTES record nLength DWORD Rozmir strukturi lpSecurityDescriptor Pointer Adresa deskriptora zahistu bInheritHandle BOOL Chi uspadkovuvati deskriptor end SECURITY ATTRIBUTES SECURITY ATTRIBUTES Lishe odin element ciyeyi strukturi maye stosunok do zahistu lpSecurityDescriptor Yaksho slid obmezhiti dostup do ob yekta potribno stvoriti deskriptor zahistu j inicializuvati strukturu SECURITY ATTRIBUTES Prote specifichnij zahist ob yektiv vikoristovuyut ridko Inshi vidi deskriptorivDeskriptori virtualnih adres virtual address descriptors VAD ce strukturi danih yaki vikoristovuyutsya dispetcherom pam yati dlya obliku adres virtualnoyi pam yati zadiyanih procesom PrimitkiKonovalenko I V Fedoriv P S 2012 Sistemne programuvannya u Windows z prikladami na Delphi DjVu ukrayinskoyu Ternopil TNTU s 319 originalu za 8 serpnya 2016 Procitovano 3 chervnya 2016 Rihter Dzheffri 2001 Windows dlya professionalov sozdanie effektivnyh Win32 prilozhenij s uchetom specifiki 64 razryadnoj versii Windows Windows dlya profesionaliv stvorennya efektivnih Win32 zastosunkiv z urahuvannyam specifiki 64 rozryadnoyi versiyi Windows rosijskoyu vid 4 e Sankt Peterburg Moskva Piter Izdatelsko torgovyj dom Russkaya redakciya Ce nezavershena stattya pro operacijni sistemi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi