Объекты ядра
Дескриптора объектов ядра являются конкретными процессами. То есть процесс должен либо создать объект, либо открыть существующий объект, чтобы получить дескриптор объекта ядра. Ограничение на каждый процесс для дескрипторов ядра равно 2^24. Однако дескриптор хранится в пуле страниц, поэтому фактическое количество дескрипторов, которые можно создать, основано на доступной памяти. Количество дескрипторов, которые можно создать в 32-разрядной версии Windows, значительно ниже 2^24.
Любой процесс может создать новый дескриптор для существующего объекта ядра (даже одного, созданного другим процессом), если процесс знает имя объекта и имеет доступ к объекту безопасности. Обработчики объектов ядра включают права доступа, указывающие на действия, которые можно предоставить или запретить процессу. Приложение указывает права доступа при создании объекта или получении существующего дескриптора объекта. Каждый тип объекта ядра поддерживает собственный набор прав доступа. Например, дескриптор событий может иметь набор или доступ к ожиданиям (или оба), дескрипторы файлов могут иметь доступ на чтение или запись (или оба) и т. д. Дополнительные сведения см. в защищаемых объектов.
На следующем рисунке приложение создает объект события. Функция createEventсоздает объект события и возвращает дескриптор объекта.
После создания объекта события приложение может использовать дескриптор события для задания или ожидания события. Дескриптор остается допустимым, пока приложение не закроет дескриптор или завершит работу.
Большинство объектов ядра поддерживают несколько дескрипторов для одного объекта. Например, приложение на предыдущем рисунке может получить дополнительные обработчики объектов событий с помощью функции OpenEvent, как показано на следующем рисунке.
Этот метод позволяет приложению обрабатывать различные права доступа. Например, Handle 1 может задать и ожидать доступа к событию, а Дескриптор 2 может иметь доступ только к ожиданию.
Если другой процесс знает имя события и имеет доступ к объекту безопасности, он может создать собственный дескриптор объекта событий с помощью OpenEvent. Создание приложения также может дублировать один из его дескрипторов в том же процессе или в другой процесс с помощью функции DuplicateHandle.
Объект остается в памяти до тех пор, пока существует по крайней мере один дескриптор объекта. На следующем рисунке приложения используют функцию CloseHandle для закрытия дескрипторов объектов событий. При отсутствии дескрипторов событий система удаляет объект из памяти, как показано на следующем рисунке.
Система управляет объектами файлов по-разному от других объектов ядра. Объекты файлов содержат указатель на файл — указатель на следующий байт для чтения или записи в файле. Всякий раз, когда приложение создает новый дескриптор файла, система создает новый объект файла. Поэтому несколько объектов файлов могут ссылаться на один файл на диске, как показано на следующем рисунке.
Только через дублирование или наследование может ссылаться на один и тот же объект файла, как показано на следующем рисунке.
В следующей таблице перечислены все объекты ядра, а также функции создателя и уничтожения каждого объекта. Создатель функций либо создает объект и дескриптор объекта, либо создает новый существующий дескриптор объекта. Функции разрушителя закрывают дескриптор объекта. Когда приложение закрывает последний дескриптор к объекту ядра, система удаляет объект из памяти.
Связанные разделы