Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизЗначения описателей объектов ядра Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c