Как и в случае с USN, я ожидаю, что вам нужно пройти немного проб и ошибок, чтобы заставить его работать правильно. Эти наблюдения/догадки могут, я надеюсь, быть полезными:
Когда последняя жесткая ссылка на файл удалена, файл удаляется; поэтому, если последняя жесткая ссылка была удалена, вы должны увидеть USN_REASON_FILE_DELETE вместо USN_REASON_HARD_LINK_CHANGE. Я считаю, что каждый ссылочный номер ссылается на файл (или каталог, но NTFS не поддерживает несколько жестких ссылок на каталоги AFAIK), а не на жесткую ссылку. Поэтому сразу после записи события, по крайней мере, номер ссылки на файл должен быть действительным и указывать на другое имя файла.
Если файл по-прежнему существует, вы можете найти его по номеру ссылки и использовать FindFirstFileNameW
и друзей, чтобы найти текущие ссылки. Сравнивая это с рассматриваемой записью события плюс любые соответствующие последующие события, вы должны предоставить вам достаточно информации, хотя если несколько жестких ссылок для одного и того же файла будут удалены и/или созданы, вы не сможете восстановить порядок, в котором это произошло, и если у вас недостаточно информации о состоянии файловой системы, о которой вы, возможно, не сможете определить удаленные жесткие ссылки. Я не знаю, будет ли это важно для вас или нет.
Если файл больше не существует, вы все равно сможете идентифицировать его по USN-записи, в которой он был удален. Опять же, принимая во внимание все соответствующие события и имея достаточную информацию о предыдущем состоянии, вы должны иметь возможность восстановить большую часть того, что произошло, если не порядок.
Есть надежда на то, что мы можем сделать лучше, чем это: имя файла и/или номер ParentFileReference в записи события могут относиться к жесткой ссылке, которая была создана или удалена, а не к произвольной ссылке на файл. В этом случае у вас будет вся соответствующая информация о последовательности событий, кроме того, было ли какое-либо конкретное событие созданием или удалением, которое вы должны уметь выработать, просматривая текущее состояние файла и работая обратно через записи.
Предполагаете, вы уже искали близлежащие записи изменений, которые могут содержать дополнительную информацию? Например, нет записи USN_REASON_RENAME_NEW_NAME, созданной при создании жесткой ссылки, или USN_REASON_RENAME_OLD_NAME при удалении жесткой ссылки? Или парные записи USN_REASON_HARD_LINK_CHANGE, один для файла, один для каталога, содержащего жесткую ссылку на файл, связанный с файлом? (Желательного мышления, я ожидаю, но было бы не больно смотреть!)
Для целей тестирования вы можете создавать жесткие ссылки с помощью команды mklink
.