Internals - viruscamp/lxssattr GitHub Wiki
WSL1 文件在 NTFS 中的表示
NTFS_Extended_Attributes NTFS 扩展属性
一个文件可以有多条 FILE_FULL_EA_INFORMATION
每条有 name 不定长字符串 value 不定长二进制
用 NtQueryInformationFile 和 NtQueryEaFile 读取
LxFS
文件 软链 目录
有关联的 EaInfo, name 为 LXATTRB, 内容包括 u32 mode, u32 uid, u32 gid 及其他内容
目录 mode.typeletter == 'd'
软链 mode.typeletter == 'l' 内容为单行文本 表示指向路径
设备文件 mode.typeletter == 'c' 或 'b' LXATTRB 中有 u32 st_rdev // Drive number of the disk containing the file.
WslFS
文件 软链 目录
有关联的 EaInfo, name 为 $LXUID $LXGID $LXMOD, 内容分别为 u32
设备文件
可能1. 多一个 $LXDEV 内容未知 估计为 u32 rdev // Drive number of the disk containing the file.
确定2. ReparseTag == IO_REPARSE_TAG_LX_FIFO 或 IO_REPARSE_TAG_LX_CHR 或 IO_REPARSE_TAG_LX_BLK
软链
NTFS REPARSE_POINT 不是普通文件 内容为空
NtOpenFile 普通参数调用 返回值为 STATUS_IO_REPARSE_TAG_NOT_HANDLED
创建 读取 设置
特殊参数调用 NtOpenFile 后
调用 DeviceIoControl FSCTL_GET_REPARSE_POINT FSCTL_SET_REPARSE_POINT FSCTL_DELETE_REPARSE_POINT
格式
https://docs.microsoft.com/en-us/windows/win32/fileio/reparse-point-tags
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/c8e77b37-3909-4fe6-a4ea-2b9d423b1ee4
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/c3a420cb-8a72-4adf-87e8-eee95379d78f
参考项目 https://github.com/0xbadfca11/lxsstat/blob/master/lxsstat.cpp#L390
GetFileInformationByHandleEx(h, FileAttributeTagInfo, &file_attribute_tag_info, sizeof file_attribute_tag_info)
file_attribute_tag_info.ReparseTag == IO_REPARSE_TAG_LX_SYMLINK
DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, nullptr, 0, &reparse_buf, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &junk, nullptr)
reparse_buf == {
ReparseTag: u32 == IO_REPARSE_TAG_LX_SYMLINK {
// high
M: 1bit Microsoft bit
R: 1bit 0
N: 1bit Name surrogate bit
R: 1bit 0
Reserved bits: 12bit
Reparse tag value: u16
// low
}
ReparseDataLength: u16 DataBuffer.length
Reserved: u16 0x0
DataBuffer: byte[ReparseDataLength] {
unknown: byte[4] 02 00 00 00 or u32: 0x02 功能未知
linkpath: str without '\0' utf8 链接目标路径
}
}
x 02 00 00 00 78
你好 02 00 00 00 e4 bd a0 e5 a5 bd
C:\> fsutil reparsePoint query D:\ArchWSL\rootfs\usr\lib\libc.so.6
重分析标记值 : 0xa000001d
标记值: Microsoft
标记值: Name Surrogate
重新分析数据长度: 0x10
重分析数据:
0000: 02 00 00 00 6c 69 62 63 2d 32 2e 33 33 2e 73 6f ....libc-2.33.so
C:\> fsutil reparsePoint query D:\ArchWSL\rootfs\home\viruscamp\devp
重分析标记值 : 0x80000024
标记值: Microsoft
重新分析数据长度: 0x0