NTLinks plugin for Total Commander
----------------------------------
(information in English is below)

Модуль для получения информации о точках переподключения NTFS:
+ получение индексов файлов, количества жестких ссылок и путей к ним
+ получение пути целевого объекта ссылок и реального пути объектов
+ поддержка символических ссылок, появившихся в Windows Vista/7
+ чтение/запись пути к целевому объекту для символических ссылок и точек соединения
+ сверхбыстрое сравнение жестких ссылок (в пределах одного логического диска)
+ поддержка Юникода и длинных путей


1. Общие возможности

NTLinks - это контентный модуль для ТК, предоставляющий некоторые информационные поля для всплывающих подсказок, пользовательских колонок или поиска в ТК, также есть поле, которое может быть задано в окне установки атрибутов.

Информационные поля:
	HLNK_Count
		Число жестких ссылок (указывает, сколько файлов в папках диска ссылаются на общее физическое содержимое);
	HLNK_Index
		Индекс файла в файловой системе (строка, представляющая уникальный в пределах логического диска 64-битный индекс файла) - для поиска жестких ссылок на один файл;
	File_Type
		Тип объекта (файл, каталог или ссылка - без уточнения типа ссылки). Почти как встроенное поле ТК, но правильно определяет символические ссылки на файлы;
	Obj_Type
		Тип объекта с типом точки переподключения (файл, каталог или определённый тип ссылки);
	RP_Target
		Целевой объект, на который указывает точка переподключения (для точки монтирования - путь первой точки монтирования этого тома, обычно это буква диска). Это поле можно изменить в окне атрибутов;
	RP_IsValid
		Доступность целевого объекта (проверяет, доступен ли диск и возможно ли разрешить все точки переподключения в пути к объекту);
	Obj_RealPath
		Реальный путь любого файла/каталога в системе (раскрываются все точки переподключения в пути);
	Obj_RealSize
		Реальный размер файла (в случае символической ссылки на файл);
	HLNK_Paths
		Пути к первым 10 жестким копиям файла, если доступны (все или только N-й, только с Windows Vista).

Под Windows 2000 необходимы права администратора для корректного определения первой точки монтирования, если том не имеет буквы диска (иначе модуль вернёт путь к текущей точке монтирования).

Для целевого объекта и реального пути возможны два варианта отображения - обычный и символьный. В символьном отображаются уникальные идентификаторы тома (вида Volume{GUID}\, где GUID - некоторая последовательность шестнадцатеричных цифр, разделенных дефисами; их список можно посмотреть, выполнив команду mountvol в консоли), а также относительные пути символических ссылок отображаются в исходном виде. В обычном отображаются полные пути, даже для относительных символических ссылок. Каждое поле возвращает строку в Unicode, если используется ТК 7.50 и старше, и ANSI для старых версий.


3. Установка пути к целевому объекту

Чтобы установить новый путь к целевому объекту для точки монтирования/соединения или символической ссылки, нужно открыть окно изменения атрибутов и задать новое значение в соответствующем поле данного модуля. Модуль не позволяет переключаться между точками монтирования/соединения и символическими ссылками. При добавлении атрибута целевого объекта к пустой папке папка преобразуется в точку монтирования/соединения (и обратно, при очистке целевого пути получается пустая папка). Для изменения целевого пути символических ссылок необходимы права администратора.

Если путь задаётся без префикса \??\ или \\?\, будет произведена дополнительная обработка и добавление нужного префикса. Путь к корневой папке диска (например, C:\) автоматически раскрывается в уникальный идентификатор тома, формируя точку монтирования. При указании полного пути к некоторой папке формируется точка соединения. Если путь начинается с уникального идентификатора тома, его можно указывать без префикса (для символических ссылок префикс всё равно обязателен, чтобы отличать идентификатор тома от имени папки).

Чтобы получить текущее значение пути к целевому объекту, необходимо очистить поле ввода и нажать кнопку >> справа.


4. Сравнение файлов по индексам

Инструмент позволяет моментально определить, идентичны ли 2 файла на одном логическом диске (являются ли жесткими копиями), сравнив их индексы. Может быть полезен при синхронизации папок с жесткими ссылками, а также при наличии точек соединения на одни и те же папки с обеих сторон. Режим включается в диалоге расширенного сравнения (кнопка >> возле опции сравнения по содержимому диалога синхронизации). Специальный знак тождественного равенства отображается для таких файлов.


Обсуждение на официальном русскоязычном форуме: http://forum.wincmd.ru/viewtopic.php?t=13191



NTLinks plugin for Total Commander
----------------------------------
(English section)

Plugin allows working with NTFS reparse points data fields:
+ gets file indices and number and paths of hardlinks
+ gets target path for reparse points and real path for all objects
+ supports symbolic links (new in Windows Vista/7)
+ get/set target path for symbolic links and junctions
+ fastest hardlinks comparison (within same volume)
+ Unicode and long paths support


1. General features

NTLinks is a content plugin for TC, which provides some information fields for TC tooltips, custom columns or searching, also there is a field that may be altered in Attributes dialog.

Content fields:
	HLNK_Count
		Number of hard copies (shows how many files in volume folders point to same physical contents);
	HLNK_Index
		Unique volume index of file (string representing unique 64-bit index of file within volume) - allows searching hard copies;
	File_Type
		Object type (file, directory or reparse point - without specific reparse point type). Like TC internal field but detects file symbolic links properly;
	Obj_Type
		Object type with reparse point type (file, directory or detected reparse point type);
	RP_Target
		Target path for reparse point (for mount point - first mount point path for this volume which is a drive letter usually). This field may be set in Attributes dialog;
	RP_IsValid
		Availability of target path (checks if target drive is available and all reparse points in path may be resolved);
	Obj_RealPath
		Real path of any NTFS object (all reparse points are expanded);
	Obj_RealSize
		Real size of a file (in case of symbolic link);
	HLNK_Paths
		Paths of first 10 hard copies of the file, if available (all or N-th one, requires Windows Vista).

