Я искал решение для получения всех созданных/измененных и удаленных файлов определенным процессом из сеанса трассировки событий (ETW) (я буду обрабатывать данные из файла etl, а не из сеанса в реальном времени).
По-видимому, самым простым решением для этого было получение событий FileCreate и FileDelete от FileIo_Name и сопоставьте их с соответствующим DiskIo_TypeGroup1. Однако это решение не работает для меня, так как я не получаю никаких событий DiskIo_TypeGroup1 для соответствующих событий FileDelete, поэтому я не могу получить идентификатор процесса. Также не со всеми событиями FileCreate связано событие DiskIo_TypeGroup1 (думаю, это происходит для пустых созданных файлов или только для открытых файлов).
Примечание. Мне необходимо сопоставление DiskIo_TypeGroup1, поскольку в событиях FileIo_Name не заполнены члены ThreadId и ProcessId — они установите значение (ULONG)-1. Кроме того, я не могу решить, какие файлы были только что открыты или изменены, не зная «размера записи файла». DiskIo_TypeGroup1 также не имеет заполненных элементов ThreadId и ProcessId (в заголовке события в более новых ОС), но имеет Член структуры IssuingThreadId, из которого я могу получить сопоставление ProcessId с событиями класса Thread_TypeGroup1.
Поэтому я исследовал, как класс FileIo_Create может мне помочь, и заметил, что могу получить элемент CreateOptions, который может иметь следующие флаги: (FILE_SUPERSEDE, FILE_CREATE, FILE_OPEN , FILE_OPEN_IF, FILE_OVERWRITE, FILE_OVERWRITE_IF). Но первоначальная проблема все еще сохраняется. Как проверить, был ли файл создан с нуля, а не только что открыт (например, в случае FILE_SUPERSEDE)?
Возможно, я смогу использовать класс FileIo_ReadWrite для получения события Write. Например, при использовании класса DiskIo_TypeGroup1. Итак, если что-то было записано в файл, то могу ли я предположить, что файл был либо создан, либо изменен?
Чтобы найти удаленные файлы, я думаю, что класс FileIo_Info и событие Delete являются решением. Думаю, я могу получать события Delete и сопоставлять их с FileIo_Name, чтобы получить имена файлов.
Примечание: FileIo_Create, FileIo_Info, FileIo_ReadWrite содержат информацию об идентификаторе процесса.
Верны ли мои предположения? Что будет лучшим решением для моей проблемы?