65.9K
CodeProject 正在变化。 阅读更多。
Home

查询 8.3 状态 (Windows) 的卷设置

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (2投票s)

2011年12月22日

Ms-PL

4分钟阅读

viewsIcon

26402

downloadIcon

644

查询 8.3 状态 (Windows) 的卷设置

引言

自 Windows 95 作为长文件名 (LFN) 功能集的一部分推出以来,在 Windows 系统上处理 8.3 (又名兼容、短) 文件名一直是一项不断发展的任务。8.3 名称是早期系统向下兼容所必需的,这些系统不理解 LFN,甚至可能因试图管理 LFN 而崩溃。

有几个注册表设置控制是否以及如何生成 8.3 名称。对于关心这些问题的程序员来说,Windows Vista 和 Server 2003 引入了一项新功能:每个卷的 8.3 名称支持。当 8.3 名称支持以每个卷为基础发生时,该信息存储在卷头中一个新定义但文档极少的区域。本项目向您展示如何查找和解释 Windows 支持的任何磁盘卷的此设置。

背景

对于关心 8.3 名称生成的程序员来说,Windows 通过一系列注册表键公开其各种 8.3 配置选项,所有这些都位于 HKLM\System\CurrentControlSet\Control\FileSystem。使用的值包括:NameNumericTail, Win95TruncatedExtensionsNtfsDisable8dot3NameCreation (以及其他)。本文仅讨论 NtfsDisable8dot3NameCreation 和 Vista 发布时公开的新值。

在 Vista 和 Windows Server 2003 之前,NtfsDisable8dot3NameCreation 可以是 0 (在所有卷上创建 8.3 名称) 或 1 (在任何卷上都不创建 8.3 名称);默认值为 0。Vista 和 Server 2003 定义了两个新值:2 (8.3 名称支持按卷枚举) 和 3 (仅系统卷创建 8.3 名称)。有了新值 NtfsDisable8dot3NameCreation = 2 (这是新的默认值),Microsoft 未发布任何文档来解释如何枚举按卷设置。本示例代码演示了当 NtfsDisable8dot3NameCreation = 2 时,如何查询 Windows 磁盘卷的 8.3 配置。

Using the Code

提供的代码作为 C++ Win32 控制台应用程序构建;示例源代码项目是用 VS 2005 构建的。虽然它不是为 Unicode 编译的,但它应该可以在 Unicode 构建中正常工作,无需修改。如果您的应用程序支持专门的 NTFS 路径名约定 (例如,除了 c:\windows\explorer.exe,您还支持 \\?\c:\windows\explorer.exe 格式的名称),那么您应该将 Is8dot3.h 中的 #define _MAX_PATHBUF _MAX_PATH 更改为 #define _MAX_PATHBUF 32768 (或您的应用程序支持的任何路径缓冲区大小);您还需要为 Unicode 构建 Is8dot3.cpp。请注意,除非您为 Unicode 重建此示例,否则 \\?\c:\windows\explorer.exe 风格的路径名将失败并出现错误。

示例控制台应用程序将任何相对或绝对路径名作为其参数。它解析路径以发现其底层的卷挂载点 (通过调用 TranslatePathToVolume())。打开卷挂载点,然后通过 DeviceIOControl() 调用神秘的 (即文档极少的) FSCTL_QUERY_PERSISTENT_VOLUME_STATE。据我所知,仅有的少量文档是由 Alan Brown 首次描述的,他很友善地不仅将我引向了所需的 Microsoft DDK 头文件,还发送了他的原型代码。Is8dot3.cpp 基于该原型。

在 Vista 及更高版本的 Windows 上,用于 FSCTL_QUERY_PERSISTENT_VOLUME_STATEDeviceIOControl 调用返回一个 FILE_FS_PERSISTENT_VOLUME_INFORMATION 结构;在早期版本上,它会返回一个错误 (例如,在 XP 上,它返回错误代码 1:函数不正确)。该结构的 VolumeFlags 成员包含持久性状态标志;我们正在寻找的标志是 PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED。如果设置了该标志,则该卷不支持创建 8.3 名称。如果未设置该标志,则该卷支持 8.3 名称创建。在 Windows 7 下对 FAT 卷进行的测试表明,此调用似乎同时适用于 FAT 和 NTFS。此测试**并非**详尽无遗。

在 Vista 之前的系统上,每个卷上都没有存储 PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED 位。在这些系统上,不应在注册表中找到 NtfsDisable8dot3NameCreation = 2。如果一个在旧系统上格式化的磁盘被挂载在 Vista 或更高版本的系统上,它们如何处理对我来说并不清楚。我最好的猜测是,它们被视为 PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED 位为零 (即,启用了 8.3 名称)。使用此演示应用程序对这些磁盘进行进一步测试将很快揭示它们是如何处理的。

Windows Server 2003 TechNet 文章 NtfsDisable8dot3NameCreation 描述了如何使用 Win32 控制台应用程序 FSUtil.exe 查询和设置 8.3 名称创建,包括持久性每个卷的支持位。请记住,IsVolume8dot3() 返回任何给定卷的设置,但整体 8.3 名称支持取决于其他因素 (包括 NtfsDisable8dot3NameCreation 的值)。FSUtil.exe 也可用于附加到 Vista (或更高版本) 系统的旧系统创建的磁盘卷,以确定 Windows 如何处理缺乏 PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED 位的情况。

关注点

此代码仅适用于本地驱动器;在 UNC 路径名上会失败。

历史

  • 2011 年 12 月 20 日 - 首次发布
  • 2011 年 12 月 27 日 - 更新文章
© . All rights reserved.