Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос про объекты ядра

25K
03 марта 2008 года
M.A.R.K
20 / / 08.12.2007
Существуют объекты ядра "процесс", читал Рихтера... :)
Подскажите, можно "ручками" из UserMode обнулить счетчик пользователей у объекта?
Заранее благодарен...
255
03 марта 2008 года
Dart Bobr
1.4K / / 09.04.2004
Плохо читал Рихтера, если задаешь такие вопросы.
261
03 марта 2008 года
ahilles
1.5K / / 03.11.2005
Цитата: M.A.R.K

Подскажите, можно "ручками" из UserMode обнулить счетчик пользователей у объекта?


из UserMode это нельзя.

25K
04 марта 2008 года
M.A.R.K
20 / / 08.12.2007
ahilles, спасибо, обнадежил... :)
255
04 марта 2008 года
Dart Bobr
1.4K / / 09.04.2004
Вопрос и ответ не являются корректными. Итак пусть у меня есть обьект ядра - причем неважно какой. Зная его HANDLE - я элементарно обнуляю счетчик его пользователей, примерно так:
 
Код:
int res = 1;
while (res != 0)
  res = CloseHandle(objHandle);
.
Почему - приведу цитату из мсдн:
Цитата:

CloseHandle invalidates the specified object handle, decrements the object's handle count, and performs object retention checks. After the last handle to an object is closed, the object is removed from the system.

.
Если хендл неизвестен(а получить его - довольно просто), тогда есстественно сделать ничего нельзя. Поэтому вопрос - известен ли хендл обьекта ядра или нет, и есть ли возмоность его получить - является важным дополнением к вопросу.

3
04 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: Dart Bobr
Вопрос и ответ не являются корректными. Итак пусть у меня есть обьект ядра - причем неважно какой. Зная его HANDLE - я элементарно обнуляю счетчик его пользователей, примерно так:
 
Код:
int res = 1;
while (res != 0)
  res = CloseHandle(objHandle);
.


Глупость написана.
Хендл валиден лишь в контексте процесса. Вызов CloseHandle делает этот хендл невалидным в рамках процесса и повторный вызов CloseHandle приводит к ошибке (возвращает FALSE, либо вызывает exeption в зависимости от контекста работы процесса). Это написано в той же цитате из MSDN, что ты приводишь:

Цитата:

CloseHandle invalidates the specified object handle, decrements the object's handle count, and performs object retention checks. After the last handle to an object is closed, the object is removed from the system.


Т.о. в приведенном цикле CloseHandle отработает лишь единожды. Если объект имел два открытых хендла в рамках процесса, то освободиться лищь одна ссылка на этот процесс. Т.о. код не обнуляет счетчик ссылок даже для объекта, дважды открытого лишь из одного процесса.

Цитата: Dart Bobr

Если хендл неизвестен(а получить его - довольно просто), тогда есстественно сделать ничего нельзя. Поэтому вопрос - известен ли хендл обьекта ядра или нет, и есть ли возмоность его получить - является важным дополнением к вопросу.


"Получить" хендл в рамках процесса означает найти или создать соотв. запись в ЛОКАЛЬНОЙ таблице хендлов данного процесса.

25K
05 марта 2008 года
M.A.R.K
20 / / 08.12.2007
Dart Bobr,Green, благодарю, кое-что вы мне разъяснили...
Возможно, не убавить, а обнулить счетчик из KernelMode?
261
05 марта 2008 года
ahilles
1.5K / / 03.11.2005
при обнулении счётчика объект сразу же уничтожится, ибо зачем впустую тратить память, если этим объектом никто не пользуется. просто обнулить неполучится.
25K
06 марта 2008 года
M.A.R.K
20 / / 08.12.2007
ahilles, все понятно, жаль что никак не получится... :(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог