PDA

Показать полную графическую версию : Перечисление объектов типов


vasketsov
22-04-2002, 16:59
Короче, такая задача.
В системе есть некое количество объектов типов.
Если говорить проще, то это объекты типов.
Например, в 2000-й их 27 штук.
Перечислять я их тут не буду, смысла нет.
Каждому типу объектов соответствует
1) номер (число)
2) название (строка)
(это то, что видно не из ядра)

Фишка в том, что нумерация типов объектов в разных системах разная. То есть, при переходе с 2000-й на ХР добавили не просто 2 объекта, а втолкнули их в середину.
Однако необходимо уметь определять тип объекта по его номеру типа.

Перечислить все типы труда не представляет, они хранятся в директории \ObjectTypes (к файловой системе это отношения, разумеется, никакого не имеет). Но беда в том, что перечисляются они в непонятном порядке. То есть, точно не по возрастанию номера типа (может, по очереди создания?). У меня, например, первым всегда идет Directory, хотя с 1-м типом - это Type.
Вот и задача, как научиться определять порядок типов.

Делаю так.
1) NtOpenDirectoryObject для L"\\ObjectTypes" отрабатывает правильно.

2) NtQueryDirectoryObject( hDir, buf, dwSize, FALSE, TRUE, &dwContext, &dwRetSize)
возвращает в буфер данные в виде массива структур

typedef struct
_DIRECTORY_BASIC_INFORMATION {
UNICODE_STRING ObjectName;
UNICODE_STRING ObjectTypeName;
} DIRECTORY_BASIC_INFORMATION, *PDIRECTORY_BASIC_INFORMATION;

то есть отсюда точно не выудить никаких номеров.
ObjectTypeName здесь всегда Type.

вот и все.

Если тупо вызывать NtQuerySystemInformation для хэндлов (16 по-моему) - там возвращается тип объекта, но беда в том, что ядром экспортируются не все объекты, и инфы об этих объектах вообще не будет в буфере после вызова NtQuerySystemInformation. А хотелось бы не ограничивать возможности только тем набором типов, что перечислился при первом вызове.

Короче, как-то можно это сделать без
1) драйвера режима ядра.
2) условной компиляции (разные экзешники для разных систем)
3) забивания в код имен типов, с полседующей проверкой версии системы.

То есть, без драйвера, и чтоб при выходе новой версии НТ это тоже работало с вер-тью 99 процентов.

Если что-то непонятно - разжую :).

ivank
23-04-2002, 10:37
vasketsov
На сколько я помню, функции с префиксом Nt не предназначены для использования кем-либо окромя системы. Т.е. они не описаны в стандартных хидерах, и импортировать их приходится ручками по номеру. Или я не прав? И в MSDN о них не слова.

И попутно, а зачем это нужно?

vasketsov
23-04-2002, 10:47
ivank
существуют
ntdll.h
ntdll.lib
в DDK.
Но там мало, приходится сторонние источники подымать, книжки умные, е-буки, и прочее.

Зачем надо.
Предположим, хочется тебе прибить объект системный. Любой из тех, что можно прибить не из ядра (а это почти все объекты, если права есть). А что за объект - неизвестно. Иногда и по имени его можно догадаться, если он именованый, а если нет - то беда. А перечисление объектов, как я уже писал, выдает только индекс типа, а не сам тип. А "объект типа 24" как-то страннее звучит, чем File или Key.

ivank
24-04-2002, 17:32
Думаю, здесь помогут с большей вероятностью: http://forum.ixbt.com/?id=26




© OSzone.net 2001-2012