ВУЗ:
Составители:
аппаратурой посредством HAL. Существует много версий HAL под различные аппаратные платформы. Подходящий уро-
вень выбирается в процессе установки Windows.
Объекты и их дескрипторы
Архитектура Windows базируется на использовании множества различных объектов. Объект ядра (kernel object) – это
структура данных, доступ к членам которой имеет только ядро Windows. Примеры объектов ядра:
• объект Process представляет процесс;
• объект Thread определяет поток;
• объект File представляет открытый файл;
• объект File-mapping представляет отображаемый в память файл (memory-mapped file), т.е. файл, содержимое которо-
го отображено непосредственно на виртуальное адресное пространство и используется как физическая память;
• объект Pipe используется для обмена данными между процессами;
• объект Event является объектом синхронизации потоков, сигнализирующим о завершении операции;
• объект Mutex представляет собой объект синхронизации потоков, который может использоваться несколькими про-
цессами;
• объект Semaphore используется для того, чтобы учитывать ресурсы и сигнализировать потоку о доступности ресурса
на данный момент.
Кроме объектов ядра, существуют также пользовательские объекты и объекты GDI, такие как: меню, окна, шрифты,
кисти и курсоры мыши.
Дескрипторы. Одной из характеристик любого объекта является дескриптор, который используется для идентифика-
ции этого объекта.
Хотя к объектам ядра нельзя получить непосредственный доступ из пользовательского режима, в Windows API есть
функции, которые можно вызывать из данного режима для управления этими объектами. Это своего рода инкапсуляция
(encapsulation), защищающая объекты от непредусмотренных или неразрешенных действий. Когда создается объект ядра
посредством вызова соответствующей АРI функции (CreateProcess, Greate- Thread, CreateFile и GreateFileMapping), функция
возвращает дескриптор вновь созданного объекта. Такой дескриптор может быть передан другой API-функции для того,
чтобы она могла управлять данным объектом.
В общем, дескриптор объекта является зависимым от процесса (process-specific). Это означает, что он действует только
в пределах данного процесса. Некоторые идентификаторы, такие как ID процесса, наоборот, являются идентификаторами
системного уровня. Другими словами, область их действия – все процессы системы.
Подсчет используемости. Объект ядра принадлежит ядру Windows, а не процессу, создавшему этот объект (или лю-
бому другому процессу). Объекты могут использоваться совместно многими процессами и применяться разными способами.
У каждого процесса, который работает с объектом, есть свой собственный, действующий в пределах данного процесса, деск-
риптор этого объекта.
С учетом этого ядро должно поддерживать подсчет используемости (usage count) каждого объекта. Ядро уничтожает
объект тогда, когда его используемость становится равной нулю, но не раньше. Таким образом, процесс, создавший данный
объект, может закрыть (close) его дескриптор (посредством вызова API-функции CloseHandle), но объект не будет уничто-
жен, если какой-то другой процесс продолжает его использовать (имеет его дескриптор). У объектов ядра есть атрибуты за-
щиты, которые можно использовать для ограничения доступа к данным объектам. Фактически это одно из основных
свойств, отличающих объекты ядра от пользовательских объектов и объектов GDI.
Совместное использование объектов несколькими процессами. Существует несколько способов совместного исполь-
зования объекта несколькими процессами.
1. Наследование. Когда процесс (а точнее поток этого процесса) создает объект ядра, он может указать, что дескрип-
тор этого объекта наследуется (inheritable) порожденными (child) процессами, которые данный родительский процесс созда-
ет впоследствии. В этой случае дескрипторы родительского и порожденного процессов одинаковы.
2. Дублирование дескриптора. Функция DuplicateHandle определяется следующим образом:
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
LPHANDLE IpTargetHandle,
DWORD dwDesiredAccess,
BOOL blnheriCHandle,
DWORD dwOptions
);
// Дескриптор процесса-источника.
// Копируемый дескриптор.
// Дескриптор процесса-приемника.
// Указатель на дескриптор-копию.
// Доступ для дескриптора-копии.
// Флаг наследуемости дескриптора.
// Необязательные опции.
Эта функция позволяет скопировать дескриптор объекта одного процесса в другой процесс. Новый дескриптор-копия,
действующий в пределах своего процесса, может иметь значение, отличное от значения дескриптора-источника, но это не
существенно, так как все дескрипторы действуют только в пределах своих процессов.
3. Именованные объекты. Многим объектам ядра при их создании может быть присвоено имя. Областью действия
имени является вся система. Это означает, что любой другой процесс может получить доступ к объекту по его имени (если
считать, конечно, что другому процессу это имя известно). Например, последний параметр функции
HANDLE CreateFileMapping ( // Дескриптор отображаемого
HANDLE hFile, // файла.
LPSECUKITY_ATTRIBUTES // Необязательные атрибуты
IpFileMappingAttributes, // защиты.
Страницы
- « первая
- ‹ предыдущая
- …
- 9
- 10
- 11
- 12
- 13
- …
- следующая ›
- последняя »