Есть ли способ получить все открытые дескрипторы файлов для процесса и упорядочить его по времени открытия файлов? У нас есть проект, который требует именно этого — нам нужно определить, какие файлы открываются программным обеспечением Dj, таким как Traktor или Serato. Причина, по которой нам нужно знать его порядок, состоит в том, чтобы определить, какой файл находится в первой колоде, а какой во второй.
В настоящее время мы используем внутренние API-интерфейсы Windows из Ntdll.dll (Winternl.h), чтобы определить список всех открытых файлов для процесса. Может быть, это не лучший способ сделать это. Любые предложения высоко ценятся.
Мы полагались на наблюдаемое поведение этих API на определенных версиях ОС и определенных версиях программного обеспечения Dj, а именно на том, что список всех открытых файлов для процесса никогда не перестраивается, то есть придерживается порядка. Я знаю, что это плохая практика, но это была «должна быть» функция от клиента прямо перед выпуском, поэтому нам пришлось. Проблема в том, что теперь у нас есть ошибка, когда эти маркеры иногда случайным образом переставляются без какой-либо конкретной причины. Это тормозит все. Я подумал, что, возможно, в этих структурах win будет поле для определения времени открытия файла, но, похоже, таких вещей нет. Документы по этим API довольно плохие.
Я подумал о некоторой вставке кода, но это функция длиной в 200 строк, которая использует косвенные вызовы из библиотеки DLL с использованием указателей на функции, и все структуры для WinAPI переопределяются вручную, так что это действительно трудно прочитать. На самом деле, заголовок Winternl.h даже не включен — все вещи загружаются также вручную, вот так:
GetProcAddress( GetModuleHandleA("ntdll.dll"), "NtQuerySystemInformation" );
Это действительно головная боль для кроссплатформенного приложения …
Постскриптум Я отправил связанный вопрос Вот о любом кроссплатформенном или Qt-способе получить дескрипторы открытого файла, возможно, этот материал будет полезным или связанным.
если это просто для проверки поведения в других ОС с целью отладки, вы можете использовать технику создания процесса в режиме отладки и перехватывать в порядке все события загрузки dll, вот хороший статья говорить об этом.
Других решений пока нет …