Hubbry Logo
NTFS linksNTFS linksMain
Open search
NTFS links
Community hub
NTFS links
logo
7 pages, 0 posts
0 subscribers
Be the first to start a discussion here.
Be the first to start a discussion here.
NTFS links
NTFS links
from Wikipedia

NTFS links are the abstraction used in the NTFS file system—the default file system for all Microsoft Windows versions belonging to the Windows NT family—to associate pathnames and certain kinds of metadata, with entries in the NTFS Master File Table (MFT). NTFS broadly adopts a pattern akin to typical Unix file systems in the way it stores and references file data and metadata; the most significant difference is that in NTFS, the MFT "takes the place of" inodes (index nodes), fulfilling most of the functions which inodes fulfill in a typical Unix file system.

In NTFS, an entity in the files system fundamentally exists as a record stored in the MFT of an NTFS volume, the MFT being the core database of the NTFS file system and any attributes and NTFS streams associated with said record. A link in NTFS is itself a record, stored in the MFT, which "points" to another MFT record: the target of the link. Links are the file "entries" in the volume's hierarchical file tree: an NTFS pathname such as\foo.exe or \foobar\baz.txtis a link. If the volume containing said pathnames were mapped toD:in a Windows system, these could be referenced asD:\foo.exeandD:\foobar\baz.txt. (Compare and contrast with typical Unix file systems, where a link is an entry in a directory—directories themselves being just a type of file stored in the file system—pointing either to another link, or to an inode.)

[edit]

NTFS has four types of links. These corresponds to the common hard link and soft link concepts.

[edit]

Hard links are typical in behavior. A hard link "points" to an MFT record. That target record will be the record for a "regular" file, such as a text file or executable (assuming the NTFS volume is in a normal "healthy" state). Compare with a typical Unix file system, where a hard link points to an inode. As in such file systems, an NTFS hard link cannot point to a directory.

A typical new file creation event on an NTFS volume, then, simply involves NTFS allocating and creating one new MFT record, for storing the new file entity's file metadata—including, about any of the data clusters assigned to the file, and the file's data streams; one MFT record for a hard link which points to the first newly-created MFT record as its target; storing a reference to the hard link in a directory file; and setting the reference count of both these MFT records to 1. Any file name provided as part of the file creation event is stored in the hard link. An MFT record can be the target of up to 1024 hard links. Each time a new hard link is successfully created, targeting a previously extant MFT record, the target's reference count is incremented.

Symmetrically, the immediate tasks performed by NTFS in a typical file deletion event, when deleting a hard link, are simply: removing the reference to the link from the directory file containing it (the root directory, if applicable); and decrementing by 1 the reference counts of the MFT record targeted by the link, and, of the entry containing the hard link itself. Any MFT record which now has a refcount of  0, is now in the "deleted" state: all its associated resources are considered "free" by NTFS, to be freely overwritten and used as needed.

Junction points

[edit]

Junction points are NTFS reparse points and operate similarly to symbolic links in Unix or Linux, but are only defined for directories, and may only be absolute paths on local file systems (as opposed to remote file systems being accessed). They are created and behave in a similar way to hard links, except that if the target directory is renamed, moved, or deleted, the link will no longer be valid.[1][2]

[edit]

Symbolic links are reparse points which operate similarly to Junction Points, or symbolic links in Unix or Linux, and accept relative paths and paths to files as well as directories. Support for directory and UNC paths were added in NTFS 3.1.

All NTFS links are intended to be transparent to applications. This means that the application accessing a link will be seamlessly redirected by the file system driver, and no special handling is needed. To users, they appear as normal directories or files. This also leads to an aliasing effect: writes to a link will pass the write to the underlying, linked file or MFT entry.

Symbolic links contain the path to the linked directory or file, and a tag identifying the driver which implements the behavior. Because they record the path, they can link to files on other volumes or even remote files. However this also means that if the referenced file is deleted or renamed, the link becomes invalid, and if the referenced file or directory is replaced with another, the link will now refer to the new file or directory.

Compared to shortcut files

[edit]

An NTFS symbolic link is not the same as a Windows shortcut file, which is a regular file, usually with the extension .LNK. The latter may be created on any file system (such as the earlier FAT32), may contain metadata (such as an icon to display when the shortcut is viewed in Remove links), and is not transparent to applications.

Implementations of Unix-like environments for Windows such as Cygwin and MinGW can use shortcut files to emulate symbolic links where the host operating system does not support them, if configured to do so.

Examples of use

[edit]

Built-in uses

[edit]
  • Windows Component Store (WinSxS) use hard links to keep track of different versions of DLLs stored on the hard disk drive.
  • Basic installations of Windows Server 2008 used symlinks for \Users\All Users\ → \ProgramData\ redirection.
  • Since Windows Vista, all versions of Windows have used a specific scheme of built-in directories and utilize hidden junctions to maintain backward compatibility with Windows XP and older. Examples of these junctions are:
    • C:\Documents and Settings pointing to C:\Users
    • %USERPROFILE%\Application Data pointing to %USERPROFILE%\AppData\Roaming
    • %USERPROFILE%\My Documents\My Pictures pointing to %USERPROFILE%\Pictures

Program redirection

[edit]

By setting a junction point that points to a directory containing a particular version of a piece of software, it may be possible to add another version of the software and redirect the junction point to point to the version desired.

Saving storage space

[edit]

The contents of a junction use almost no storage space (they simply point to the original directory). If an administrator needs to have multiple points of entry to a large directory, junction points can be an effective solution. Junction points should not be confused with a copy of something as junctions simply point to the original. If directories need to be modified separately a junction cannot be used as it does not provide a distinct copy of the directory or files within.

Likewise, symbolic links and hard links are useful for merging the contents of individual files.

Circumventing predefined paths

[edit]

Since reinstalling Windows (or installing a new version) often requires deleting the contents of the C: drive, it is advantageous to create multiple partitions so only one partition needs to be deleted during the installation. However, some programs don't let the user choose the installation directory, or install some of their files to the C: drive even when they are installed to a different drive. By creating a junction point, the program can be tricked into installing to a different directory.

Command-line tools

[edit]

