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


Объекты ядра

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Объект Ядра Функция 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
File CreateFile CloseHandle, DeleteFile
Сопоставление файлов CreateFileMapping, OpenFileMapping CloseHandle
Найти файл FindFirstFile FindClose
Куча HeapCreate HeapDeки
Порт завершения ввода-вывода CreateIoCompletionPort CloseHandle
Задание CreateJobObject CloseHandle
Mailslot CreateMailslot CloseHandle
Уведомление о ресурсе памяти CreateMemoryResourceNotification CloseHandle
Модуль LoadLibrary, GetModuleHandle FreeLibrary
Mutex CreateMutex, CreateMutexEx, OpenMutex CloseHandle
канал CreateNamedPipe, CreatePipe CloseHandle, DisconnectNamedPipe
Процесс CreateProcess, OpenProcess, GetCurrentProcess CloseHandle, TerminateProcess
Semaphore CreateSemaphore, CreateSemaphoreEx, OpenSemaphore CloseHandle
Розетка socket, accept closesocket
Thread CreateThread, CreateRemoteThread, GetCurrentThread CloseHandle, TerminateThread
Таймер CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer CloseHandle
Обновление ресурса BeginUpdateResource EndUpdateResource
Оконная станция GetProcessWindowStation Приложения не могут удалить этот объект.

 

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