在 Windows 上,wimlib 使用本地 Windows API 调用来正确处理高级 NTFS 特性,如硬链接、符号链接、交接点、命名数据流和安全描述符。
wimlib 是一个用于创建、修改、提取和管理 .wim 文件的开源工具,它主要关注于 .wim 文件格式的操作。在 Windows 上,wimlib 能够使用本机 Windows API 来正确处理一些高级 NTFS 功能,这些功能是 Windows 操作系统中 NTFS 文件系统的一部分,具体包括:
- 硬链接(Hard Links)
- 符号链接(Symbolic Links)
- 交接点(Junction Points)
- 命名数据流(Named Data Streams)
- 安全描述符(Security Descriptors)
这些功能对于 NTFS 文件系统的高级特性至关重要,wimlib 能通过本机 API 确保它们能够在 .wim 文件中正确存储和还原。
在 Windows 操作系统中,文件系统提供了多种机制来增强文件的管理和操作能力。这些机制包括 硬链接、符号链接、交接点、命名数据流 和 安全描述符。它们在文件管理中起到了重要作用,下面是每个机制的详细说明以及相关的本机文件系统 API 清单。
1. 硬链接(Hard Links)
硬链接是一个指向文件数据的指针,可以将同一个文件的多个路径指向相同的物理磁盘位置。每个硬链接都有自己的文件名,但指向相同的文件数据块。
硬链接相关 API:
-
CreateHardLink
- 功能:创建一个指向现有文件的硬链接。这个函数通过文件名创建一个新的硬链接,使得新的文件路径指向相同的文件数据块。
- 使用场景:当你需要为一个文件创建多个入口点时,使用该函数。
cppCopy CodeBOOL CreateHardLink( LPCWSTR lpFileName, // 硬链接的路径 LPCWSTR lpExistingFileName // 目标文件路径 ); -
GetFileInformationByHandle
- 功能:获取指定文件的文件信息,包括硬链接计数。可以用它来获取某个文件的硬链接数量。
- 使用场景:检查某个文件是否有硬链接。
cppCopy CodeBOOL GetFileInformationByHandle( HANDLE hFile, // 文件句柄 LPBY_HANDLE_FILE_INFORMATION lpFileInformation // 文件信息结构 ); -
DeleteFile
- 功能:删除文件。如果文件具有多个硬链接,删除文件的某个链接不会删除实际的数据块,数据块会继续保留,直到所有硬链接都被删除。
- 使用场景:删除硬链接,当文件的所有硬链接都删除时,文件的数据才会被完全删除。
cppCopy CodeBOOL DeleteFile( LPCWSTR lpFileName // 要删除的文件路径 );
2. 符号链接(Symbolic Links)
符号链接是一个特殊的文件,它包含了另一个文件或目录的路径。符号链接可以是文件符号链接或目录符号链接,通常用于创建快捷方式或重定向路径。
符号链接相关 API:
-
CreateSymbolicLink
- 功能:创建符号链接文件,符号链接指向目标文件或目录。符号链接分为软链接(指向文件)和硬链接(指向目录)。
- 使用场景:当需要为文件或目录创建快捷方式时,可以使用此函数。
cppCopy CodeBOOL CreateSymbolicLink( LPCWSTR lpSymlinkFileName, // 符号链接的路径 LPCWSTR lpTargetFileName, // 目标文件或目录的路径 DWORD dwFlags // 链接类型标志(文件或目录) ); -
GetFinalPathNameByHandle
- 功能:获取符号链接的目标路径。可以用于解析符号链接,返回符号链接所指向的实际文件路径。
- 使用场景:解析符号链接,获取其指向的真实文件路径。
cppCopy CodeDWORD GetFinalPathNameByHandle( HANDLE hFile, // 文件句柄 LPWSTR lpFilePath, // 输出路径缓冲区 DWORD dwBufferSize, // 缓冲区大小 DWORD dwFlags // 标志,指定路径类型 ); -
DeleteFile
- 功能:删除符号链接。当删除符号链接时,它不会删除目标文件或目录,只会删除链接本身。
- 使用场景:删除符号链接。
cppCopy CodeBOOL DeleteFile( LPCWSTR lpFileName // 要删除的符号链接路径 );
3. 交接点(Junction Points)
交接点是指向目录的符号链接,它允许一个目录的内容在文件系统中的另一个位置显示。交接点通常用于挂载其他目录或提供透明的路径重定向。
交接点相关 API:
-
CreateJunction(通过
MKLINK命令行工具)- 功能:通过命令行创建交接点。Windows 系统本身并未提供单独的 API 来创建交接点,但可以通过命令行工具
MKLINK创建交接点。 - 使用场景:创建一个指向目录的交接点。
shCopy Codemklink /J [JunctionName] [TargetDirectory] - 功能:通过命令行创建交接点。Windows 系统本身并未提供单独的 API 来创建交接点,但可以通过命令行工具
-
QueryDosDevice
- 功能:查询是否存在交接点。此 API 用于查询系统是否存在特定的 DOS 设备路径(如交接点)。
- 使用场景:通过 DOS 设备路径查询交接点。
cppCopy CodeDWORD QueryDosDevice( LPCWSTR lpDeviceName, // 设备路径 LPWSTR lpTargetPath, // 输出的目标路径 DWORD ucchMax // 缓冲区大小 );
4. 命名数据流(Named Data Streams)
命名数据流允许文件拥有多个数据流,每个数据流都有自己独立的名称。命名数据流用于存储附加的数据(如元数据)或其他附加信息。
命名数据流相关 API:
-
CreateFile
- 功能:打开或创建文件的命名数据流。在文件路径后添加冒号(:)和数据流名称即可访问命名数据流。
- 使用场景:创建和访问文件的命名数据流。
cppCopy CodeHANDLE CreateFile( LPCWSTR lpFileName, // 文件路径和数据流名称(例如:file.txt:stream_name) DWORD dwDesiredAccess, // 访问权限 DWORD dwShareMode, // 共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性 DWORD dwCreationDisposition, // 文件创建操作 DWORD dwFlagsAndAttributes, // 文件属性 HANDLE hTemplateFile // 模板文件句柄 ); -
WriteFile
- 功能:向命名数据流中写入数据。可以用它向特定数据流写入数据。
- 使用场景:向文件的命名数据流中写入数据。
cppCopy CodeBOOL WriteFile( HANDLE hFile, // 打开的文件句柄 LPCVOID lpBuffer, // 写入的数据 DWORD nNumberOfBytesToWrite, // 要写入的字节数 LPDWORD lpNumberOfBytesWritten, // 实际写入的字节数 LPOVERLAPPED lpOverlapped // 异步操作 ); -
ReadFile
- 功能:从命名数据流中读取数据。可以读取文件的命名数据流中的内容。
- 使用场景:从命名数据流中读取数据。
cppCopy CodeBOOL ReadFile( HANDLE hFile, // 打开的文件句柄 LPVOID lpBuffer, // 存储读取数据的缓冲区 DWORD nNumberOfBytesToRead, // 读取的字节数 LPDWORD lpNumberOfBytesRead, // 实际读取的字节数 LPOVERLAPPED lpOverlapped // 异步操作 );
5. 安全描述符(Security Descriptors)
安全描述符包含了文件或对象的安全信息,如权限、所有者、审核信息等。它们是访问控制的基础,用于控制哪些用户或组可以访问文件。
安全描述符相关 API:
-
GetSecurityInfo
- 功能:获取文件或对象的安全描述符信息,包括 DACL(Discretionary Access Control List)和 SACL(System Access Control List)。
- 使用场景:获取文件的安全描述符信息。
cppCopy CodeDWORD GetSecurityInfo( HANDLE handle, // 对象句柄 SE_OBJECT_TYPE objectType, // 对象类型 SECURITY_INFORMATION securityInfo, // 获取的安全信息 PSID *ppsidOwner, // 输出的所有者 PSID *ppsidGroup, // 输出的组 PACL *ppDacl, // 输出的 DACL PACL *ppSacl, // 输出的 SACL PSECURITY_DESCRIPTOR *ppSecurityDescriptor // 安全描述符 ); -
SetSecurityInfo
- 功能:设置文件或对象的安全描述符,修改访问控制列表(ACL)和其他安全信息。
- 使用场景:修改文件或对象的安全描述符信息,控制对文件的访问权限。
cppCopy CodeDWORD SetSecurityInfo( HANDLE handle, // 对象句柄 SE_OBJECT_TYPE objectType, // 对象类型 SECURITY_INFORMATION securityInfo, // 设置的安全信息 PSID pOwner, // 新的所有者 PSID pGroup, // 新的组 PACL pDacl, // 新的 DACL PACL pSacl // 新的 SACL );
上述机制是 Windows 操作系统中用于文件系统管理的重要工具。每种机制都有相应的 API 来创建、操作和管理这些特殊文件系统结构。对于每个机制,Windows 提供了强大的 API 支持,允许开发者在应用程序中灵活地操作这些文件系统特性。
1. 硬链接(Hard Links)
硬链接是 NTFS 文件系统的一种特性,它允许多个目录项指向同一个文件数据块。当创建硬链接时,并不会复制文件内容,而是创建一个新的目录项,这个目录项与原始文件共享相同的数据块。
- 如何工作:硬链接让文件的内容不依赖于其目录条目的名称或位置,因此你可以通过多个文件名访问相同的文件内容。删除任何一个硬链接并不会删除实际文件数据,直到所有指向该数据块的硬链接都被删除。
- wimlib 的处理方式:在 Windows 上,
wimlib使用 Windows API(如CreateHardLink)来识别和正确地处理硬链接。如果你使用wimlib处理的.wim文件包含硬链接,wimlib会确保这些硬链接被正确地保留和恢复。
2. 符号链接(Symbolic Links)
符号链接是一种特殊类型的文件,它指向其他文件或目录。与硬链接不同,符号链接包含目标文件或目录的路径信息,而不是直接指向数据块。
- 如何工作:符号链接可以指向文件或目录,可以是相对路径或绝对路径。符号链接通常被用来创建更灵活的文件系统结构,例如指向系统中其他位置的文件。
- wimlib 的处理方式:
wimlib使用 Windows API(如CreateSymbolicLink)来处理符号链接。它可以正确地将符号链接包含在.wim文件中,并确保它们在提取或挂载时能够被正确恢复为原始目标。
3. 交接点(Junction Points)
交接点是 Windows NTFS 文件系统中的一种特殊类型的符号链接,通常用于目录。交接点将一个目录重新定向到另一个目录,允许多个路径指向同一个目录。
- 如何工作:交接点通常用于文件系统重定向,尤其是在系统文件夹之间建立链接时。它允许文件或目录通过多个路径访问而不需要实际复制数据。
- wimlib 的处理方式:
wimlib使用 Windows API(如CreateJunction)来处理交接点。它能够正确地识别和恢复交接点,使得提取的文件系统结构与原始系统结构一致。
4. 命名数据流(Named Data Streams)
命名数据流是 NTFS 文件系统中的一个特性,允许每个文件有多个数据流。每个数据流都有一个名称,可以包含其他类型的数据(如元数据、文件扩展信息等)。
- 如何工作:NTFS 文件系统允许文件包含多个命名的数据流。每个数据流都有一个名称,除了主数据流(文件的实际内容)外,可以存储其他类型的信息。
- wimlib 的处理方式:
wimlib通过 Windows API(如GetFileInformationByHandle和SetFileInformationByHandle)来处理命名数据流。在.wim文件的提取或修改过程中,wimlib能够确保这些命名数据流被正确地保留,并且在恢复时不会丢失。
5. 安全描述符(Security Descriptors)
安全描述符是 Windows 文件系统的一个重要部分,用于定义对象(如文件、目录等)的安全设置。它们包含了权限、所有者信息、DACL(Discretionary Access Control List)等内容。
- 如何工作:安全描述符控制着对文件或目录的访问权限。它们允许文件拥有不同的访问控制设置,以控制谁可以读取、写入或执行文件。
- wimlib 的处理方式:
wimlib使用 Windows API(如GetFileSecurity和SetFileSecurity)来处理文件的安全描述符。wimlib能够确保在.wim文件中的文件和目录的安全描述符被正确保存,并且在提取时被恢复。
wimlib 在 Windows 上能够通过本机 API 调用来正确处理以下 NTFS 文件系统的高级功能:
- 硬链接:共享相同数据块的文件,可以在
.wim中正确处理。 - 符号链接:指向其他文件或目录的特殊文件,能够正确恢复为原始目标。
- 交接点:将目录重新定向到另一个目录,在
.wim中被正确保留。 - 命名数据流:文件的多个数据流,可以存储附加信息,不会在
.wim中丢失。 - 安全描述符:文件和目录的权限和安全设置,会在
.wim中正确恢复。
通过这些功能,wimlib 能够确保在处理 .wim 文件时,不仅仅是文件的内容被复制和恢复,还能够正确地保留 NTFS 文件系统中的高级特性,使得恢复的文件系统尽可能地与原始系统一致。

浙公网安备 33010602011771号