![]() |
Короче, такая задача.
В системе есть некое количество объектов типов. Если говорить проще, то это объекты типов. Например, в 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 процентов. Если что-то непонятно - разжую :). |
vasketsov
На сколько я помню, функции с префиксом Nt не предназначены для использования кем-либо окромя системы. Т.е. они не описаны в стандартных хидерах, и импортировать их приходится ручками по номеру. Или я не прав? И в MSDN о них не слова. И попутно, а зачем это нужно? |
ivank
существуют ntdll.h ntdll.lib в DDK. Но там мало, приходится сторонние источники подымать, книжки умные, е-буки, и прочее. Зачем надо. Предположим, хочется тебе прибить объект системный. Любой из тех, что можно прибить не из ядра (а это почти все объекты, если права есть). А что за объект - неизвестно. Иногда и по имени его можно догадаться, если он именованый, а если нет - то беда. А перечисление объектов, как я уже писал, выдает только индекс типа, а не сам тип. А "объект типа 24" как-то страннее звучит, чем File или Key. |
Думаю, здесь помогут с большей вероятностью: http://forum.ixbt.com/?id=26
|
Время: 08:05. |
Время: 08:05.
© OSzone.net 2001-