Как определить порядок открытия файлов для процесса?

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

В настоящее время мы используем внутренние API-интерфейсы Windows из Ntdll.dll (Winternl.h), чтобы определить список всех открытых файлов для процесса. Возможно, это не лучший способ сделать это. Любые предложения высоко ценятся.

Мы полагались на наблюдаемое поведение этих API на определенной версии ОС и определенных версиях программного обеспечения Dj, которое заключалось в том, что список всех открытых файлов для процесса никогда не перестраивается, то есть придерживается порядка. Я знаю, что это плохая практика, но это было «должно быть» от клиента прямо перед выпуском, поэтому нам пришлось. Проблема в том, что теперь у нас есть ошибка, когда эти дескрипторы иногда случайным образом переставляются без какой-либо особой причины. Это все тормозит. Я думал, может быть, в этих структурах win будет поле для получения времени открытия файла, но, похоже, таких вещей нет. Документы по этим API довольно плохие.

Я думал о вставке кода, но это функция длиной в 200 строк, и она использует косвенные вызовы из dll с использованием указателей функций, а все структуры для WinAPI переопределяются вручную, поэтому ее действительно трудно читать. На самом деле заголовок Winternl.h даже не включен — все тоже загружается вручную, вот так:

GetProcAddress( GetModuleHandleA("ntdll.dll"), "NtQuerySystemInformation" );

Это действительно головная боль для кросс-платформенного приложения...

P.S. Я разместил связанный вопрос здесь о любом кросс-платформенном или Qt-способе получения дескрипторов открытых файлов, возможно, этот материал будет полезен или связан с ним.


person Roman Kruglov    schedule 03.10.2012    source источник
comment
Это очень похоже на вопрос XY: meta. stackexchange.com/questions/66377/what-is-the-xy-problem   -  person David Heffernan    schedule 03.10.2012


Ответы (1)


если просто проверить поведение в другой ОС для целей отладки, вы можете использовать технику создания процесса в режиме отладки и перехватывать по порядку все события загрузки dll, вот хороший статья об этом.

person James from CppDepend Team    schedule 03.10.2012