Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Перечисление объектов типов (http://forum.oszone.net/showthread.php?t=30868)

vasketsov 22-04-2002 16:59 210475

Короче, такая задача.
В системе есть некое количество объектов типов.
Если говорить проще, то это объекты типов.
Например, в 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 210476

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

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

vasketsov 23-04-2002 10:47 210477

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

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

ivank 24-04-2002 17:32 210478

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


Время: 08:05.

Время: 08:05.
© OSzone.net 2001-