Господа! NTKERNELAPI NTSTATUS NTAPI ObOpenObjectByName( __in POBJECT_ATTRIBUTES ObjectAttributes, __in_opt POBJECT_TYPE ObjectType, __in KPROCESSOR_MODE AccessMode, __inout_opt PACCESS_STATE AccessState, __in_opt ACCESS_MASK DesiredAccess, __inout_opt PVOID ParseContext, __out PHANDLE Handle ); При вызове ObOpenObjectByName всегда использовал NULL в качестве ObjectType, этим эта ф-ия и ценна! НО! в Win7 (возможно и в WinVista) с такими параметрами ф-ия возвращает STATUS_INVALID_PARAMETER. Как я понимаю именно из-за NULL в качестве ObjectType. Вопрос: связано ли это с безопасностью, теперь никак нельзя использовать данную ф-ию без валидного ObjectType?
Почему ты не знаешь тип объекта, имя которого передаёшь в ObOpenObjectByName()? Откуда у тебя это имя? Да, проверка жёстко зашита в ядре.
Спасибо, господа. Но, к сожалению, ничего нового... Этот вопрос был скорее риторическим. Дело в том, что изначально Object Manager так и проектировался, а именно, отсутствие наследования и абстрактных классов, а значит и полиморфизма. Поэтому задача получения объекта без четкого определения его типа некорректна. Но до сих пор существовала такая возможность. Благо теперь закрыли. Практические реализации, конечно же, остались. Алгоритмы давно известны и проработаны. Интересовала исключительно идеологическая сторона вопроса. Кстати, x64, прежде чем обсуждать данную тему, я бы советовал Вам изучить все-таки Object Manager, и все существующие особенности и изменения. Просто, изучив Ваши заметки ("Типы объектов ядра") в блоге, очень расстроился. Сомнительна полезность некоторых высказываний, например: "Для этого вам следует вызвать ZwOpenFile и указать полное имя типа в атрибутах, например, \ObjectTypes\Thread или \ObjectTypes\Callback, передав затем полученный хендл в функцию ObReferenceObjectByHandle" Кстати, идея с kernel mode блогом на русском очень хороша. Заглядывайте туда)
Если бы ты сразу сообщил о том, что ты гуру, мы не утруждали бы себя ответами. Этот совет был излишним. Честно говоря, не хотел никого расстраивать. Конкретно, в чём сомнительность? Замечаниям по-существу всегда рад. Спасибо.
Если есть имя не только объекта, но и его типа, то схема следующая: Получаем объект типа объектов (nt!ObpTypeObjectType), например, вызовом ObGetObjectType(ExEventObjectType). Дальше можно открыть тип объекта по имени той же функцией ObOpenObjectByName(). Имея на руках указатель на тип - открываем без лишних заморочек любой объект этого типа по имени. Детали: http://eretik.omegahg.com/art/00.html Видимо это связано с расширением "ядерного" API менеджера объектов функцией ObGetObjectType()
У него там прототип новой функции некорректный, там на выходе POBJECT_TYPE будет, а не NTSTATUS. Алсо, чутка обновил свой пост, исправив попутно пару опечаток. Набигайте.