【Windows Internal】Reparse Point
Reparse point 叫做重新解析點,
可以想像成是把路徑做轉送,
使用者看到的會是原本的路徑,但經過解析會是目標檔案。
組成&應用
Reparse point 也是 NTFS 的特殊 Metadata,
由 tag 跟 data 組成,解析如果有看到 NTFS 會回傳 STATUS_REPARSE
本身是完全合法的,但是如果一個程式中途可以改路徑可能會有 TOCTOU。
.
常見的 reparse point 應用(以 tag 區分):
| 應用 | Reparse tag | 說明 |
|---|---|---|
| Junction / [Mount Point](Mount Point) | IO_REPARSE_TAG_MOUNT_POINT(0xA0000003) | 指向本機目錄或磁碟區,核心層解析 |
| Symbolic link | IO_REPARSE_TAG_SYMLINK(0xA000000C) | 可指檔案或目錄、本機或網路路徑 |
| OneDrive 雲端檔案 | IO_REPARSE_TAG_CLOUD_*(0x9000001A 起) | 按需下載的佔位檔(cloud files API) |
| App execution alias | IO_REPARSE_TAG_APPEXECLINK | 例如 Microsoft Store 版 Python 的攔截器 |
實作例子
列出 C:\ 下所有 reparse point(/al 篩選 attribute L = reparse point):
dir /al C:\
Directory of C:\
2025/12/06 10:30 <JUNCTION> Documents and Settings [C:\Users]
查詢某個路徑的 reparse data 細節:
fsutil reparsepoint query "C:\Documents and Settings"
Reparse Tag Value : 0xa0000003
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Mount Point
Substitute Name offset: 0
Substitute Name length: 20
Print Name offset: 22
Print Name Length: 10
Substitute Name: \??\C:\Users
Print Name: C:\Users
Reparse Tag Value : 0xa0000003 就是 IO_REPARSE_TAG_MOUNT_POINT,表示它是 junction/mount point
Substitute Name 是核心實際用來改道的 NT 路徑。
部分 fsutil 子命令需提高權限,如果被拒絕的話記得用系統管理員身分執行。