Это надстройка к другому вопросу 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 +, поэтому использование недокументированных функций действительно не вызывает беспокойства.
Еще раз спасибо!
Большое спасибо за это. На самом деле даже в системе, большей, чем WinXP, это проблема. * Если у вас есть полный путь к файлу *, то вы можете использовать Restart Manager. Но моя проблема заключалась в том, что у меня есть PID, и теперь мне нужно знать все файлы, которые блокирует PID, поэтому мне пришлось использовать этот метод, чтобы перечислять дескрипторы, а затем получить пути к файлам. Спасибо, что спросили об этом! http://stackoverflow.com/q/39910608/1828637 – Noitidart