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