Windows comes with several tools capable of creating and manipulating NTFS links.

  • PowerShell: The New-Item cmdlet of Windows PowerShell that can create empty files, folders, junctions, and hard links.[3] In PowerShell 5.0 and later, it can create symbolic links as well.[4] The Get-Item and Get-ChildItem cmdlets can be used to interrogate file system objects, and if they are NTFS links, find information about them. The Remove-Item cmdlet can remove said items, although there has been a record of a bug preventing this cmdlet from working properly.[5]
  • Windows Command Prompt: Starting with Windows Vista and Windows Server 2008, the mklink internal command can create junctions, hard links, and symbolic links.[6] This command is also available in ReactOS.[7] In addition, the venerable dir command can display and filter junction points via the /aL switch.[8] Finally, the rd command (also known as rmdir) can delete junction points.
  • fsutil.exe: A command-line utility introduced with Windows 2000. Its hardlink sub-command can make hard links or list hard links associated with a file.[9] Another sub-command, reparsepoint, can query or delete reparse points, the file system objects that make up junction points, hard links, and symbolic links.[10]

In addition, the following utilities can create NTFS links, even though they don't come with Windows.

  • linkd: It is a component of the Resource Kit for Windows 2000 and Windows Server 2003.[11] It can make junction points.[12]
  • junction: A free command-line utility from Microsoft, it can create or delete junctions.[2]
  • PowerShell Community Extensions (PSCX): Hosted on Microsoft PowerShell Gallery,[13] this module adds several cmdlets for dealing with NTFS links, including: New-Hardlink, New-Junction, Get-ReparsePoint, Remove-ReparsePoint, and New-Symlink.[14]

APIs

[edit]

To create hard links, apps may use the CreateHardLink() function of Windows API. All versions of the Windows NT family can use GetFileInformationByHandle() to determine the number of hard links associated with a file. There can be up to 1024 links associated with an MFT entry. Similarly, the CreateSymbolicLink() function can create symbolic links. Junctions are more complex to create, they require manual reparse point information filling.[15] Junctions are defined for directories only: although the API does not fail when one creates a junction pointing to a file, the junction will not be interpreted successfully when used later.

Junctions and symbolic links pointing to directories can be removed with RemoveDirectory().

Hazards

[edit]

Consistency

[edit]

Symbolic links and NTFS junctions can point to non-existent targets because the operating system does not continuously ensure that the target exists.[16]

Additional hazards lurk in the use of NTFS directory junctions that:

  • include links that refer to their own parent folders, such as creating hard link X:\path\to\parent which points to either X:\path\ or X:\path\to\, or
  • specify targets by using volume drive letters, such as X:, in X:\some\path\.

Recursive structure

[edit]

The problem in the first case is that it creates recursive paths, which further implies infinite recursion in the directory structure. By introducing reentrancy, the presence of one or more directory junctions changes the structure of the file system from a simple proper tree into a directed graph, but recursive linking further complicates the graph-theoretical character from acyclic to cyclic. Since the same files and directories can now be encountered through multiple paths, applications which traverse reentrant or recursive structures naively may give incorrect or incoherent results, or may never terminate. Worse, if recursively deleting, such programs may attempt to delete a parent of the directory it is currently traversing.

Note that both of the conditions listed above exist in the system of hard links established on the C: drive in the default Windows setup. For example, every Windows 10 installation defines the recursive path:

C:\ProgramData\
C:\ProgramData\Application Data\
C:\ProgramData\Application Data\Application Data\
C:\ProgramData\Application Data\Application Data\Application Data\
C:\ProgramData\Application Data\Application Data\Application Data\Application Data\
C:\ProgramData\Application Data\Application Data\Application Data\Application Data\Application Data\ ...

Each additional path name in this seemingly infinite set is an actual valid Windows path which refers to the same location. In practice, path names are limited by the 260-character DOS path limit (or newer 32,767 character limit), but truncation may result in incomplete or invalid path and file names. Whenever a copy of a Windows installation is archived, with directory junctions intact, to another volume on the same—or worse—another computer, the archived copy may still incorporate active folders from the running installation. For example, depending on the method used for copying, a backup copy of a Windows drive X:\archive\... will include a hard link called X:\archive\Users\USERNAME\My Documents which still points to folder C:\Users\USERNAME\Documents\ in the current, active installation.

Cross-volume traversal

[edit]

The second form of deferred target mis-referral, while conceptually simpler, can have more severe consequences. When a self-consistent volume or directory structure containing hard links which use volume drive-letter path names is copied or moved to another volume (or when the drive letter of a volume is reassigned by some other means), such links may no longer point to the corresponding target in the copied structure. Again the results depend on the software that was used for copying; while some programs may intercede by modifying any fully subsumed hard links in the copy in order to preserve structural consistency, others may ignore, copy exactly, or even traverse into hard links, copying their contents.

The serious problems occur if hard links are copied exactly such that they become, in the new copy, cross-volume hard links which still point to original files and folders on the source volume. Unintentional cross-volume hard links, such as hard links in an "archive" folder which still point to locations on the original volume (according to drive letter), are catastrophes waiting to happen. For example, deleting what is much later presumed to be an unused archive directory on a disused backup volume may result in deleting current, active user data or system files.

A preventative measure for the drive-letter hazard is to use volume GUID path syntax,[17] rather than paths containing volume drive letters, when specifying the target path for a directory junction. For example, consider creating an alias for X:\Some\Other\Path at X:\Some\Path\Foo:

X:\Some\Path> linkd Foo X:\Some\Other\Path

As described above, if the folder structure that contains the resulting link is moved to a disk with a drive letter other than X:, or if the letter is changed on drive X: itself, the data content at the target location is vulnerable to accidental corruption or malicious abuse. A more resilient version of this link can partially mitigate this risk by referencing the target volume by its GUID identifier value (which can be discovered by running the fsutil volume list command).

X:\Some\Path> linkd Foo \\?\Volume{12345678-abcd-1234-abcd-1234567890ab}\Some\Other\Path

Doing so ensures that the junction will remain valid if drive letter X: is changed by any means.

As for a proactive means of avoiding directory junction disasters, the command dir /AL /S /B "X:\Some\Path" can be used to obtain, for careful analysis prior to committing any irreversible file system alterations, a list of all hard links "below" a certain file system location. While by definition every link in the resulting list has a path name that starts with X:\Some\Path\, if any of those hard links contains a target which is not subsumed by X:\Some\Path, then the specified scope has been escaped, and the starting directory you specified is not fully-subsuming. Extra caution may be indicated in this case, since the specified directory includes files and directories which reside on other physical volumes, or whose own parent-traversal-to-root does not include the specified directory.

