Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: По поводу объектов ядра  (Прочитано 17681 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Anonymous
Гость
« : 13-08-2003 00:30 » 

тут вот Гром писал ....
статья "Объекты ядра" часть 1
адрес http://shelek.com/club/viewart.php?id=78

Все верно... и это тоже

   В каждом объекте, как уже говорилось, есть счетчик пользователей объектом. В момент создания, счетчику присваивается значение 1.

... но вот здесь

Соответственно, при обращении к нему другого процесса, счетчик увеличивается на 1.

Несколько абстрактное утверждение, понять(догадаться) истинный смысл которого, способен лишь человек знающий то, что вы хотели сказать(но если он уже это знает, то эта статья не для него), а эта статья ориентирована на людей которые только начинают работать с Windows и для них нужно писать по четче и попонятнее...

Когда пользовательский процесс завершается, счетчик уменьшается.

а это верно лишь при условии, что данный объект ядра небыл явно(CloseHandle) освобожден

Система удаляет объект ядра, когда счетчик обнуляется.

вот тут вот все верно

а еще я думаю читателям будет полезно давать не только выдержки из используемых книг/статей, что и их координаты (названия и авторы)для получения полной информации и/или самостоятельного изучения

С уважением Lapulya

Джеффри Рихтер "Windows создание эффективных Win32 - приложений с учетом специфики 64 - разрядной версии Windows" изд. Питер пресс
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #1 : 13-08-2003 00:33 » 

прошу прощения, я просто забыл зарегистрироваться

С уважением Lapulya
Записан

С уважением Lapulya
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 13-08-2003 07:42 » 

lapulya, трудно с тобой несогласится и согласится.
При распределенном использовании HANDLE - описателей именно при обращении счетчик увеличивается сразу, кстати у рихтера этого нет.

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

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

Тем более что у него вряд ли будет то, что будет у меня. Брал только стартовый стиль и формулировки, у него отточены фразы особо в теории.

Отдельно спасибо за критику - помогает - осознал свои ошибки в утверждениях... с точки зрения стороннего читателя.
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 13-08-2003 08:00 » 

Цитата

Соответственно, при обращении к нему другого процесса, счетчик увеличивается на 1.


Отвечу за Grom.
Как известно из Win32API для использования чего-то надо получить handle этого чего-то. Что такое этот handle?
Каждый процесс имеет таблицу, называемую handle table. Не будем вдаваться в структуру этой таблицы, так как она меняется с разными версиями системы. Записи этой таблицы- указатели на объекты ядра,вернее сказать объекты подсистемы Executive, которая находится над ядром. Объекты executive включают в себя и объекты ядра, причем объект ядра обычно в самом начале, то есть нет разницы между указателем на объект ядра и объект executive, просто объект executive больше по размеру, например начало структуры, описывающей процесс выглядит вот так
typedef struct _EPROCESS
        {
/*000*/ KPROCESS               Pcb;
/*06C*/ NTSTATUS               ExitStatus;
/*070*/ KEVENT                 LockEvent;
/*080*/ DWORD                  LockCount;
/*084*/ DWORD                  d084;
/*088*/ LARGE_INTEGER          CreateTime;
/*090*/ LARGE_INTEGER          ExitTime;
/*098*/ PVOID                  LockOwner;
/*09C*/ DWORD                  UniqueProcessId;
.......................
} EPROCESS;
При этом EPROCESS- объект подсистемы EXECUTIVE, а первый член этой структуры Pcb- это объект ядра KPROCESS.
 Так вот handle- это просто индекс в таблице handle table. Только имейте в виду, что например в Win2k в handle на самом деле три индекса, то есть он поделен на три части и в каждой из них- индекс, что обусловлено применением промежуточных таблиц для уменьшения суммарного размера таблицы( сделано точно так же как в процессрах Intel подсистема трансляции виртуального адреса в физический).
 У каждого процесса своя таблица описателей (handle table). Таким образом, каждый процесс должен каким то образом занести в свою таблицу указатель на объект, что и делается путем открытия объекта(CreateFile и т.д.) или наследования описателя(что означает копирование записи из таблицы одного процесса в таблицу другого, причем по одинаковым индексам), и в том и в другом случае произойдет увеличение счетчика. Вот это и имел в виду Grom.

 Каждый объект в ядре имеет заголовок(header). Интересно отметить, что указатель на объект, который возвращают все ф-ции и который и надо передавать ф-циям, указывает не на этот заголовок, а на тело самого объекта( например, описываемого структурой EPROCESS), чтобы получить указатель на заголовок надо отнять 0x18h байт от указателя на тело объекта. То есть заголовок находится перед телом объекта и его тщательно скрывают. Структура заголовка такая
typedef struct _OBJECT_HEADER
        {
/*000*/ DWORD        PointerCount;       // number of references
/*004*/ DWORD        HandleCount;        // number of open handles
/*008*/ POBJECT_TYPE ObjectType;
/*00C*/ BYTE         NameOffset;         // -> OBJECT_NAME
/*00D*/ BYTE         HandleDBOffset;     // -> OBJECT_HANDLE_DB
/*00E*/ BYTE         QuotaChargesOffset; // -> OBJECT_QUOTA_CHARGES
/*00F*/ BYTE         ObjectFlags;        // OB_FLAG_*
/*010*/ union
            { // OB_FLAG_CREATE_INFO ? ObjectCreateInfo : QuotaBlock
/*010*/     PQUOTA_BLOCK        QuotaBlock;
/*010*/     POBJECT_CREATE_INFO ObjectCreateInfo;
/*014*/     };
/*014*/ PSECURITY_DESCRIPTOR SecurityDescriptor;
/*018*/ }
        OBJECT_HEADER,
     * POBJECT_HEADER,
    **PPOBJECT_HEADER;

Как нетрудно догадаться HandleCount- счетчик числа открытых описателей этого объекта, вот он то и изменяется при открытии и закрытии объекта.
  И еще очень интересный факт- над этим OBJECT_HEADER может находится еще до 4 структур, описывающих объект, эти структуры содержат имя объекта и другую инфу об объекте.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #4 : 13-08-2003 08:18 » 

Цитата

Вот это и имел в виду Grom.

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

Таким образом, возможно обращение напрямую к копии структуры объекта ядра, локальной для процесса, или же при изменении напрямую я изменю и объект ядра тоже.... :?:
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 13-08-2003 08:25 » 

Цитата

Таким образом, возможно обращение напрямую к копии структуры объекта ядра, локальной для процесса, или же при изменении напрямую я изменю и объект ядра тоже....


А никаких копий нет. Объект ядра(executive) только в одном экземпляре. В таблице процесса только указатели на него, а в handle индекс в таблице. Изменение объекта ядра из приложения невозможно, так как он находится в памяти, доступ к которой из юзер мода невозможен(в процессорах IA-32 это 3 кольцо), проще говоря - он находится в пулах ядра.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #6 : 13-08-2003 08:36 » 

Однако - если я создал объект то по смещению тобой указанному, я могу выйти на заголовок с указтелями на рельные значения.
При обращении к ним я получу Protection Fault?
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 13-08-2003 08:58 » 

Цитата

При обращении к ним я получу Protection Fault


Естественно, как и для любого адреса в пространстве ядра.
Адреса то выше 0x8XXXXXXX на IA-32, то есть недоступны из юзер мода.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #8 : 13-08-2003 09:00 » 

Спасибо Слав, с тобой всегда интересно.
Надеюсь сегодня продолжу тему ядра, может завтра....
Записан

А птичку нашу прошу не обижать!!!
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #9 : 13-08-2003 19:49 » 

Цитата

У каждого процесса своя таблица описателей (handle table). Таким образом, каждый процесс должен каким то образом занести в свою таблицу указатель на объект, что и делается путем открытия объекта(CreateFile и т.д.) или наследования описателя(что означает копирование записи из таблицы одного процесса в таблицу другого, причем по одинаковым индексам), и в том и в другом случае произойдет увеличение счетчика.

 
Я то это знаю, поэтому мне понятно что имел ввиду Гром, но вот тот кто НЕ знает, без такого объяснения и не понял бы (потому как фраза обращение к объекту ядра в данном контексте только сбивает непосвященного с толку)...

Цитата

Слава ты прав - но я это не объяснял...


Это то и имелось ввиду

Всем большое спасибо за дискуссию.
Я думаю на данном этапе тема себя исчерпала.
Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #10 : 13-08-2003 20:29 » 

Цитата

Естественно, как и для любого адреса в пространстве ядра.
Адреса то выше 0x8XXXXXXX на IA-32, то есть недоступны из юзер мода.


совершенно верно... НО это относится только к Win2000 или старше, да еще и при условии, что для приложений отведено 2 Гига памяти. А при установки ключа в boot.ini не помню точно какого, чегото вроде /3Gb и при компиляции проги с использованием ключа /LARGEADDRESSAWARE или в Win98 обращение к мамяти по адресам с 0x80000000 по 0xBFFFFFFF (за исключением адресного пространства в 64 кило в диапазоне с 0xBFFF0000 по 0xBFFFFFFF в Win2000) из пользованельского мода вполне возможно и законно...

но это я уже наверное придираюсь, так что прошу меня за это великодушно простить и на этом наверное тему закрыть
Записан

С уважением Lapulya
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #11 : 14-08-2003 05:35 » 

Цитата

но это я уже наверное придираюсь


Точно. А то я еще могу и 64 разрядный 2003 сервер посмотреть.
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #12 : 14-08-2003 07:17 » 

Ну маленькая придирочка конечно имела место быть но....

Цитата

Естественно, как и для любого адреса в пространстве ядра.
Адреса то выше 0x8XXXXXXX на IA-32, то есть недоступны из юзер мода.


Значит речь идет о 32-х битных платформах, 64-битный сервер тут не при чем,
поэтому уточнения обоснованы и корректны
Записан

С уважением Lapulya
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #13 : 14-08-2003 08:21 » new

lapulya, проявления знаений приветствую...
Чем занимаешься в жизни???

Это я так оффтопом занимаюсь Улыбаюсь

Кстати нет желания при наличии таких знаний расписать некоторые вещи самому? Публикацию гарантирую, Славик - помнишь я тебе так же предлагал ?  Отлично
Записан

А птичку нашу прошу не обижать!!!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines