ShowSuperHidden 和 SuperHidden 注册表值之间有什么区别?

Has*_*ziz 10 windows windows-registry windows-7 windows-explorer

在注册表项下:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
Run Code Online (Sandbox Code Playgroud)

...有两个有据可查的值与在 Windows 资源管理器中显示隐藏文件和文件夹有关。

Hidden键在 true 时显示隐藏文件,在 false 时隐藏它们。

ShowSuperHidden密钥通常被认为是“超级隐藏”(即受保护/系统)文件的等价物;它在 true 时显示超级隐藏文件,在 false 时隐藏它们。

也就是说,SuperHidden价值从何而来?它的名字表明它将是Hidden密钥的自然模拟,但据我所知,关于它的文档及其作用是不存在的。

SuperHidden值的目的是什么,它与ShowSuperHidden有何不同?

Ben*_*n N 13

ShowSuperHidden正如我们发现的,控制是否显示超级隐藏(隐藏 + 系统)文件。据我所知,SuperHidden什么都控制不了,它的存在可能是一个编程错误。

使用Process Monitor,我观察了对这些注册表值的读取和写入。SuperHidden当用户打开“文件夹选项”对话框的“查看”选项卡时,唯一的交互是写入。如果显示超级隐藏文件,它会收到 1,否则会收到 0。即使我终止并重新启动 Explorer,它也从未被读取过。

Procmon 提供导致受监控操作的堆栈(双击事件并查阅堆栈选项卡),因此我使用IDA v5.0检查了涉及的 DLL 文件。唯一提及的相关内容SuperHiddenshell32.dll。该CachedShellState::SaveAdvancedSettings函数向该值和该键中的其他值发出注册表写入,提交当前视图设置。

在 SaveAdvancedSettings 中写入 SuperHidden

资源管理器显然在显示视图选项卡之前调用了该函数。这样做可能是为了在加载视图选项的当前状态之前确保注册表与当前的内存设置一致,尽管我承认我不是 100% 确定推理。无论如何,相应的shell32.dll函数会CachedShellState::_GetAdvancedSettings从正确的值ShowSuperHidden.

在 _GetAdvancedSettings 中读取 ShowSuperHidden

这些反汇编列表来自该 DLL 的 Windows 7 版本。在 Windows 10 中,SuperHidden注册表中不存在,并CachedShellState::SaveAdvancedSettings写入ShowSuperHidden.

Windows 10 在 SaveAdvancedSettings 中写入 ShowSuperHidden

因此,我得出的结论是,在对 Windows 7 附带的该功能版本进行编程时,开发人员错误地省略了Showin ShowSuperHidden,但该错误在 Windows 10 的过程中得到了纠正。

出于好奇,“文件夹选项”对话框不会被此错误破坏,因为它会在ValueName此处查询每个设置项下的条目:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder
Run Code Online (Sandbox Code Playgroud)

计算出该分支其他部分的重要性留给读者作为(有趣!)练习。

  • @Biswa 是的,`explorer.exe` 是负责更改的*进程*,但是调用的是`shell32.dll`(Explorer 加载的)中的代码。要查看所涉及的 DLL,请双击事件并切换到堆栈选项卡。`kernel32.dll` 或 `kernelbase.dll` 之前的框架通常是一个很好的调查,但并不总是很清楚,这就是为什么我检查了几个 DLL 文件。 (2认同)
  • 我加入了超级用户来支持这个!除了 SuperHidden 之外,您还包含了许多有用的东西:ProcMon 的另一种用法,令人难以置信的 IDA 工具,以及链接问题中的提示。谢谢! (2认同)