在 Windows 上,wimlib 使用本地 Windows API 调用来正确处理高级 NTFS 特性,如硬链接、符号链接、交接点、命名数据流和安全描述符。

wimlib 是一个用于创建、修改、提取和管理 .wim 文件的开源工具,它主要关注于 .wim 文件格式的操作。在 Windows 上,wimlib 能够使用本机 Windows API 来正确处理一些高级 NTFS 功能,这些功能是 Windows 操作系统中 NTFS 文件系统的一部分,具体包括:

  1. 硬链接(Hard Links)
  2. 符号链接(Symbolic Links)
  3. 交接点(Junction Points)
  4. 命名数据流(Named Data Streams)
  5. 安全描述符(Security Descriptors)

这些功能对于 NTFS 文件系统的高级特性至关重要,wimlib 能通过本机 API 确保它们能够在 .wim 文件中正确存储和还原。

在 Windows 操作系统中,文件系统提供了多种机制来增强文件的管理和操作能力。这些机制包括 硬链接符号链接交接点命名数据流安全描述符。它们在文件管理中起到了重要作用,下面是每个机制的详细说明以及相关的本机文件系统 API 清单。


1. 硬链接(Hard Links)

硬链接是一个指向文件数据的指针,可以将同一个文件的多个路径指向相同的物理磁盘位置。每个硬链接都有自己的文件名,但指向相同的文件数据块。

硬链接相关 API:

  • CreateHardLink

    • 功能:创建一个指向现有文件的硬链接。这个函数通过文件名创建一个新的硬链接,使得新的文件路径指向相同的文件数据块。
    • 使用场景:当你需要为一个文件创建多个入口点时,使用该函数。
    cppCopy Code
    BOOL CreateHardLink(
      LPCWSTR lpFileName,        // 硬链接的路径
      LPCWSTR lpExistingFileName // 目标文件路径
    );
  • GetFileInformationByHandle

    • 功能:获取指定文件的文件信息,包括硬链接计数。可以用它来获取某个文件的硬链接数量。
    • 使用场景:检查某个文件是否有硬链接。
    cppCopy Code
    BOOL GetFileInformationByHandle(
      HANDLE hFile,                    // 文件句柄
      LPBY_HANDLE_FILE_INFORMATION lpFileInformation // 文件信息结构
    );
  • DeleteFile

    • 功能:删除文件。如果文件具有多个硬链接,删除文件的某个链接不会删除实际的数据块,数据块会继续保留,直到所有硬链接都被删除。
    • 使用场景:删除硬链接,当文件的所有硬链接都删除时,文件的数据才会被完全删除。
    cppCopy Code
    BOOL DeleteFile(
      LPCWSTR lpFileName // 要删除的文件路径
    );

2. 符号链接(Symbolic Links)

符号链接是一个特殊的文件,它包含了另一个文件或目录的路径。符号链接可以是文件符号链接或目录符号链接,通常用于创建快捷方式或重定向路径。

符号链接相关 API:

  • CreateSymbolicLink

    • 功能:创建符号链接文件,符号链接指向目标文件或目录。符号链接分为软链接(指向文件)和硬链接(指向目录)。
    • 使用场景:当需要为文件或目录创建快捷方式时,可以使用此函数。
    cppCopy Code
    BOOL CreateSymbolicLink(
      LPCWSTR lpSymlinkFileName,  // 符号链接的路径
      LPCWSTR lpTargetFileName,   // 目标文件或目录的路径
      DWORD dwFlags               // 链接类型标志(文件或目录)
    );
  • GetFinalPathNameByHandle

    • 功能:获取符号链接的目标路径。可以用于解析符号链接,返回符号链接所指向的实际文件路径。
    • 使用场景:解析符号链接,获取其指向的真实文件路径。
    cppCopy Code
    DWORD GetFinalPathNameByHandle(
      HANDLE hFile,               // 文件句柄
      LPWSTR lpFilePath,          // 输出路径缓冲区
      DWORD dwBufferSize,         // 缓冲区大小
      DWORD dwFlags               // 标志,指定路径类型
    );
  • DeleteFile

    • 功能:删除符号链接。当删除符号链接时,它不会删除目标文件或目录,只会删除链接本身。
    • 使用场景:删除符号链接。
    cppCopy Code
    BOOL DeleteFile(
      LPCWSTR lpFileName // 要删除的符号链接路径
    );

3. 交接点(Junction Points)

交接点是指向目录的符号链接,它允许一个目录的内容在文件系统中的另一个位置显示。交接点通常用于挂载其他目录或提供透明的路径重定向。

交接点相关 API:

  • CreateJunction(通过 MKLINK 命令行工具)

    • 功能:通过命令行创建交接点。Windows 系统本身并未提供单独的 API 来创建交接点,但可以通过命令行工具 MKLINK 创建交接点。
    • 使用场景:创建一个指向目录的交接点。
    shCopy Code
    mklink /J [JunctionName] [TargetDirectory]
  • QueryDosDevice

    • 功能:查询是否存在交接点。此 API 用于查询系统是否存在特定的 DOS 设备路径(如交接点)。
    • 使用场景:通过 DOS 设备路径查询交接点。
    cppCopy Code
    DWORD QueryDosDevice(
      LPCWSTR lpDeviceName,  // 设备路径
      LPWSTR lpTargetPath,   // 输出的目标路径
      DWORD ucchMax          // 缓冲区大小
    );

4. 命名数据流(Named Data Streams)

命名数据流允许文件拥有多个数据流,每个数据流都有自己独立的名称。命名数据流用于存储附加的数据(如元数据)或其他附加信息。

命名数据流相关 API:

  • CreateFile

    • 功能:打开或创建文件的命名数据流。在文件路径后添加冒号(:)和数据流名称即可访问命名数据流。
    • 使用场景:创建和访问文件的命名数据流。
    cppCopy Code
    HANDLE CreateFile(
      LPCWSTR lpFileName,        // 文件路径和数据流名称(例如:file.txt:stream_name)
      DWORD dwDesiredAccess,     // 访问权限
      DWORD dwShareMode,         // 共享模式
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性
      DWORD dwCreationDisposition,  // 文件创建操作
      DWORD dwFlagsAndAttributes,  // 文件属性
      HANDLE hTemplateFile       // 模板文件句柄
    );
  • WriteFile

    • 功能:向命名数据流中写入数据。可以用它向特定数据流写入数据。
    • 使用场景:向文件的命名数据流中写入数据。
    cppCopy Code
    BOOL WriteFile(
      HANDLE hFile,             // 打开的文件句柄
      LPCVOID lpBuffer,         // 写入的数据
      DWORD nNumberOfBytesToWrite, // 要写入的字节数
      LPDWORD lpNumberOfBytesWritten, // 实际写入的字节数
      LPOVERLAPPED lpOverlapped  // 异步操作
    );
  • ReadFile

    • 功能:从命名数据流中读取数据。可以读取文件的命名数据流中的内容。
    • 使用场景:从命名数据流中读取数据。
    cppCopy Code
    BOOL 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 Code
    DWORD 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 Code
    DWORD 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 文件系统中的高级特性,使得恢复的文件系统尽可能地与原始系统一致。


 

posted @ 2025-03-26 04:40  suv789  阅读(84)  评论(0)    收藏  举报