Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Значения описателей объектов ядра   Найти похожие ветки 

 
begin...end ©   (2005-09-13 20:25) [0]

Рихтер пишет, что хэндлы объектов ядра фактически представляют собой смещения от начала таблицы описателей в процессе (для Win98 -- в элементах, для Win2000 -- в байтах). Если Рихтер привёл полное описание структуры элементов таблицы, то каждый элемент должен занимать 12 байт. В то же время, приведённый ниже код показывает, что при последовательном создании двух объектов ядра одинакового типа значения их хэндлов отличаются на 4 (либо в большую, либо в меньшую сторону, но в любом случае на 4), причём как в WinXP, так и в Win98.

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils, Windows;

var
 hS1, hS2: Cardinal;
 hE1, hE2: Cardinal;
begin
 hS1 := CreateSemaphore(nil, 0, 1, "UNIQUE_SEMAPHORE_1");
 hS2 := CreateSemaphore(nil, 0, 1, "UNIQUE_SEMAPHORE_2");
 hE1 := CreateEvent(nil, False, False, "UNIQUE_EVENT_1");
 hE2 := CreateEvent(nil, False, False, "UNIQUE_EVENT_2");
 WriteLn(Format("Semaphores: %d %d  Events: %d %d", [hS1, hS2, hE1, hE2]));
 CloseHandle(hS1);
 CloseHandle(hS2);
 CloseHandle(hE1);
 CloseHandle(hE2);
 ReadLn
end.


Чем можно объяснить это? Меня не покидает ощущение, что я в чём-то глубоко заблуждаюсь, но в чём?

Я понимаю, что использовать информацию о структуре таблицы на практике не следует. Мне просто интересно.


 
BiN ©   (2005-09-13 21:40) [1]

Дабы не пересказывать Соломона и Руссиновича, выкладываю отрывок из их книги "Windows 2000 Inside" (252 K)
http://binary.front.ru/downloads/books/internals/handletables.zip


 
Игорь Шевченко ©   (2005-09-14 10:04) [2]


> Рихтер пишет, что хэндлы объектов ядра фактически представляют
> собой смещения от начала таблицы описателей в процессе


Рихтер ошибается или ты неверно читаешь.


 
begin...end ©   (2005-09-14 10:13) [3]

> BiN ©   (13.09.05 21:40) [1]

Спасибо. По крайней мере, становится ясно, что не всё так просто, как пишет Рихтер :-)

> Игорь Шевченко ©   (14.09.05 10:04) [2]

"Все функции, создающие объекты ядра, возвращают описатели, которые привязаны к конкретному процессу и могут быть использованы в любом потоке данного процесса. Значение описателя представляет собой индекс в таблице описателей, принадлежащей процессу, и таким образом идентифицирует место, где хранится информация, связанная с объектом ядра. (...) Кстати, в Windows 2000 это значение определяет, по сути, не индекс, а скорее байтовое смещение нужной записи от начала таблицы описателей." (с) Рихтер


 
Игорь Шевченко ©   (2005-09-14 10:38) [4]


> Значение описателя представляет собой индекс в таблице описателей,
>  принадлежащей процессу


Вот это и есть истина. В этом Рихтер не ошибается, действительно индекс.


 
begin...end ©   (2005-09-14 10:43) [5]

> Игорь Шевченко ©   (14.09.05 10:38) [4]

Ну а про Win2000, получается, ошибся?

И всё-таки, Соломон с братом его во Христе Руссиновичем правильную информацию дают? :)


 
Игорь Шевченко ©   (2005-09-14 10:56) [6]

begin...end ©   (14.09.05 10:43) [5]


> Ну а про Win2000, получается, ошибся?


Ну он же не говорит, что явно в байтах, он же пишет "скорее" :)) Так что простим Рихтеру :) Таблица описателей устроена достаточно хитро, поэтому в какой-то ее части handle действительно является смещением. Например, в индексе этой таблицы.

Соломон с Руссиновичем не ошибаются, их правоту подтверждает отладчик Windows, позволяющий увидеть таблицу описателей процесса :)


 
Бурундук ©   (2005-09-14 12:09) [7]

У Шрайбера в "Недокументированных возможностях" было
описание хэндлов ядра. Я читал её довольно давно,
и уже порядком подзабыл, а под рукой сейчас нет.
Помню, что устройство хэндлов в 95/98 и 2000/ХР разное.
Он, кажется, писал, что в 2000/ХР таблицы хэндлов ядра имеют трёхуровневую структуру. В первичной таблице лежат указатели на вторичные, во вторичных - на третичные, в третичных - на сами объекты.
Соответственно, хэндл состоит из трёх индексов (или смещений - не помню),
и ещё чего-то.
В общем, устроены они достаточно хитро и нетривиально.



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
2-1130232065
BaxTMaH
2005-10-25 13:21
2005.11.13
Объявление переменных


14-1129741679
pazitron_brain
2005-10-19 21:07
2005.11.13
Помогите найти ветку.


14-1129729245
Pavelkq
2005-10-19 17:40
2005.11.13
Структурная схема TStringList


14-1129797523
старый маразматик(с)
2005-10-20 12:38
2005.11.13
Алаплант Мулдашева


14-1129720995
Digitman
2005-10-19 15:23
2005.11.13
doc/xls/rtf <-> xml/xsl