C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Объекты ядра. мануал  (Прочитано 4156 раз)
Exhale
Нужно делать так как нужно, а так как не нужно делать не нужно
Участник
**

Сказали спасибо: +36/-9
Offline Offline

Сообщений: 247

TDD, XP


« : 06 декабря 2009, 19:22:37 »

Уважаемые, админы! Извините, если не туда засунул эту тему. Периодически на сайте всплывают вопросы, непосредственно или косвенно связанные с объектами ядра. причем ошибки(связанные с незнанием данной темы), вот я решил здесь опубликовать не большой вводный курс на данную тему.

Информация взята из разных источников.

Объекты ядра.

Ядро поддерживает базовые объекты двух видов: объекты диспетчера (события, мьютексы, семафоры, потоки ядра, таймеры и др.) и управляющие (прерывания, процессы, профили и др.)
Отличие объектов ядра (объектов исполнительной системы) от объектов User(для управления окнами) и GDI(для управления графикой) состоит в наличии у первых атрибутов защиты SECURITY_ATTRIBUTES, которые являются одним из параметров, создающих объект ядра функций.
Эти объекты создаются Windows-функциями, например CreateThread, CreateFile. Каждый объект ядра- блок памяти, выделенный ядром и доступ имеет только ядро. Блок памяти представляет из себя  структуру данных(Имя объекта, каталог объекта, тип объекта, дескриптор защиты, счетчик пользователей… и также данные специфичны для каждого объекта).Для работы с объектом ядра необходимо использовать определенные Windows-функции, где Вы передаете описатель, сообщая системе, какой объект Вам необходим. Значение описателей зависит от конкретного процесса, это означает что, если Вы передадите описатель потоку другого процесса, любой вызов из того процесса со значением описателя приведет к ошибке, НО это можно обойти 3 способами:
1 Наследование описателя объекта (Наследуются описатели объектов, но не объекты ядра)
2 Именование описателя объекта (Можно именовать многие объекты, но не все)
3 Дублирование описателя (BOOL DuplicateHandle(HANDLE hSourceProcessHandle,
                                                                      HANDLE hSourceHandle,
                                                                      HANDLE hTargetProcessHandle,
                                                                      PHANDLE phTargetHandle,
                                                                      DWORD dwDesiredAccess,
                                                                      BOOL bInheritHandle,
                                                                      DWORD dwOptions) достаточно запутана)

Таблица описателей(handle) объектов ядра(недокументированна)

При инициализации процесса система создает в нем таблицу описателей(handle), используемую только для объектов ядра. Таблица представляет собой массив структур данных. Каждая структура содержит указатель на объект ядра, маску доступа и флаги. Когда процесс инициализируется в первый раз, таблица его описателей(handle)  еще пуста. Как только процесс вызывает функцию, создающую объект ядра, ядро выделяет для этого объекта область памяти и инициализирует его. Далее ядро посматривает таблицу описателей(handle) создающего процесса и находит свободную запись. Указатель устанавливается на внутренний адрес структуры данных объекта, соответствующим же образом устанавливаются маска доступа и флаги.

Закрытие объектов ядра.
После того как вы закончили работу с объектом его нужно закрыть, вызвав BOOL CloseHandle(HANDLE hobject).
Функция проверяет таблицу описателей(handle), принадлежащую вызывающему процессу, чтобы система убедилась, что процесс имеет доступ к объекту. Если все в норме, то система получает адрес структуры данных объекта и уменьшает счетчик пользователей объекта; далее, удаляет соответствующую запись из таблицы описателей(handle).ЗАПИСЬ УДАЛЯЕТСЯ НЕЗАВИСИМО ОТ ТОГО, РАЗРУШЕН ОБЪЕКТ ИЛИ НЕТ!
Также стоит сбросить переменную(содержащую описатель(handle)), записав в нее NULL. Иначе можно получить ошибки:
1 Система получит недействительный описатель(handle)
2 Получите ссылку на другие объекты ядра(Windows создает объекты, используя свободные записи таблицы описателей (handle))
Также, возможна, утечка памяти, пока процесс выполняется. НО после завершения процесса ОС освободит все ресурсы, принадлежавшие этому процессу. 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: