Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-1129977850
boalse
2005-10-22 14:44
2005.11.13
Хороший дизайн


9-1120114310
Мелкий
2005-06-30 10:51
2005.11.13
Проблемка с трансформацией меша в DirectX


6-1122973910
stud
2005-08-02 13:11
2005.11.13
idHTTP настройки прокси


3-1128333732
Prohodil Mimo
2005-10-03 14:02
2005.11.13
Как правильно записать картинку из TImage в базу FB-1.5 ?


2-1130317875
Рома Иванов
2005-10-26 13:11
2005.11.13
html





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский