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