Pages Menu
Categories Menu

Опубликовано | Нет комментариев

Методы объекта Windows

Атрибут методы, содержит набор внутренних процедур, аналогичных конструкторам и деструкторам C++, то есть процедурам, которые автоматически вызываются при создании или удалении объекта.

Диспетчер объектов расширяет этот замысел, вызывая метод объекта и в других ситуациях, например, когда кто-нибудь открывает или закрывает дескриптор объекта или, когда кто-нибудь пытается изменить защиту объекта. Некоторые типы объектов указывают методы, а некоторые их не указывают, в зависимости от того, как должен использоваться объект того или иного типа.

Когда компонент исполняющей системы создает новый объект типа, он с помощью диспетчера объектов может зарегистрировать один или несколько методов. После этого диспетчер объектов вызывает методы во вполне определенные моменты жизнедеятельности объектов данного типа, обычно при создании объекта, его удалении или каком-нибудь изменении. Методы, поддерживаемые диспетчером объектов, перечислены в таблице.

Причиной обращения к этим методам объектов служит факт той или иной операции над объектом (закрытия, дублирования, изменения степени безопасности и т. д.). Полное обобщение этих типовых процедур потребовало бы от разработчиков диспетчера объектов предвидения всех типов объектов.

Но процедуры для создания объекта типа экспортируются ядром, позволяя внешним компонентам ядра создавать свои собственные типы объектов. Хотя эта функция не фигурирует в документации для разработчиков драйверов, она используется внутри системы компонентом Win32k.sys для определения объектов WindowStation и Desktop. Благодаря возможности расширения методов объектов Win32k.sys определяет свои процедуры для проведения таких операций, как создание и запрос.

Единственным исключением из этого правила является процедура безопасности, которая, если не указано иное, выполняет по умолчанию SeDefaultObjectMethod. Этой процедуре не нужно знать внутреннюю структуру объекта, потому что она имеет дело только с дескриптором безопасности объекта, а вы уже видели, что указатель на дескриптор безопасности хранится в общем заголовке объекта, а не внутри тела объекта.

Но если объект требует своей собственной дополнительной проверки безопасности, он может определить свою собственную процедуру безопасности. Еще одной причиной наличия общего метода безопасности является стремление избежать излишней сложности, поскольку многие объекты полагаются при управлении своей безопасностью на монитор безопасности ссылок (security reference monitor).

методы-объекта

Методы объекта.

Диспетчер объектов вызывает метод открытия open при создании дескриптора объекта, что происходит при создании или открытии объекта. Объекты WindowStation и Desktop предоставляют метод open; например, объект типа WindowStation требует такой метод open, чтобы Win32k.sys мог совместно использовать часть памяти с процессом, который служит в качестве пула памяти, связанного с рабочим столом.

Пример использования метода закрытия close можно найти в системе ввода-вывода. Диспетчер ввода-вывода регистрирует метод close для объекта типа «файл», а диспетчер объектов вызывает метод close при каждом закрытии дескриптора файлового объекта. Этот метод close проверяет, не владеет ли процесс, закрывающий дескриптор файла, какими-либо незавершенными блокировками, касающимися этого файла, и если такие блокировки имеются, он их удаляет.

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

Перед удалением временного объекта из памяти диспетчер объектов вызывает метод delete, если такой метод был зарегистрирован. Диспетчер памяти, к примеру, регистрирует метод delete для объекта типа «раздел», и этот метод освобождает физические страницы, использовавшиеся в разделе. Он также проверяет перед удалением объекта типа «раздел» факт удаления любых внутренних структур данных, выделенных разделу диспетчером памяти. И, опять же, диспетчер объектов не может справиться с этой работой, поскольку ему ничего не известно о внутренней работе диспетчера памяти. Методы удаления для других типов объектов выполняют аналогичные функции.

Метод разбора parse (так же, как и метод запроса имени query name) позволяет диспетчеру объектов уступать управление поиском объекта производному диспетчеру объектов, если он найдет объект, существующий за пределами пространства имен диспетчера объектов. Когда диспетчер объектов ищет имя объекта, он приостанавливает свой поиск, когда обнаруживает объект в пути, который он связывает с методом parse. Диспетчер объектов вызывает метод parse, передавая ему оставшуюся часть от имени объекта, поиском которого он занимается. Кроме пространства имен диспетчера объектов в Windows есть еще два пространства имен: пространство имен реестра, реализуемое диспетчером конфигурации, и пространство имен файловой системы, реализуемое диспетчером ввода-вывода с помощью драйверов файловой системы.

Например, когда процесс открывает дескриптор объекта \Device\HarddiskVolume1\docs\resume.doc, диспетчер объектов проходит по дереву его имени до тех пор, пока не дойдет до имени объекта устройства HarddiskVolume1. Он видит, что с этим объектом связан метод разбора parse, и вызывает этот метод, передавая ему остаток имени объекта, поиск которого он вел, в данном случае это строка docs\resume.doc. Метод parse для объектов устройств является процедурой ввода-вывода, поскольку объекты типа «устройство» определялись диспетчером ввода-вывода и им же регистрировался для них метод parse.

Процедура parse, задаваемая диспетчером ввода-вывода, получает строку имени и передает ее соответствующей файловой системе, которая ищет файл на диске и открывает его.

Метод безопасности security, который также использует система ввода-вывода, аналогичен методу parse. Он вызывается в том случае, если поток пытается запросить или изменить информацию безопасности, защищающую файл. Эта информация для файлов отличается от такой же информации для других объектов, поскольку информация о безопасности хранится в самом файле, а не в памяти.

Поэтому для поиска информации о безопасности и ее считывании или изменении должна быть вызвана система ввода-вывода.

И наконец, метод подтверждения закрытия okay-to-close используется в качестве дополнительного уровня защиты от злонамеренного или ошибочного закрытия дескрипторов, используемых для системных целей. Например, у каждого процесса есть дескриптор на объект Desktop или объекты, с которыми у его потока или потоков имеются видимые окна.

В соответствии со стандартной моделью безопасности такие потоки могут закрывать свои дескрипторы на их рабочие столы, поскольку у процесса есть полный контроль над его собственными объектами. По этому сценарию потоки остаются без связанного с ними рабочего стола, что является нарушением многооконной модели. Для предотвращения подобного поведения Win32k.sys регистрирует процедуру okay-to-close для объектов рабочего стола Desktop и объектов WindowStation.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

↓