1. 背景
本文补充介绍文件遍历操作的部分附加内容,譬如,过滤掉系统元文件、过滤掉重复的文件项、过滤掉隐藏文件等,并提供了基于元神操作系统的部分实现代码。
2. 方法
(1)过滤掉系统元文件
NTFS文件系统的前16个元文件是固定的系统元文件,它们都是以字符“$”开头的,所以,判断索引项的偏移0x52处的字符是否为$即可实现过滤。假设当前ESI中保存的是某个索引项的起始地址,过滤的代码片段如下所示:
cmp byte [fs:esi+0x52], '$'
je .ignore
如果第一个字符是$,则跳过该索引项,以此来过滤掉系统元文件。未过滤时根目录的遍历结果如下图所示:
(2)过滤掉重复的文件项
NTFS文件系统中同时支持长文件名和短文件名的索引项,所以,名称较长的文件会存在多个索引项,导致列表重复。例如,上图中对于Documents and Settings目录,同时存在短文件名项,即DOCUME~1;另外,Program Files目录也存在短文件名PROGRA~1,System Volume Information目录也存在短文件名SYSTEM~1。
本例的目的是过滤掉重复的文件项,即同时存在长文件名和短文件名时,过滤掉短文件名,只保留显示长文件名即可。这通过判断索引项偏移0x51处的值来完成,该值表示文件命名空间,值为0时表示POSIX命名空间,值为1表示Win32命名空间,值为2表示DOS命名空间,值为3表示Win32 & DOS命名空间。对于NTFS文件系统,只要过滤掉DOS命名空间即可完成重复项的过滤,部分代码片段如下所示:
cmp byte [fs:esi+0x51], 0x02
je .ignore