If you're running Windows 2000, admin rights are required to correctly resolve first mount point if volume has no letter assigned (current mount point path returned else - it is a valid mount point too).

You may choose between natural and symbolic output mode. In symbolic mode volume GUIDs (look like Volume{GUID}\, where GUID is a hexadecimal string, separated by hyphens; use mountvol console command to get list of volume GUIDs) are displayed as is, also relative targets of symbolic links are left as is. Natural mode displays full path to target, even for relative symbolic links. Each fields return Unicode string for TC 7.50 and newer, and ANSI string for old TC versions.


2. Setting target path

You should open Change Attributes dialog and choose corresponding plugin field to set target path for selected mount point, junction symbolic link. You can't change reparse point type. If you add attribute for empty folder, it is converted into mount point or junction, depending on path (and back, if you clear target path, you get empty folder). You must have admin rights in order to change target path for symbolic links.

If you specify path w/o prefix \??\, additional path preprocessing is performed. Path to drive's root folder (e.g. C:\) is expanded to volume GUID path and you get mount point. If you specify full path to some folder, you get junction. If path is started with volume GUID, you may omit prefix (for symbolic links you must specify prefix to distinguish volume GUID and folder name).

In order to get current target path you should clear edit field and click >> near the field.


3. Compare files by indices

Instrument is able to determine instantly, if two files within the same volume are identical (if they are hard copies), by comparing their file system indices. It may be helpful if you compare folders with hardlinks or if you have junctions to same folders on both sides. You may enable it in user-defined compare dialog (button >> near compare by contents option of Synchronize dialog). Special identical equality sign is displayed for such files.


Discussion page on official board: http://www.ghisler.ch/board/viewtopic.php?t=23681



History:

2025-02-05	1.6.1.292
	* Obj_RealPath field now handles relative links to links
	* RP_IsValid field is recursive now, like Obj_RealPath

2025-01-30	1.6.1.290
	* fixed modifying target attribute for links
	* 'Compare indexes' field renamed to 'Compare indices'

2022-07-04	1.6.1.280
	* fixed hard copy path for links to another volumes
	* fixed setting target attribute for non-links

2019-10-24	1.6.1.270
	+ File_Type field added (like TC internal field but treats file symlinks as reparse points)
	* another relative symlink real path bug
	* some optimizations

2018-09-01	1.6.0.254
	* ignore last file cache on timestamp change
	* fixed symlink target for U: drive
	* fixed relative symlink real path when one of parents is a link
	* always show relative target for relative symlinks
	* if both symbolic and natural targets were requested for an UNC path, second one was broken

2016-01-07	1.6.0.244
	* reading relative not null-terminated symlink paths

2015-10-26	1.6.0.242
	+ long path support

2012-03-12	1.5.3.216
	+ shows size 1 KB/MB/GB instead of 0 for non-empty files

2012-04-26	1.5.3.214
	+ new field to get paths of hard copies of the file (first 10 items, requires Windows Vista)
	+ new field to get real size of a file behind symlink
	* wrong real path for file symlinks
	* full target was shown instead of relative one sometimes
	* improved junction detection if path starts with volume GUID
	* ANSI to Unicode conversion bug in non-Unicode functions (introduced in 1.5.0.108)

2011-09-19	1.5.2.162
	+ 64-bit version of plugin added (requires 64-bit TC version)
	* wrong reparse point type detection after creating reparse point

2011-06-15	1.5.1.156
	+ special identical equality icon for index compare (for Synchronize by contents dialog)
	+ removes \??\ prefix for symbolic target of mount points too
	+ allows setting path starting with volume GUID w/o prefix \??\ (for mount points and junctions)
	+ understands symlinks and junctions starting with volume GUID
	+ gets privilege required to modify symlinks
	* clears cache on refresh or change dir in TC
	* wrong prefix for target of absolute symlink
	* shows number of hardlinks for dirs and symlinks

2011-06-11	1.5.0.124
	+ keeps last file data in cache (should work faster when many plugin columns used)
	+ natural mode for symlinks now returns full path even if link contains relative one
	+ set/remove target path feature (via Attributes dialog) for mount points/junctions and symbolic links
	+ compare files by file/volume index function (for Synchronize by contents dialog)
	* max number of expands in real path reduced to 32 (Windows doesn't allow more than 31 reparse points in a path)
	* faster algorithm for real path
	* fixed some reparse point types
	* Unicode and ANSI fields joined together (same fields return ANSI strings in old TC versions)

2010-05-12	1.0.0.74
	* returned wrong real path for symlinks with target started with backslash (relative to root) due to Unicode conversion

2010-04-01	1.0.0.72
	+ Unicode support
	+ two new Unicode fields added: RP_TargetW, Obj_RealPathW
	+ changed module base address
	* for non-existent files type 'reparse point' was displayed

2009-09-01	1.0.0.56
	+ uses FindFirstVolumeMountPoint function under Windows 2000 if available (admin rights)
	+ symbolic mode for target and real path fields - doesn't expand mount points

2009-08-29	1.0.0.48
	+ real path field that have reparse points expanded
	+ max 256 expands to avoid loops
	* reparse points not always expanded if current program folder is reparse point
	* next reparse point may leave unexpanded if its nesting level less than processed level

2009-08-28	1.0.0.30
	+ some new reparse point types
	* now supports Windows 2000 (calls GetVolumePathNamesForVolumeNameW dynamically)

2009-08-26	1.0.0.xx
	! first public release
	+ returns info about file index, number of copies, reparse points type and target, target availability
	+ symlinks support
