Вопрос про объекты ядра
Подскажите, можно "ручками" из UserMode обнулить счетчик пользователей у объекта?
Заранее благодарен...
Подскажите, можно "ручками" из UserMode обнулить счетчик пользователей у объекта?
из UserMode это нельзя.
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.
.
Если хендл неизвестен(а получить его - довольно просто), тогда есстественно сделать ничего нельзя. Поэтому вопрос - известен ли хендл обьекта ядра или нет, и есть ли возмоность его получить - является важным дополнением к вопросу.
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 отработает лишь единожды. Если объект имел два открытых хендла в рамках процесса, то освободиться лищь одна ссылка на этот процесс. Т.о. код не обнуляет счетчик ссылок даже для объекта, дважды открытого лишь из одного процесса.
Если хендл неизвестен(а получить его - довольно просто), тогда есстественно сделать ничего нельзя. Поэтому вопрос - известен ли хендл обьекта ядра или нет, и есть ли возмоность его получить - является важным дополнением к вопросу.
"Получить" хендл в рамках процесса означает найти или создать соотв. запись в ЛОКАЛЬНОЙ таблице хендлов данного процесса.
Возможно, не убавить, а обнулить счетчик из KernelMode?