Это дополнение к другому вопросу, найденному здесь .
Вкратце: Я хотел бы перечислить все открытые файлы в системе и получить связанные с ними имена файлов . Если это неправильный подход или есть другой путь, пожалуйста, дайте мне толчок в правильном направлении. Или, если я упускаю какие-либо детали или что-то неясно, пожалуйста, кричите на меня.
Как и другой вопрос (ссылка выше), мне нет дела до языка (хотя решение на 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 +, поэтому использование недокументированных функций действительно не является проблемой.
Еще раз спасибо!