ObQueryNameString зависает
От: cppboris  
Дата: 08.11.06 13:36
Оценка:
Привет.

Столкнулся с довольно типичной проблемой, как я понял используя поиск
Задача состоит в переборе всех хендлов файлов в системе и получения имен файлов по этим хендлам.
Сначала я делал NtQuerySystemInformation -> NtQueryInformationFile.
Но в таком случае путь не полный, без буквы диска. Так не подходит. Правда в DDK написано, что:

However, if the user has SeChangeNotifyPrivilege (described in the Platform SDK documentation), ZwQueryInformationFile returns the full path in all cases.

Не понятно тогда, почему путь не полный. Ведь эта привелегия есть по умолчанию у всех процессов
Ну да ладно. В связи с этой проблемой хотел использовать NtQueryObject, там уже с путем все нормально, правда в виде HarddiskVolueX... Но как выяснилось эта функция стабильно вешает поток На этом форуме много чего по этому поводу писали уже.
Почитав все это, решил перейти на ObReferenceObjectByHandle -> ObQueryNameString Но тоже все висит!
Хотя как я понял NtQueryObject в случае OBJECT_NAME_INFORMATION вызывает эту же ObQueryNameString...

Помогите!!!

p.s.: Большинство вызовов этих зависающих функций проходят нормально. Вешается только в некоторых случаях. Причем такое чуство, что на конкретном хендле...
Re: ObQueryNameString зависает
От: Злость Россия  
Дата: 08.11.06 13:43
Оценка:
Здравствуйте, cppboris, Вы писали:

[skip]

C>Помогите!!!


C>p.s.: Большинство вызовов этих зависающих функций проходят нормально. Вешается только в некоторых случаях. Причем такое чуство, что на конкретном хендле...


Что за выражение конкретном хендле... — типа чисто на этом конкретном

Узнайте на какой обьект этот хендл указывает. Что за обьект?
Пусто
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re: ObQueryNameString зависает
От: TarasCo  
Дата: 08.11.06 13:53
Оценка:
А случайно IRQL при этом не равен APC_LEVEL?
Да пребудет с тобою сила
Re[2]: ObQueryNameString зависает
От: cppboris  
Дата: 08.11.06 13:54
Оценка:
Здравствуйте, Злость, Вы писали:

З>Узнайте на какой обьект этот хендл указывает. Что за обьект?


В смысле на какой объект? Сначала все хендлы фильтрую по типу (хорошо хоть тип NtQueryObject отдает нормально). Отбрасывается все кроме "File".
А дальше беру имя файла... Тут уже все и висит. Так что посмотреть что за файл не могу Есть конечно у меня указатель на тело объекта (ObReferenceObjectByHandle).
Но что я могу толкового узнать оттуда?

Кстати проверял на разных машинах — везде висит зараза.
Re[2]: ObQueryNameString зависает
От: cppboris  
Дата: 08.11.06 13:57
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>А случайно IRQL при этом не равен APC_LEVEL?


NtQuerySystemInformation\NtQueryObject(тип хендла) — вызываются из user mode.
ObReferenceObjectByHandle\ObQueryNameString — драйвер, по запросу из user mode приложения (ioctl). Т.е. по идее passive level...
Re[3]: ObQueryNameString зависает
От: Злость Россия  
Дата: 08.11.06 14:17
Оценка:
Здравствуйте, cppboris, Вы писали:

[skip]

C>Кстати проверял на разных машинах — везде висит зараза.


!object
И сразу насчет IRQL — !pcr или если это 2003 то сразу !irql
Естественно все это в отладчике смотрим.
Пусто
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.