2010-09-02 2 views
6

Это надстройка к другому вопросу here.Список всех открытых файлов

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

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

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

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

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

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

Спасибо!

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

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

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

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

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

+0

Большое спасибо за это. На самом деле даже в системе, большей, чем WinXP, это проблема. * Если у вас есть полный путь к файлу *, то вы можете использовать Restart Manager. Но моя проблема заключалась в том, что у меня есть PID, и теперь мне нужно знать все файлы, которые блокирует PID, поэтому мне пришлось использовать этот метод, чтобы перечислять дескрипторы, а затем получить пути к файлам. Спасибо, что спросили об этом! http://stackoverflow.com/q/39910608/1828637 – Noitidart

ответ

5

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

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

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

+0

Мне нравится, где это происходит. Я обновил свой вопрос. Благодаря! – mrduclaw

+1

Я не хочу звучать аргументированно, так как я, вероятно, смущен и ценю помощь, но у меня создалось впечатление, что из примера вы связали свой файл 'ListFileDrv.c', который содержит' DriverEntry', и обрабатывает IRP_MJ_DEVICE_CONTROL IRPs. код драйвера для копирования имени файла из 'FILE_OBJECT'. Кроме того, процитировав приведенный вами пример: «Драйвер принимает этот адрес и копирует имя файла из FILE_OBJECT, устанавливая его в параметре out из функции DeviceIoControl». В следующем параграфе он описывает извлечение драйвера из встроенного ресурса и его загрузку. – mrduclaw

+0

О, хорошо, я никогда не изучал этот код. Я никогда не буду использовать его. Я подозреваю, что это было обратное преобразование из Handle.exe –

Смежные вопросы