Стаття об'єкти ядра

Об'єкти ядра. (частина 1)

Що таке об'єкт ядра.

Об'єкти ядра використовуються системою і нашими додатками для управління безліччю різних ресурсів: процесами, потоками, файлами і т.д.

Система дозволяє створювати і оперувати декількома типами таких об'єктів, в тому числі: маркерами доступу (access token objects), файлами (file objects), проекціями файлів (file-mapping objects), портами завершення введення виведення (I / O completion port objects), завданнями (jobs), поштовими скриньками (mailslot objects), м'ютексів (mutex objects), каналами (pipe objects), процесами (thread objects) і очікуваними таймерами (waitable timer objects).

Ці об'єкти створюються Windows-функціями. Наприклад, CreateFileMapping змушує систему сформувати об'єкт проекцію файлу. Кожен об'єкт ядра насправді просто блок пам'яті, виділений ядром і доступний тільки йому.

Блок являє собою структуру даних, в елементах якої міститься інформація про об'єкт. Деякі елементи (дескриптор захисту, лічильник числа користувачів і ін.) Присутні у всіх об'єктах, але бо більша їх частина стосується виключно об'єктів конкретного типу. Наприклад, у об'єкта процес є ідентифікатор, базовий пріоритет і код завершення, а у об'єкта файл - зміщення в байтах, режим поділу і режим відкриття.

Для взаємодії з об'єктами ядра у Windows передбачений набір функцій, що обробляють структури об'єктів ядра за суворо визначеними правилами. Коли ми створюємо об'єкт ядра, функція повертає описувач ідентифікує створений об'єкт (HANDLE). Всі операції з поточним об'єктом ядра можливі тільки при вказівці цього описателя керуючої функції.

Для більшого захисту, описатели унікальні тільки всередині конкретного процесу. Тому, передаючи по межпроцессорной зв'язку описатель об'єкта іншому процесу, використовуючи описувач в іншому процесі, ми отримаємо помилку. Це обмеження можна обійти, але про це пізніше.

Облік користувачів об'єктів ядра.

Об'єкти ядра належать ядру, а не процесу. Це говорить про те, що завершує роботу з процесом, ми не обов'язково руйнуємо об'єкт ядра. У більшості випадків об'єкт руйнується, але якщо створений вами об'єкт ядра використовується іншим процесом, ядро ​​заборонить руйнування об'єкта до тих пір, поки від нього не відмовиться останній користувач.

У кожному об'єкті, як уже говорилося, є лічильник користувачів об'єктом. У момент створення лічильнику присвоюється значення 1. Відповідно, при зверненні до нього іншого процесу, лічильник збільшується на 1. Коли призначений для користувача процес завершується, лічильник зменшується. Система видаляє об'єкт ядра, коли лічильник обнуляється.

Захист об'єктів ядра

Майже у всіх функціях, що створюють об'єкти, є параметр SECURITY_ATTRIBUTES. Він необхідний для захисту об'єктів ядра від несанкціонованого доступу. Найчастіше це властивість використовують в серверних додатках, в клієнтських додатках цей об'єкт можна ігнорувати.

При передачі в такому атрибуті NULL більшість об'єктів будуть створені зі стандартними властивостями захисту, коли до об'єкта допускаються: творець і адміністраторська група. Решта ігноруються.

Більш докладно про захист об'єктів ядра в наступний раз.

Схожі статті