Поделиться через


Объекты ядра

Дескриптора объектов ядра являются конкретными процессами. То есть процесс должен либо создать объект, либо открыть существующий объект, чтобы получить дескриптор объекта ядра. Ограничение на каждый процесс для дескрипторов ядра равно 2^24. Однако дескриптор хранится в пуле страниц, поэтому фактическое количество дескрипторов, которые можно создать, основано на доступной памяти. Количество дескрипторов, которые можно создать в 32-разрядной версии Windows, значительно ниже 2^24.

Любой процесс может создать новый дескриптор для существующего объекта ядра (даже одного, созданного другим процессом), если процесс знает имя объекта и имеет доступ к объекту безопасности. Обработчики объектов ядра включают права доступа, указывающие на действия, которые можно предоставить или запретить процессу. Приложение указывает права доступа при создании объекта или получении существующего дескриптора объекта. Каждый тип объекта ядра поддерживает собственный набор прав доступа. Например, дескриптор событий может иметь набор или доступ к ожиданиям (или оба), дескрипторы файлов могут иметь доступ на чтение или запись (или оба) и т. д. Дополнительные сведения см. в защищаемых объектов.

На следующем рисунке приложение создает объект события. Функция createEventсоздает объект события и возвращает дескриптор объекта.

приложения, создающего объект события

После создания объекта события приложение может использовать дескриптор события для задания или ожидания события. Дескриптор остается допустимым, пока приложение не закроет дескриптор или завершит работу.

Большинство объектов ядра поддерживают несколько дескрипторов для одного объекта. Например, приложение на предыдущем рисунке может получить дополнительные обработчики объектов событий с помощью функции OpenEvent, как показано на следующем рисунке.

приложения, создающего объект события с несколькими дескрипторами

Этот метод позволяет приложению обрабатывать различные права доступа. Например, Handle 1 может задать и ожидать доступа к событию, а Дескриптор 2 может иметь доступ только к ожиданию.

Если другой процесс знает имя события и имеет доступ к объекту безопасности, он может создать собственный дескриптор объекта событий с помощью OpenEvent. Создание приложения также может дублировать один из его дескрипторов в том же процессе или в другой процесс с помощью функции DuplicateHandle.

Объект остается в памяти до тех пор, пока существует по крайней мере один дескриптор объекта. На следующем рисунке приложения используют функцию CloseHandle для закрытия дескрипторов объектов событий. При отсутствии дескрипторов событий система удаляет объект из памяти, как показано на следующем рисунке.

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

Система управляет объектами файлов по-разному от других объектов ядра. Объекты файлов содержат указатель на файл — указатель на следующий байт для чтения или записи в файле. Всякий раз, когда приложение создает новый дескриптор файла, система создает новый объект файла. Поэтому несколько объектов файлов могут ссылаться на один файл на диске, как показано на следующем рисунке.

несколько объектов файлов, ссылающихся на файл на диске

Только через дублирование или наследование может ссылаться на один и тот же объект файла, как показано на следующем рисунке.

два дескриптора файлов ссылаются на один и тот же объект файлов

В следующей таблице перечислены все объекты ядра, а также функции создателя и уничтожения каждого объекта. Создатель функций либо создает объект и дескриптор объекта, либо создает новый существующий дескриптор объекта. Функции разрушителя закрывают дескриптор объекта. Когда приложение закрывает последний дескриптор к объекту ядра, система удаляет объект из памяти.

Объект Ядра Функция Creator Функция разрушителя
Маркер доступа CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadToken CloseHandle
Уведомление об изменении FindFirstChangeNotification FindCloseChangeNotification
Устройство связи CreateFile CloseHandle
Входные данные консоли CreateFileс CONIN$ CloseHandle
Буфер экрана консоли CreateFileс CONOUT$ CloseHandle
Настольный GetThreadDesktop Приложения не могут удалить этот объект.
Событие CreateEvent, CreateEventEx, OpenEvent CloseHandle
Журнал событий OpenEventLog, RegisterEventSource, OpenBackupEventLog CloseEventLog
Файл CreateFile CloseHandle, DeleteFile
Сопоставление файлов CreateFileMapping, OpenFileMapping CloseHandle
Поиск файла FindFirstFile FindClose
Куча HeapCreate ХеапДестроев
Порт завершения ввода-вывода CreateIoCompletionPort CloseHandle
Работа CreateJobObject CloseHandle
Mailslot CreateMailslot CloseHandle
Уведомление о ресурсе памяти CreateMemoryResourceNotification CloseHandle
Модуль LoadLibrary, GetModuleHandle FreeLibrary
Мьютекс CreateMutex, CreateMutexEx, OpenMutex CloseHandle
Труба CreateNamedPipe, CreatePipe CloseHandle, DisconnectNamedPipe
Процесс CreateProcess, OpenProcess, GetCurrentProcess CloseHandle, TerminateProcess
Семафор CreateSemaphore, CreateSemaphoreEx, OpenSemaphore CloseHandle
Розетка сокет, принять closesocket
Нить CreateThreadThread, CreateRemoteThread, GetCurrentThread CloseHandle, TerminateThread
Таймер CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer CloseHandle
Обновление ресурса BeginUpdateResource EndUpdateResource
Станция окон GetProcessWindowStation Приложения не могут удалить этот объект.

 

пространства имен объектов ядра