Список всех открытых файлов - PullRequest
6 голосов
/ 02 сентября 2010

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

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

Как и другой вопрос (ссылка выше), мне нет дела до языка (хотя решение на 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 Ответ

5 голосов
/ 02 сентября 2010

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

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

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

...