回收站内部结构:
视窗XP
每个驱动器都有自己的驱动器:\RECYCLER\%USER_SID% 目录。该目录包含所有已删除的文件,但文件的名称如下DcN.ext where D是名称的固定部分,c是驱动器盘符,N是一个索引并且ext是原始文件的扩展名。除了已删除的文件之外,还有名为 INFO2 的数据库文件。
INFO2 文件以标头开头。标头结构:
Offset Type Value
0x0000 DWORD Signature ; Always 5
0x0004 DWORD Unknown1
0x0008 DWORD Unknown2
0x000C DWORD RecordSize ; Always 0x00000320
0x0010 DWORD Unknown3
记录紧接在文件头之后连续存储到 INFO2 文件的末尾。记录结构:
Offset Type Value
0x0000 ANSICHAR[MAX_PATH] OriginalFileNameA ; Ansi string
0x0104 DWORD Index ; Associated with *N* from *DcN.ext*
0x0108 DWORD DriveIndex ; A: = 0; B: = 1; C: = 2; ...
0x010C FILETIME DeleteFileTime
0x0114 DWORD OriginalFileNamePhysicalSize
0x0118 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string
Windows Vista 及以上版本
每个驱动器都有自己的驱动器:\$Recycle.Bin\%USER_SID% 目录。该目录包含所有已删除的文件,但现在没有数据库文件。每个删除的文件都与 RB 内的 2 个文件相关联。
第一个文件的名称类似于$INNNNNN.ext where $I是名称的固定部分,NNNNNN由 6 个随机字母或数字组成,ext是原始文件的扩展名。
$I文件结构:
Offset Type Value
0x0000 DWORD Signature ; Always 1
0x0004 DWORD Unknown1
0x0008 DDWORD OriginalFileSize
0x0010 FILETIME DeleteFileTime
0x0018 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string
第二个文件的名称类似于$RNNNNNN.ext where $R是名称的固定部分,NNNNNN与 $I 文件中的相同并且ext是原始文件的扩展名。 $R 文件是被删除的文件本身。
正如您在所有情况下看到的,Windows 将文件名存储在数组中,该数组的大小为 MAX_PATH 字符。这就是为什么文件名长度限制是 MAX_PATH - 1 个字符.
Windows 10
Windows 10有新版本的$I文件结构(不知道是什么更新改变了它):
Offset Type Value
0x0000 DWORD Signature ; Always 2
0x0004 DWORD Unknown1
0x0008 DDWORD OriginalFileSize
0x0010 FILETIME DeleteFileTime
0x0018 DWORD OriginalFileNameLen
0x001C WIDECHAR[OriginalFileNameLen] OriginalFileNameW ; Wide string
看起来现在 Windows 可以在回收站中存储任何路径的任何文件。