Дескрипторы объекта ядра - это особый процесс. То есть процесс должен или создать объект, или открыть существующий объект, чтобы получить дескриптор объекта ядра. Ограничение на один процесс дескрипторов ядра - 230.
Любой процесс может создать новый дескриптор существующего объекта ядра (точно такой же, что и созданный другим процессом), при условии, что процесс знает имя объекта и имеет доступ, разрешаемый системой безопасности к объекту. Дескрипторы объекта ядра включают в себя права доступа, указывающие действия, которые можно предоставить или отказать процессу. Приложение определяет права доступа, когда оно создает объект или получает существующий дескриптор объекта. Каждый тип объекта ядра поддерживает свой собственный набор прав доступа. Например, дескрипторы событий могут иметь доступ "установить" или "ждать" (или оба), дескрипторы файла могут иметь доступ "читать" или "записывать" (или оба), и так далее. Дополнительную информацию, см. Защищенные Объекты.
В следующей ниже иллюстрации приложение создает объект события. Функция CreateEvent создает объект события и возвращает дескриптор объекта.
После того, как объект события создан, приложение может использовать дескриптор события, чтобы установить или ждать событию. Дескриптор остается допустимым до тех пор, пока приложение не закроет дескриптор или не завершит работу.
Большинство объектов ядра поддерживает повторяющиеся дескрипторы для единственного объекта. Например, приложение на приведенной выше иллюстрации может получить дополнительные дескрипторы объекта события, используя функцию OpenEvent, как показано в следующей ниже иллюстрации.
Этот метод дает возможность приложению иметь дескрипторы с различными правами доступа. Например, Дескриптор 1, может иметь доступ к событию "установить" и "ждать", а Дескриптор 2 может иметь только доступ "ждать".
Если еще один процесс знает имя события и имеет доступ, разрешаемый системой обеспечения безопасности к объекту, он может создать свой собственный дескриптор объекта события, используя функцию OpenEvent. Создающее приложение может также и продублировать один из его дескрипторов в тот же самый процесс или в другой процесс, используя функцию DuplicateHandle.
Объект остается в памяти до тех пор, пока по крайней мере существует один дескриптор объекта. В следующей ниже иллюстрации, приложения используют функцию CloseHandle, чтобы закрыть их дескрипторы объекта события. Когда нет никаких дескрипторов события, система удаляет объект из памяти, как показано в следующей ниже иллюстрации.
Система управляет объектами файла несколько по-другому по отношению к другим объектам ядра. Объекты файла содержат указатель позиции в файле - указатель на следующий байт, который читается или пишется в файле. Всякий раз, когда прикладная программа создает новый дескриптор файла, система создает новый объект файла. Поэтому, к единственному файлу на диске может обратиться больше чем один объект файла, как показано на следующей иллюстрации.
Только благодаря дублированию или наследованию можно обратиться больше, чем к одному дескриптору файла для одного и того же объекта файла, как показано в следующей ниже иллюстрации.
Ниже следует таблица, которая перечисляет каждый из объектов ядра, вместе функция создатель и разрушитель каждого объекта. Функция - создатель или создает объект и дескриптор объекта, или создает новый дескриптор существующего объекта. Функция - разрушитель закрывает дескриптор объекта. Когда приложение закрывает последний дескриптор объекта ядра, система удаляет объект из памяти.
Объект ядра | Функция - создатель | Функция - разрушитель |
---|---|---|
Маркер доступа (Access token) | CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadToken | CloseHandle |
Уведомление об изменении (Change notification) | FindFirstChangeNotification | FindCloseChangeNotification |
Коммуникационное устройство (Communications device) |
CreateFile | CloseHandle |
Консоль ввода данных (Console input) | CreateFile , при помощи CONIN$ | CloseHandle |
Экранный буфер консоли (Console screen buffer) | CreateFile , при помощи CONOUT$ | CloseHandle |
Рабочий стол (Desktop) | GetThreadDesktop | Приложение не может удалить этот объект. |
Событие (Event) | CreateEvent, OpenEvent | CloseHandle |
Регистрация события (Event log) | OpenEventLog, RegisterEventSource, OpenBackupEventLog | CloseEventLog |
Файл (File) | CreateFile | CloseHandle, DeleteFile |
Отображение файла в память (File mapping) | CreateFileMapping, OpenFileMapping | CloseHandle |
Поиск файла (Find file) | FindFirstFile | FindClose |
Куча (Heap) | HeapCreate | HeapDestroy |
Задание (Job) | CreateJobObject | CloseHandle |
Почтовый ящик (Mailslot) | CreateMailslot | CloseHandle |
Memory resource notification | CreateMemoryResourceNotification | CloseHandle |
Модуль (Module) | LoadLibrary, GetModuleHandle | FreeLibrary |
Мьютекс (Mutex) | CreateMutex, OpenMutex | CloseHandle |
Канал (Pipe) | CreateNamedPipe, CreatePipe | CloseHandle, DisconnectNamedPipe |
Процесс (Process) | CreateProcess, OpenProcess, GetCurrentProcess | CloseHandle, TerminateProcess |
Семафор (Semaphore) | CreateSemaphore, OpenSemaphore | CloseHandle |
Сокет (Socket) | socket, accept | CloseHandle |
Поток (Thread) | CreateThread, CreateRemoteThread, GetCurrentThread | CloseHandle, TerminateThread |
Таймер (Timer) | CreateWaitableTimer, OpenWaitableTimer | CloseHandle |
Обновление ресурса (Update resource) | BeginUpdateResource | EndUpdateResource |
Оконная станция (Window station) | GetProcessWindowStation | Приложение не может удалить этот объект. |