Список всех открытых файлов

Это дополнение к другому вопросу, найденному здесь.

Вкратце: я хотел бы перечислить все открытые файлы в системе и получить связанные с ними имена файлов. Если это неправильный подход или есть другой путь, пожалуйста, дайте мне толчок в правильном направлении. Или, если я упускаю какие-либо детали или что-то неясно, пожалуйста, кричите на меня.

Как и другой вопрос (ссылка выше), мне нет дела до языка (хотя решение на C или C++ не помешает), но я бы хотел, чтобы это работало на Windows XP. Кроме того, я требую избегать драйвера режима ядра.

Проблема, с которой я столкнулся при первоначальном решении этого вопроса, заключается в том, что если дескриптор файла был открыт определенным образом, NtQueryObject звонок может зависнуть. Это описано на форумах SysInternals здесь.

Согласно форумам SysInternals, использование CreateThread с тайм-аутом было приемлемым решением, но, по-видимому, это не позволяет правильно закрывать процесс каждый раз. Даже при отладке в Visual Studio иногда приходится перезагружать компьютер. Иногда приходится перезагружать мой компьютер, когда я запускаю, это не лучший вариант.

Другое принятое решение - пропуск ручек с определенным GrantedAccess, Проблема в том, что я скучаю по слишком многим ручкам, чтобы GrantedAccess изложенные на вышеупомянутых сообщениях форума.

Кто-нибудь может указать мне на решение моей проблемы?

Спасибо!

Изменить: Извините, я должен был более конкретно о моей проблеме. NtQuerySystemInformation звонок достанет мне ручки, NtQueryObject называется с ObjectNameInformation будет висеть на ручках, которые являются синхронными трубами (по крайней мере, так говорят люди). Приведенный здесь пример использует драйвер режима ядра для чтения имени файла из FILE_OBJECT, но я хочу избегать использования драйвера. Так что да, очень похоже на утилиту SysInternals Handle, но я верю, что они также используют драйвер, не так ли?

Редактировать 2: Это своего рода академический интерес, поэтому использование нативного API или других недокументированных методов, которые могут быть нарушены в будущих версиях, не является проблемой. Также GrantedAccess это просто избегает объектов, которые висят было бы идеально.

Редактировать 3: Моя конечная цель - просто увидеть, какие файлы в данный момент открыты в системе. Если это абсолютно неправильный подход, то будет очень признателен другой пункт в правильном направлении.

Редактировать: это просто должно работать на Windows XP, так как есть более элегантные решения для Vista+, поэтому использование недокументированных функций действительно не проблема.

Еще раз спасибо!

1 ответ

Я думаю, что вы можете получить где-нибудь с помощью запрещенного API NtQuerySystemInformation (). Пример проекта, который использует этот API, доступен здесь.

При этом необходимо поднять много предупреждающих флагов, вы пытаетесь использовать намеренно недокументированные внутренние структуры данных ядра. Вы совершенно определенно не хотите делать то, что предлагает эта статья, закрытие файловых дескрипторов невольно является отличным способом вызвать случайное повреждение файловой системы.

И вам будет трудно поддерживать совместимость такого рода кода с будущими версиями Windows. Возможно, лучшее, но не более элегантное решение - использовать утилиту SysInternals Handle. Это, вероятно, будет поддерживаться в течение некоторого времени. Запустите эту программу у себя, перенаправив вывод. Разбор текста выполним.

Другие вопросы по тегам