Limitations

[edit]

Privilege requirements

[edit]

The default security settings in Windows disallow non-elevated administrators and all non-administrators from creating symbolic links but not junctions. This behavior can be changed running "secpol.msc", the Local Security Policy management console (under: Security Settings\Local Policies\User Rights Assignment\Create symbolic links). It can be worked around by starting cmd.exe with Run as administrator option or the runas command. Starting with Windows 10 Insiders build 14972 the requirement for elevated administrator privileges was removed in Windows "Developer Mode", allowing symlinks to be created without needing to elevate the console as administrator. At the API level, a SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE flag is supplied for this purpose.[18]

Boot time

[edit]

The Windows startup process does not support junction points, so it is impossible to redirect certain system folders:

  • \Windows
  • \Windows\System32
  • \Windows\System32\Config

Other critical system boot files, such as The sleep image file hiberfil.sys, also do not support redirection.

System-defined locations

[edit]

It is technically possible to redirect the following non-critical system folder locations:

  • \Users
  • \Documents and Settings
  • \ProgramData
  • \Program Files
  • \Program Files (x86)

Doing this may lead to long-term Windows reliability or compatibility issues. Creating junctions for \Users and \ProgramData pointing to another drive is not recommended as it breaks updates and Windows Store Apps.[19]

Creating junctions for \Users, \ProgramData, \Program Files or \Program Files (x86) pointing to other locations breaks installation or upgrade of Windows.[20]

Creating junctions for \Program Files or \Program Files (x86) pointing to another drive breaks Windows' Component Based Servicing which hardlinks files from its repository \Windows\SxS to their installation directory.[citation needed]

Windows installer

[edit]

Windows Installer does not fully support symbolic links. Redirecting \Windows\Installer will cause most .msi-based Windows installers to fail with error 2755 and/or error 1632.

[edit]

Since Windows XP uses the same NTFS format version as later releases, it's feasible to enable symbolic links support in it. For using NTFS symbolic links under Windows 2000 and XP, a third-party driver exists that does it by installing itself as a file system filter.[21][22]

History

[edit]

Symbolic links to directories or volumes, called junction points and mount points, were introduced with NTFS 3.0 that shipped with Windows 2000. From NTFS 3.1 onwards, symbolic links can be created for any kind of file system object. NTFS 3.1 was introduced together with Windows XP, but the functionality was not made available (through ntfs.sys) to user mode applications. Third-party filter drivers – such as Masatoshi Kimura's opensource senable driver – could however be installed to make the feature available in user mode as well. The ntfs.sys released with Windows Vista made the functionality available to user mode applications by default.

Since NTFS 3.1, a symbolic link can also point to a file or remote SMB network path. While NTFS junction points support only absolute paths on local drives, the NTFS symbolic links allow linking using relative paths. Additionally, the NTFS symbolic link implementation provides full support for cross-filesystem links. However, the functionality enabling cross-host symbolic links requires that the remote system also support them, which effectively limits their support to Windows Vista and later Windows operating systems.

See also

[edit]

References

