Каждая подсистема среды окружения Windows создает для своих приложений различный образ операционной системы. Объекты исполняющей системы и службы объектов являются элементами, использующимися подсистемами среды окружения для создания их собственных версий объектов и других ресурсов.
Объекты исполняющей системы обычно создаются либо подсистемой среды окружения от имени пользовательского приложения, либо различными компонентами операционной системы в рамках их обычного функционирования. Например, для создания файла приложение Windows вызывает Windows-функцию CreateFileW, реализованную в DLL-библиотеке подсистемы Windows Kernelbase.dll. После проверки и инициализации функция CreateFileW, в свою очередь, для создания объекта файла исполняющей системы вызывает исходную Windows-службу NtCreateFile.
Набор объектов подсистемы среды окружения, предоставляемый ее приложениям, может быть больше или меньше набора, предоставляемого исполняющей системой. Подсистема Windows использует объекты исполняющей системы для экспорта своего собственного набора объектов, многие из которых напрямую связаны с объектами исполняющей системы. Например, мьютексы и семафоры Windows непосредственно основаны на объектах исполняющей системы (которые, в свою очередь, основаны на соответствующих объектах ядра).
Кроме того, подсистема Windows предоставляет именованные каналы и почтовые слоты, ресурсы, основанные на объектах файлов исполняющей системы. Некоторые подсистемы, такие как Subsystem for UNIX Applications, вообще не поддерживают объекты как таковые. Subsystem for UNIX Applications использует объекты исполняющей системы и службы в качестве основы для представления процессов, каналов и других ресурсов в стиле UNIX для своих приложений.
ПРИМЕЧАНИЕ. В исполняющей системе реализовано всего 4242 типа объектов. Многие из этих объектов предназначены только для использования теми компонентами исполняющей системы, которые их определили, и получить непосредственный доступ к ним из функций Windows API невозможно. В качестве примера таких объектов можно привести Driver, Device, и EventPair.
В таблице перечислены первичные объекты, предоставляемые исполняющей системой, и дано краткое описание того, что они представляют. Полный список типов объектов можно получить, после запуска Winobj с привилегированными правами и перехода в каталог ObjectTypes.
Объекты исполняющей системы, видимые функциям Windows API.
Тип объекта | Что он представляет |
---|---|
Process (Процесс) | Виртуальное адресное пространство и управляющую информацию, необходимую для выполнения набора объектов типа «поток» |
Thread (Поток) | Исполняемая категория внутри процесса |
Job (Задание) | Коллекция процессов, управляемых как единое целое в рамках задания |
Section (Раздел) | Область разделяемой памяти (известная в Windows как проекция файла) |
File (Файл) | Экземпляр открытого файла или устройства ввода-вывода |
Token (Маркер) | Профиль безопасности (идентификатор безопасности, права пользователя и т.д.) процесса или потока |
Event (Событие) | Объект, имеющий постоянное состояние (о котором поступил или не поступил сигнал), который может использоваться для синхронизации или уведомления |
Semaphore (Семафор) | Счетчик, ограничивающий доступ к ресурсу путем разрешения доступа к этому ресурсу, защищенному семафором, вполне определенному максимальному количеству потоков |
Mutex (Мьютекс) | Механизм синхронизации, используемый для последовательного доступа к ресурсу |
Timer (Таймер) | Механизм уведомления потока об истечении конкретного периода времени |
IoCompletion (Завершение ввода-вывода) | Метод для потоков по постановке в очередь и извлечении из нее уведомлений о завершении операций ввода-вывода (известный в Windows API как порт завершения ввода-вывода) |
Key (Раздел реестра) | Механизм ссылки на данные реестра. Хотя разделы появляются в пространстве имен диспетчера объектов, они управляются диспетчером конфигурации точно так же, как файловые объекты управляются драйверами файловой системы. С объектом раздела (key) связано от нуля до нескольких значений раздела, эти значения содержат данные о разделе |
Directory (Каталог) | Виртуальный каталог в пространстве имен диспетчера объектов, отвечающий за содержание других объектов или каталогов объектов |
TpWorkerFactory | Коллекция потоков, назначенных для выполнения конкретного набора задач. Ядро может управлять количеством рабочих элементов, которые будут выполняться по очереди, тем, сколько именно потоков будут отвечать за работу, а также динамическим созданием и завершением рабочих потоков, исходя из конкретных ограничений, устанавливаемых вызывающей программой. Windows показывает рабочий производственный объект (worker factory object) через пулы потоков |
TmRm (Диспетчер ресурсов), TmTx (Транзакция), TmTm (Диспетчер транзакций), TmEn (Включение в список) | Объекты, используемые диспетчером транзакций ядра (Kernel Transaction Manager, KTM) для различных транзакций и (или) включений в списки в качестве части диспетчера ресурсов или диспетчера транзакций. Объекты могут создаваться через API- функции CreateTransactionManagr, CreateResourceManager, CreateTransaction и CreateEnlistment |
WindowStation (Станция окна) | Объект, содержащий буфер обмена, набор глобальных атомов и группу объектов типа Рабочий стол |
Desktop (Рабочий стол) | Объект, содержащийся внутри объекта станции окна (window station). Рабочий стол имеет логическую поверхность дисплея и содержит окна, меню и связи |
PowerRequest | Объект, связанный с выполняемым потоком, который помимо всего прочего является вызовом функции SetThreadExecutionState для запроса заданного изменения режима электропитания, такого как блокировка перехода в спящий режим (например, при воспроизведении какого-нибудь фильма) |
EtwConsumer | Представляет собой подключенный ETW-потребитель режима реального времени, зарегистрированный с помощью API-функции StartTrace (и способный вызвать функцию ProcessTrace для получения событий в очереди объектов) |
EtwRegistration | Представляет собой объект регистрации, связанный с ETW-провайдером пользовательского режима (или режима ядра), который зарегистрирован с помощью API-функции EventRegister |
ПРИМЕЧАНИЕ. Поскольку изначально предполагалось, что Windows NT будет поддерживать операционную систему OS/2, мьютекс должен был быть совместим с существующей конструкцией объектов взаимного исключения OS/2, то есть иметь конструкцию, от которой требовалось, чтобы поток мог отказаться от объекта, оставив его недоступным. Поскольку подобное поведение для такого объекта считалось необычным, был создан еще один объект ядра — мутант. Со временем от поддержки OS/2 отказались, и объект стал использоваться подсистемой Windows 32 под названием мьютекс (но при этом он сохранил внутреннее имя мутант).