[edit]
[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
NTFS links are file system features in the New Technology File System (), the default file system for and subsequent Microsoft Windows operating systems, that enable multiple directory entries to reference the same underlying file or directory data without creating duplicates. These links promote efficient storage use, flexible file organization, and compatibility with behaviors, primarily through three main types: hard links, junction points, and symbolic links. Hard links, supported since the initial release of in , allow multiple file names on the same volume to point to identical file data blocks on disk. Any modification to the file content via one link is immediately reflected across all associated links, as they share the same inode-like structure, but they are limited to files only and cannot span volumes. Junction points, introduced in , extend similar functionality to directories using reparse points, redirecting access to another directory on the same local volume while appearing as a normal folder. Unlike hard links, junctions cannot target files or remote locations and are designed for local directory aliasing. Symbolic links, added in , provide the most versatile option by allowing references to either files or directories, including across different volumes or even remote paths, functioning like Unix symlinks. They store a path string pointing to the target rather than direct data references, enabling transparent redirection but potentially leading to "dangling" links if the target is moved or deleted. Creation of these links requires appropriate privileges, such as the "Create symbolic links" user right, and can be performed via the mklink command-line tool or Win32 API functions like CreateSymbolicLink. These features collectively enhance NTFS's robustness for enterprise environments, though they come with limitations like volume boundaries for hard links and junctions, and security considerations for symbolic links to prevent unauthorized access. In the NTFS file system, a is a directory entry that references the same underlying file data and metadata as other hard links to that file, with no inherent distinction between the original file and any additional links. All hard links share a unique 64-bit file reference number (FRN), functioning similarly to an inode in file systems, which ensures that modifications to the file's content or most attributes through one link are immediately reflected across all others. Hard links can be created programmatically using the Windows CreateHardLink function, which requires the target file to already exist and both the new link and the existing file to reside on the same volume; alternatively, they can be created from the command line using the fsutil hardlink create utility with administrator privileges. This process adds a new directory entry pointing to the file's existing data blocks without duplicating storage. Hard links apply only to files, not directories, and cannot span volumes. The behavior of hard links is governed by a reference count maintained in the file's master file table (MFT) entry; deleting one decrements this count but leaves the file intact until the count reaches zero, at which point the data is deallocated. Unlike symbolic links, which involve path indirection and support cross-volume references, hard links provide transparent, direct access to the shared data. Hard links enable scenarios where a single file can have multiple names or apparent locations without consuming additional disk space, such as creating aliases for configuration files or using them in backup tools to represent incremental snapshots efficiently. This feature has been supported in since , with user-accessible creation methods like the CreateHardLink API introduced in , and each file can have a maximum of 1024 hard links (including the original).

Junction points

Junction points are a type of designed specifically for directories, allowing transparent redirection of access from one directory to another on local volumes of the same computer. They utilize the reparse tag IO_REPARSE_TAG_MOUNT_POINT to intercept operations and redirect them to the target directory, functioning as a form of soft link limited to directory aliases. Introduced with as part of version 3.0, junction points enable efficient folder redirection without duplicating data, distinguishing them from hard links, which apply only to files on the same volume. Creation of junction points can be accomplished using the mklink /J command in the Windows command prompt, with the syntax mklink /J <link> <target>, where <link> specifies the junction name and <target> is the absolute or relative path to the destination directory. At the level, developers create them via the DeviceIoControl function with the control code FSCTL_SET_REPARSE_POINT, passing a REPARSE_DATA_BUFFER structure containing the necessary reparse data. Junction points cannot reference files or remote network paths, only local directories, and they support linking across different local volumes (e.g., from a directory on C: to one on D:). In operation, junction points provide seamless redirection for applications and the file system; when accessed, the system transparently resolves the junction to its target without user intervention, and modifications to the target are immediately visible through the junction. As of Windows 11 updates in 2025, the RedirectionGuard mitigation restricts traversal of junctions created by non-administrative users to enhance security against redirection attacks. They become visible as reparse points when using command-line tools like dir /AL, which lists them with a <JUNCTION> designation alongside their target path. Unlike symbolic links, junctions resolve only to local volumes and do not support relative paths in a way that allows cross-computer access. Internally, the reparse point data for a is stored in a REPARSE_DATA_BUFFER that includes a substitute name—the absolute path to the target directory—and a print name, which serves as a user-friendly display string for the link. This structure allows the driver to efficiently handle redirection during path resolution. A prominent use of junction points is for in the Windows operating system, where legacy paths like C:\Documents and Settings are implemented as junctions pointing to the modern C:\Users directory, ensuring older applications continue to function without modification. This approach has been employed extensively since to bridge changes in system folder structures. Symbolic links in the NTFS file system are reparse points tagged with IO_REPARSE_TAG_SYMLINK (0xA000000C), which store a Unicode string representing the path to a target file or directory. When accessed, the file system resolves this path transparently to the target, similar to symbolic links in Unix-like systems, allowing applications to interact with the link as if it were the actual file or directory. Unlike junction points, which are limited to local directories on the same volume, symbolic links support targets that are files or directories, including those on remote volumes via UNC paths or even non-NTFS file systems like FAT. Creation of symbolic links can be performed using the mklink command-line utility, where mklink /D creates a directory symbolic link and mklink (without flags) creates a file symbolic link, specifying the link name and target path. Programmatically, the Win32 API function CreateSymbolicLink is used, taking the symbolic link name, target path, and optional flags such as SYMLINK_FLAG_RELATIVE to indicate a relative path. The target path can be absolute or relative, providing flexibility in path resolution; for instance, a relative path like ..\target.txt resolves based on the symbolic link's location. During resolution, if the target does not exist or is inaccessible, operations on the symbolic link fail with an error, such as ERROR_FILE_NOT_FOUND, resulting in a "broken" link. This behavior enables symbolic links to span volumes or network locations, unlike hard links which must remain on the same volume. In contrast to Unix symbolic links, which operate in user space and are resolved by the shell or applications, NTFS symbolic links are handled at the kernel level through the I/O manager, providing elevation transparency where the link inherits the caller's privileges for target access. This kernel-mode implementation was introduced in Windows Vista to enhance compatibility with Unix applications while integrating seamlessly with the NTFS driver. Junction points served as a predecessor mechanism for linking local directories within the same volume, but symbolic links extend this capability to files and cross-volume scenarios. Unlike shortcut files (.lnk), which are parsed in user mode by the shell and visible as distinct objects, symbolic links appear transparent to most file system operations, avoiding the overhead of user-space resolution.

Shortcut files

Shortcut files, known as .lnk files, are binary files used in the Windows operating system to provide user-friendly access to other data objects, such as files, folders, or applications. They function as shell-level wrappers that emulate linking behavior by storing metadata including a shell link header, target paths, custom icons, and command-line arguments, but they are not native filesystem links like those implemented via reparse points. These files were introduced with as part of the shell enhancements in Shell32.dll version 4.00, enabling easier navigation and application launching within the graphical user interface. Unlike true NTFS links, shortcut files are stored as independent binary entities on disk, consuming separate space typically ranging from a few kilobytes depending on the embedded metadata, and they appear as distinct files with an arrow overlay icon in Windows Explorer. Users commonly create shortcut files through the by right-clicking an object in Explorer and selecting "Create shortcut," which generates a .lnk file in the current location, or programmatically via the IShellLink COM interface, which allows setting properties like relative or absolute target paths. The IShellLink interface supports methods such as SetPath and SetRelativePath to define the target's location, ensuring flexibility for both local and network resources. When activated, shortcut files are resolved by the , which interprets the embedded information to launch the target, whether it is a file, folder, , or even another shortcut. They support additional features like global hotkeys for quick access and arguments for passing parameters to executables, but they remain visible and manageable as ordinary files in the filesystem. The internal binary structure of a .lnk file begins with a ShellLinkHeader, which includes a fixed CLSID value of {00021401-0000-0000-C000-000000000046} to identify it as a shell link, followed by flags, , timestamps, and a LinkTargetIDList for the target's location in the shell namespace. Subsequent sections include LinkInfo for path details, optional StringData blocks for descriptions and arguments, and extra data blocks that may reference icons or reparse points if the target is an underlying link. This format allows for rich metadata while maintaining compatibility across Windows versions. For more efficient and transparent redirection at the filesystem level, symbolic links serve as alternatives to shortcut files, though the latter provide shell-specific enhancements like icons and hotkeys.

Practical applications

Built-in system uses

Windows employs junction points extensively in its core structure to maintain with legacy applications and to streamline management. For instance, the folder C:\Documents and Settings serves as an junction point that redirects to C:\Users, allowing older software expecting the pre-Windows Vista path to function seamlessly without modification. Similarly, within user profiles under C:\Users, junction points redirect subfolders such as , , and My Pictures to their actual storage locations, preventing inadvertent duplication while preserving expected paths for applications. These built-in junctions are pre-configured by the userenv.dll component during , ensuring a consistent environment from the initial operating installation. In system folder structures, NTFS links facilitate versioning and organization of shared resources. For , some Windows installers utilize hard links to shared components, particularly in the WinSxS (Windows Side-by-Side) folder, where multiple applications can reference the same DLL or executable via hard links, avoiding redundant storage while enabling side-by-side assembly deployment across different versions. This approach supports efficient updates and installations without disrupting existing software dependencies. A prominent example of this integration is the handling of the All Users profile since , where junction points within the All Users directory redirect to the C:\Users\Public folder for shared user data, such as documents and desktop items accessible to all accounts. This setup, also managed by userenv.dll during logon or setup, promotes a unified sharing model without exposing the underlying Public structure directly. Overall, these NTFS links are integral to Windows' design, providing transparency and reliability in core operations.

Program and application redirection

Symbolic links in enable the redirection of files, allowing applications to run from custom or alternative locations without requiring modifications to registry entries or application configurations. By creating a that points to the actual in a portable or relocated directory, users and applications interact with the link as if it were the original file, ensuring seamless execution. This transparency is inherent to , which appear and behave like normal files to both users and software. Junction points facilitate multi-version management of software by redirecting directory paths to different installations, such as switching between versions of Python without altering environment variables or reinstalling dependencies. For instance, a junction can link a standard installation path like C:\Python to one of several version-specific directories, such as C:\Python3.9 or C:\Python3.10, enabling quick version toggling for development or testing purposes. Junctions support this redirection only for local volumes within the same system, providing a lightweight alternative to full duplication. A practical example involves linking a folder to an entry in the Program Files directory; for instance, creating a at C:\Program Files\MyApp that targets D:\PortableApps\MyApp allows the software to be recognized and launched as if installed conventionally, while keeping the actual files on a removable drive. This approach maintains compatibility with applications expecting standard installation paths. The use of NTFS links for program redirection simplifies software updates by permitting relocation of entire application directories without reconfiguration, and it avoids hardcoding absolute paths in scripts or build processes, enhancing portability across systems. Such practices are common in Windows development environments, including for managing repository symlinks, Node.js for version-specific module paths, and Python for executable aliases.

Storage optimization

NTFS hard links enable storage optimization by allowing multiple directory entries to reference the same underlying blocks on disk, thereby avoiding duplication for identical file copies. This mechanism shares the file's content across different names within the same volume, making it ideal for scenarios like backups and versioning where unchanged files need to be preserved without consuming additional space. For instance, can use hard links to represent prior versions of files, ensuring that only modified requires new storage allocation while maintaining the appearance of full, independent copies. The space savings from hard links are substantial, as each additional link adds only the overhead of a directory entry—typically a few hundred bytes—while the full file size is shared among all links. This approach is particularly effective in deduplication tasks, where multiple instances of the same file can be consolidated to reference a single set of data blocks, limited however to files on the same volume. Symbolic links further support storage optimization by providing a pointer to large targets, such as shared libraries or extensive datasets, without copying the referenced content. Unlike hard links, symbolic links can span volumes and are especially useful for linking dynamic-link libraries (DLLs) to user applications, allowing multiple programs to access common binaries while saving disk space equivalent to the entire target size per link. Each symbolic link incurs minimal overhead, generally around 1 KB or less on disk due to NTFS's storage of small files within the master file table, making them efficient for reducing redundancy in development environments or setups.

Path manipulation and circumvention

in provide a mechanism to bypass application path limitations by mapping a restricted directory to an allowed one, allowing software to access files through an alternative path without altering the application's hardcoded expectations. For instance, a can redirect a read-only system folder, such as parts of the Windows installation directory, to a writable user directory, enabling modifications that would otherwise be blocked by . This approach is particularly useful in scenarios where applications enforce strict path requirements but users need flexibility in data access. Junction points offer a similar capability for circumventing installer paths, allowing post-installation relocation of software directories by creating a that points the original installation path to the new location on the same or different local volume. For example, after installing a simple path-independent application to its default directory, a junction can be established to redirect it to another drive, maintaining compatibility with the software's expected file structure while freeing space on the primary volume. This technique ensures seamless operation without reinstallation, though it requires careful handling to avoid breaking relative references within the software. NTFS links facilitate path manipulation in sandboxing and virtual environments by enabling isolated access to shared resources through redirected paths, which can enhance portability across setups. However, misuse of these links introduces risks, such as unauthorized access traversal or vulnerabilities, as demonstrated in attacks exploiting junction and behaviors. To achieve portable circumvention, relative paths in —using conventions like "." for the current directory or ".." for the parent—allow the link to resolve dynamically based on its containing directory, independent of absolute volume locations. This method supports shared access scenarios akin to storage optimization, where multiple environments reference the same data without duplication.

Creation and management

Command-line utilities

The primary command-line utility for creating NTFS links is mklink, introduced in Windows Vista. It supports various link types through specific switches: /H for hard links to files, /J for directory junctions, and /D for directory symbolic links. The basic syntax is mklink [switch] <Link> <Target>, where <Link> is the path to the new link and <Target> is the existing file or directory it points to. For example, to create a directory symbolic link, one might use mklink /D C:\example_link \\server\share, which creates C:\example_link pointing to a remote share. Creating symbolic links and junctions typically requires administrator privileges, enforced via the "Create symbolic links" user right policy. However, since Windows 10 version 1703 with Developer Mode enabled, non-administrators can create them without elevated privileges. The fsutil utility provides advanced management for hard links and reparse points, which underpin junctions and symbolic links. For hard links, fsutil hardlink create <NewFileName> <ExistingFileName> establishes a new directory entry sharing the same data as the target file. To list all hard links for a file, fsutil hardlink list <Filename> displays their paths. For reparse points, fsutil reparsepoint query <Filename> retrieves details like the tag (e.g., IO_REPARSE_TAG_SYMLINK for symbolic links) and target path without following the link. Deletion uses fsutil reparsepoint delete <Filename>, which removes the link but leaves the target intact. These operations also generally require elevated privileges. To inspect existing links, the dir command with the /AL switch lists reparse points in a directory, displaying attributes such as <SYMLINKD> for directory symbolic links or <JUNCTION> for junctions. For instance, dir /AL C:\ reveals all links at the root, including their targets in the output. This helps identify link structures without third-party tools. For copying directories containing links, [robocopy](/page/Robocopy) offers precise control via flags like /SL to copy symbolic links as links rather than their targets, and /XJ to exclude junctions and symbolic links entirely. An example is robocopy C:\source D:\dest /E /SL /XJ, which mirrors the structure while preserving or skipping links as specified. Similarly, [xcopy](/page/XCOPY) handles symbolic links with /B to copy the link itself instead of the target content, introduced in Windows 8. However, xcopy lacks dedicated junction handling and defaults to copying targets for unresolved links. These tools ensure links are managed during backups or migrations without unintended data duplication.

Application programming interfaces

The provides several functions for developers to create, manage, and resolve links, enabling integration into applications for operations on volumes. These interfaces are part of the Win32 subsystem and support both and symbolic links, with underlying mechanisms leveraging reparse points for symbolic links and junction points. support was introduced in , while symbolic links became available starting with . The CreateHardLink function establishes a hard link to an existing file, allowing multiple directory entries to reference the same file data on an volume. It takes three parameters: lpFileName (the name of the new hard link), lpExistingFileName (the path to the existing file), and lpSecurityAttributes (optional descriptor for the new link, which can be NULL to inherit from the existing file). The function returns a BOOL value, where TRUE indicates success and FALSE failure, with extended information accessible via GetLastError. This is limited to files (not directories) and operates only on local volumes, failing on other file systems like FAT32. For symbolic links, the CreateSymbolicLink function creates a reparse point that redirects to a target file or directory path, supporting both absolute and relative targets. It requires two primary parameters: lpSymlinkFileName (the path for the new symbolic link) and lpTargetFileName (the target path), along with dwFlags to specify link type—SYMLIC_LINK_FLAG_DIRECTORY (0x1) for directory targets or 0 for files—and optionally SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE (0x2) on Windows 10 version 1703 and later to bypass privilege checks in certain scenarios. Like CreateHardLink, it returns a BOOL, but creation typically requires the SeCreateSymbolicLinkPrivilege, resulting in ERROR_PRIVILEGE_NOT_HELD (1314) if not granted. Symbolic links can span volumes and support targets on remote systems via UNC paths, though resolution may vary by application. Reparse point operations, essential for inspecting or modifying symbolic links and junctions, are handled through the DeviceIoControl function with file system control codes like FSCTL_GET_REPARSE_POINT. This retrieves the reparse data buffer for a file or directory , including the tag (e.g., IO_REPARSE_TAG_SYMLINK for symbolic links) and substitute name (target path). The function signature includes hDevice (), dwIoControlCode (FSCTL_GET_REPARSE_POINT), input/output buffers for the reparse data structure (REPARSE_DATA_BUFFER), and bytes returned. It returns BOOL, enabling applications to resolve or validate link targets programmatically. Related codes like FSCTL_SET_REPARSE_POINT allow setting new reparse points, though direct use is less common than higher-level functions. At a lower level, the native API NtCreateSymbolicLinkObject provides kernel-mode or advanced user-mode access for symbolic link creation, invoked via ntdll.dll and taking parameters for the link object attributes, desired access, target DOS device path, and substitution name. This function is part of the Windows NT executive and is used internally by higher-level APIs, but direct calls require careful handling of NTSTATUS return codes and are typically reserved for system components or drivers. Command-line utilities like mklink serve as user-friendly wrappers around these APIs for non-programmatic use.

Risks and hazards

Data consistency problems

In , hard links provide multiple directory entries pointing to the same underlying file data within the Master File Table (MFT), ensuring that modifications made through any one link—such as editing the file content or attributes—are immediately reflected across all linked references, as they share a single file record. Deleting one entry simply reduces the reference count in the MFT without issuing a warning to the user, leaving the file intact until the final link is removed, which can lead to unintended data persistence or unexpected space allocation if other links are overlooked. Symbolic links (symlinks), implemented as reparse points in , function as path pointers to a target file or directory; if the target is moved, renamed, or deleted, the symlink becomes broken, resulting in access failures that propagate errors to applications attempting to use it. For instance, editing a file through a will alter the shared data visible via all other hard links, while accessing a symlink whose target has been deleted typically returns the Win32 error ERROR_FILE_NOT_FOUND (error code 2), causing application failures such as failed file opens or path resolution issues. NTFS maintains overall data consistency through the MFT, which tracks file records and reference counts to prevent discrepancies during normal operations, but user errors—such as unaware deletions or target relocations—can still propagate inconsistencies across links. To mitigate these issues, tools like can scan for and repair invalid or orphaned reparse points associated with broken symlinks, removing them to restore integrity, though this process may require multiple runs on large volumes.

Infinite recursion risks

Infinite recursion risks arise in NTFS when symbolic links (symlinks) or junction points form circular references, leading to endless path resolution attempts that can cause stack overflows, application hangs, or system instability. Symlink loops occur through self-referencing links or chained symlinks that point back to previous elements in the chain, preventing the kernel from resolving the final target path. Similarly, junction cycles—limited to the same volume—can create recursive directory structures, often resulting in crashes for tools like Windows Explorer during navigation or enumeration. These issues stem from the reparse point mechanism underlying both link types, where the file system driver repeatedly evaluates redirects without an inherent cycle detection beyond depth limits. A classic example involves creating two symlinks where directory A points to B and B points back to A; resolution attempts will cycle indefinitely until hitting the system's cap. The Windows kernel enforces a maximum depth of 63 reparse points per path to mitigate such risks and prevent denial-of-service scenarios, a limit introduced with enhanced symlink support in and applicable to both symlinks and junctions. Earlier versions, like , had a lower threshold of 31, but even with limits in place, exceeding or approaching the depth can still lead to hangs in user-mode applications if they lack proper loop handling, potentially referencing data consistency issues from unresolved paths in broader file operations. Detection of potential loops involves querying reparse points via command-line tools or APIs; for instance, the dir /AL command lists all reparse points (including symlinks as <SYMLINKD> and junctions as <JUNCTION>) in a directory, allowing manual inspection for cycles. Programmatically, the Win32 API function GetFileAttributes can check the FILE_ATTRIBUTE_REPARSE_POINT flag to identify links during traversal. Prevention relies on acyclic design principles during link creation, ensuring no circular dependencies form within the same volume to avoid these hazards.

Cross-volume access issues

Hard links in NTFS are restricted to files within the same , as they rely on direct references within the Master File Table (MFT), preventing creation across different volumes or partitions. Attempting to create a to a file on a different results in failure with error code 17 (ERROR_NOT_SAME_DEVICE), indicating the operation cannot cross device boundaries. This limitation ensures by avoiding fragmented references but restricts hard links to intra-volume use cases. In contrast, symbolic links (symlinks) support cross-volume access, including to other local drives via absolute paths or to remote locations using Universal Naming Convention (UNC) paths. NTFS implements symlinks as reparse points that redirect resolution to the target path, enabling flexible referencing without the same-volume constraint of hard links. However, there is no native support for cross-partition hard links; symlinks achieve cross-volume functionality through path redirection, which may involve network protocols for UNC targets even on local systems if interpreted as remote. Resolution of symlinks targeting UNC paths can fail or introduce delays when the remote share is offline or inaccessible, as the system attempts to validate the network location during access. For instance, a symlink pointing to a folder on an external drive (e.g., mklink /D C:\link E:\target) may cause applications or Explorer to hang temporarily if the drive is unmounted or disconnected, triggering a timeout during path resolution similar to direct UNC access issues. From a security perspective, cross-volume symlinks introduce risks of unintended data exposure, as they can bridge permission boundaries between volumes with differing access controls, potentially allowing unauthorized access to sensitive files if the symlink is placed in a traversable directory. Applications must validate symlink targets to mitigate vulnerabilities, such as following links to restricted locations on another volume. In 2025, several vulnerabilities were disclosed that exploit NTFS symbolic links for privilege escalation, such as CVE-2025-21204, which allows attackers to abuse symlinks in the Windows servicing stack to gain SYSTEM access. Similarly, CVE-2025-24993 involves a heap-based buffer overflow in NTFS that can be triggered via reparse points, enabling local code execution. These incidents, patched by Microsoft in early 2025 updates, highlight the evolving security hazards associated with improper symlink handling as of November 2025.

Limitations and restrictions

Administrative privilege needs

Creating symbolic links in the file system requires the SeCreateSymbolicLinkPrivilege user right, which became mandatory starting with . This privilege is granted by default only to members of the Administrators group and is not required for creating hard links or directory junctions, which can typically be established by standard users as long as they have write access to the parent directory and the target is accessible. In versions of Windows prior to Vista, native symbolic links were not supported, relying instead on third-party solutions or file shortcuts. User Account Control (UAC) further impacts this requirement: even administrators must run processes with an elevated to create symbolic links, as the privilege resides in the elevated token rather than the standard user token. For example, attempting to use the mklink command without elevation results in error 1314 (ERROR_PRIVILEGE_NOT_HELD), indicating that a required privilege is not held by the client. To grant the SeCreateSymbolicLinkPrivilege to non-administrators, such as developers, it can be assigned through the Local Security Policy editor (secpol.msc) under Local Policies > User Rights Assignment > Create symbolic links, or via in domain environments for broader deployment. This adjustment should be made judiciously, as symbolic links can introduce security risks if misused by untrusted users.

Boot-time and startup constraints

During the Windows boot process, symbolic links and junction points—implemented via reparse points—experience delayed resolution, as they are not fully processed until relevant drivers and filters are loaded. This constraint affects paths in early boot environments, such as the System Volume Information folder, where these links are effectively ignored or inaccessible until later stages of startup, potentially leading to temporary failures in accessing redirected resources. To optimize boot performance, Windows intentionally postpones the loading and resolution of symbolic links, similar to its handling of network shares, which can result in linked targets not being available immediately after initial boot completion. Junction points, in particular, do not function during the core phase, making it impossible to redirect essential system directories like \Windows, \Windows\System32, or \Windows\Config that are accessed by the boot loader. This limitation stems from the minimal support available in the early boot environment, where full reparse point handling is not yet active. In contrast, hard links are unaffected by these boot-time constraints, as they consist of direct, additional entries in the Master File Table (MFT) and are resolved transparently by the core driver without needing supplementary processing. Cross-volume symbolic links or junctions pointing to drives that are not yet mounted during will fail silently, as only the is guaranteed to be accessible in the initial phases; full mounting occurs progressively as drivers initialize. The Windows boot loader, winload.exe, performs only basic path processing without comprehensive link resolution, deferring full shell-level handling until after user logon. Misconfigured junctions in boot-related paths, such as those influencing the Boot Configuration Data (BCD), can exacerbate issues by potentially triggering infinite risks during these early loads if resolution attempts cycle unresolved.

Conflicts with system locations

Creating NTFS symbolic links or junctions in protected system directories, such as C:\Windows and C:\Windows\System32, is generally prohibited without acquiring ownership from the TrustedInstaller account, a dedicated service that safeguards core operating system components from unauthorized modifications. This ownership ensures that only trusted processes, like Windows updates or installers, can alter these paths, preventing potential security risks from malicious or erroneous link creations that could redirect system operations. For instance, executing the mklink command to create a junction within C:\Windows, even from an elevated administrator prompt, fails with an "Access is denied" error due to these restrictive lists (ACLs). Since , mandatory integrity control (MIC) further enforces these restrictions by assigning high integrity levels to system directories, blocking processes operating at medium or low integrity levels from establishing reparse points— the underlying mechanism for links and junctions—in such locations. This mitigation, backported via security updates like MS15-090, limits unauthorized attempts to manipulate protected paths and reduces exploitation vectors for . Windows employs auto-repair mechanisms, such as the (SFC), to scan and restore integrity in core system folders like ProgramData, automatically resetting unauthorized or corrupted junctions to their default configurations during routine maintenance or after detected anomalies. These protections prioritize system stability, as alterations in ProgramData could disrupt application data sharing across users. No workarounds are recommended for bypassing these safeguards in system locations, as doing so risks instability or security vulnerabilities; user-specific links should instead be created in directories like AppData, which permit standard administrative access without conflicting with protected areas.

Installer and deployment behaviors

Windows Installer (MSI) packages, commonly used for on Windows, do not natively support the creation of NTFS symbolic links or junctions during installation, as these features rely on reparse points that exceed the standard file and directory components provided by MSI. Instead, installers like those built with the require custom actions to invoke the CreateSymbolicLink or CreateHardLink functions, which often necessitate elevated privileges to succeed. This approach ensures compatibility but adds complexity, as custom actions must handle error conditions such as insufficient permissions or target path unavailability. During system upgrades, NTFS links can be disrupted if paths change or if migration tools fail to preserve reparse data. For example, , used in upgrades and data migrations, has been documented to break symbolic links and junctions by copying targets instead of maintaining the links, leading to inaccessible legacy paths like "C:\Documents and Settings". Certain Windows updates, such as KB4512508, have also inadvertently deleted user-created junctions and symbolic links prior to reboot, requiring manual recreation post-update. In the case of deployments, installers may leverage hard links for shared components like templates to optimize space, but symbolic links are often ignored or not created in silent installation modes to avoid potential resolution failures during unattended setups. The process handles system junctions by automatically recreating critical ones, such as those redirecting legacy paths in the Windows directory, in the post-installation phase to restore full system integrity after partitioning and file placement. Third-party tools, by contrast, must explicitly use elevated APIs like CreateSymbolicLink with the SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE flag (introduced in later Windows versions) to mimic this behavior reliably. Cross-volume links introduce additional risks in multi-drive configurations, where symbolic links targeting absent or differently mounted volumes during installation can result in dangling references post-setup, while junctions—restricted to intra-volume targets—fail outright if paths span drives. This limitation often necessitates single-volume planning for installer paths to prevent deployment failures.

Legacy version compatibility

Support for NTFS links in legacy Windows versions varies significantly, with earlier releases lacking advanced features like symbolic links and relying on basic hard links or third-party tools for directory redirection. In , only basic hard links are supported on volumes, allowing multiple file names to reference the same data on the same volume, but without support for directory links or reparse points. Junction points, which use reparse points to redirect directories, were introduced in as a form of directory symbolic links limited to local volumes. Windows XP continues support for hard links and junctions from previous versions, enabling file and directory redirection on , but lacks native symbolic links that can target remote or non-existent paths. Prior to , there is no built-in command like mklink for creating these link types; users must rely on third-party utilities such as ' junction.exe to manage junctions and view reparse points. Full native support for symbolic links, including the mklink command and the CreateSymbolicLink , begins with , providing greater flexibility over junctions for cross-volume and remote targets. While Vista introduces these features, some enhancements for stability and broader application compatibility, such as improved handling in service packs, ensure reliable use from Vista SP1 onward. When migrating file systems or applications from to later versions, XP-era junctions can often be converted to symbolic links to enable expanded functionality, such as network access, though compatibility modes in newer Windows may cause some legacy applications to ignore or mishandle symbolic links as if running on XP.

History and evolution

Initial NTFS implementations

The New Technology File System () was first implemented in version 1.2 with the release of in 1993, introducing basic support for hard links to meet compliance requirements. Hard links in this early version were realized through multiple filename attributes stored within the same entry in the Master File Table (MFT), allowing a single file's data to be referenced by multiple directory entries without duplicating the underlying content. This mechanism ensured that the file persisted until all associated links were deleted, providing a transparent way to maintain multiple access points to the same data. The design of , including its linking capabilities, was led by Tom Miller and his team at , which included Gary Kimura, Brian Andrew, and David Goebel, drawing on Miller's expertise in and recoverable database systems to prioritize data robustness and integrity over the limitations of earlier file systems like . Unlike , which lacked advanced metadata and recovery features, NTFS's MFT-based structure for hard links supported efficient file management in multi-user environments, reducing risks of from power failures or crashes through features like the $LogFile for atomic operations. This foundational approach emphasized and reliability for enterprise scenarios, where consistent access to shared resources was critical. A key limitation of hard links in initial implementations was their restriction to files only; support for directory links was deliberately omitted to prevent infinite recursion and filesystem cycles that could destabilize and recovery processes. Early uses of hard links focused on enterprise , enabling administrators to create multiple aliases for the same file across directories—such as in collaborative workflows or backup systems—without incurring storage overhead or risking data inconsistency from copies. NTFS version 3.0, introduced with , expanded linking extensibility through reparse points, which allowed filesystem filters to intercept and redirect file operations, thereby enabling junction points as a form of directory aliasing. Reparse points stored user-defined data in file or directory attributes, facilitating advanced redirection while maintaining compatibility with prior behaviors. These features built on the MFT foundation to support more flexible volume management in networked environments.

Advancements in Windows Vista and later

Windows Vista, released in 2007, introduced native support for symbolic links in the file system, expanding the capabilities of file system linking beyond the hard links and junctions available in prior versions. Symbolic links function as lightweight pointers to files or directories, which can be files, folders, or even remote UNC paths, and they resolve transparently during file access operations. This advancement built on earlier hard links by enabling more flexible, referencing without duplicating data. To facilitate creation, Microsoft provided the mklink command-line utility, which supports options for directory symbolic links (/D), hard links (/H), and junctions (/J), along with the CreateSymbolicLink Win32 API function for programmatic use. Key enhancements included support for relative paths, allowing links to adapt to directory moves without breaking, and cross-volume targeting, which permitted linking across different drives or partitions—features not fully available in legacy junction points. For security, symbolic link creation requires the SeCreateSymbolicLinkPrivilege user right, introduced to mitigate potential abuse such as or unauthorized access; by default, this privilege is assigned only to members of the Administrators group. In parallel, junctions—directory-only reparse points from —were refined in Vista to integrate more robustly with user profiles, using them to redirect legacy paths like Documents and Settings to the new Users structure for without disrupting applications. Windows Server 2008 enabled symbolic link functionality by default for administrators, aligning with Vista's implementation and promoting its use in enterprise environments for tasks like storage optimization. The , including , gained integrated support for displaying and traversing symbolic links, rendering them as standard files or folders with overlay icons to indicate their nature, though native creation via drag-and-drop required elevated privileges or third-party extensions.

Modern security enhancements

In June 2025, Microsoft introduced RedirectionGuard, a mitigation feature in Windows 11 designed to block unsafe traversals of junction points—reparse points in NTFS that redirect paths—in untrusted contexts. This enhancement specifically targets junctions created by non-administrative users by leveraging an administrator-only alternate data stream to track creation privileges, preventing elevated processes from following such links if the originating process has opted into the mitigation via the SetProcessMitigationPolicy API. Initially enabled in key services like the User Profile Service, AppX Deployment Service, and Installer Service within Windows Insider builds, it applies broadly to shell operations and APIs that handle file system redirections, thereby mitigating privilege escalation risks from crafted junctions in scenarios such as downloaded content or untrusted directories. RedirectionGuard's scope focuses on closing vectors for filesystem redirection attacks, where malicious junctions could trick elevated services into accessing unintended locations, often exploiting cross-volume access issues inherent to . By default blocking these traversals, it reduces the for symlink-based exploits, including variants similar to those enabling local through path manipulation, without affecting legitimate hard links, object manager symbolic links, or standard symbolic links. Administrators can enable audit mode for the feature to log violations in the Windows Event Log, enhancing visibility into potential redirection attempts. These updates collectively strengthen defenses against evolving threats, with RedirectionGuard marking a proactive shift toward default mitigations in core system components.

References

Add your contribution
Related Hubs
User Avatar
No comments yet.