0x00 前言
今天安装软件,发现C盘空间竟然只有70多G,我也没装太多东西啊,怎么就250G的空间剩这么点了?! 想着直接用WinDirStat扫描分析下看看是什么文件占用了空间,使用WIN+E快捷键打开我的电脑后,无意中瞥见了这个“C盘瘦身专家(它是金山全家桶的一员)”。
点开后,找到了“罪魁祸首”,没想到深信服的一个VPN客户端竟然在我的C盘产生了一个60多G的日志文件!不得不说,同样作为码农的我,也是深有感触。
0x01 虚拟文件夹
之前一直好奇百度网盘和迅雷下载是怎么实现在我的电脑实现自己的虚拟文件夹的,正好借这个机会研究一下。
那么这种虚拟文件夹是怎么显示在explorer我的电脑窗口里面的呢?想着按照微软的方式应该是在注册表中吧,于是WIN+R快捷键输入regedit命令打开注册表,搜索一番,果然有发现。
计算机\HKEY_CLASSES_ROOT\CLSID\{53EA8E76-386A-4429-9956-8F3E9D646D76}
在以上注册表路径下找到了C盘瘦身专家相关的信息,总结如下:
图标是DefaultIcon键值设置的exe中的图标。
单纯的这些信息,并不能在我的电脑窗口显示相应的假设备图标,继续搜索,找到了如下路径
计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{53EA8E76-386A-4429-9956-8F3E9D646D76}
以上注册表节点MyComputer\Namespace下引用了HKEY_CLASSES_ROOT\CLSID路径下的GUID值 (这里是{53EA8E76-386A-4429-9956-8F3E9D646D76})。
0x02 尝试
既然已知金山是怎么在explorer里添加虚拟文件夹的,那就可以按上面的方法尝试下。第一步,先要生成一个GUID值,我这里采用Visual Studio自带的guidgen.exe工具生成一个,值为{2F4071A9-065E-407D-9D15-D6921126C2A3}。第二步,在HKEY_CLASSES_ROOT\CLSID路径下添加刚刚生成的GUID值,仿照C盘瘦身专家创建相应的键值。第三步,在MyComputer\Namespace下创建子项值为刚才创建的GUID值。最终的注册表中,如下:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{2F4071A9-065E-407D-9D15-D6921126C2A3}]
@="mmilmf"
"InfoTip"="游戏模拟器(有好多好玩的哦)"
"LocalizedString"="游戏模拟器"
"System.ItemAuthors"="游戏模拟器(有好多好玩的哦)"
"TileInfo"="prop:System.ItemAuthors"[HKEY_CLASSES_ROOT\CLSID\{2F4071A9-065E-407D-9D15-D6921126C2A3}\DefaultIcon]
@="G:\\格斗97\\WinKawaks1.52中文版.exe"[HKEY_CLASSES_ROOT\CLSID\{2F4071A9-065E-407D-9D15-D6921126C2A3}\Shell]
[HKEY_CLASSES_ROOT\CLSID\{2F4071A9-065E-407D-9D15-D6921126C2A3}\Shell\Open]
[HKEY_CLASSES_ROOT\CLSID\{2F4071A9-065E-407D-9D15-D6921126C2A3}\Shell\Open\Command]
@="G:\\格斗97\\WinKawaks1.52中文版.exe"[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{2F4071A9-065E-407D-9D15-D6921126C2A3}]
@="mmilmf"
创建好后,在我的电脑窗口上按F5刷新一下,我的游戏文件夹就出现了,大功告成!
鼠标双击或者右键菜单,可以打开刚刚设置的游戏程序。
0x03 扩展
关于虚拟文件夹(Virtual Folder)其实它是Shell Namespace Extension里面的概念,具体的可以参照MSDN。
上面是直接编辑注册表的方式,完成了在我的电脑窗口添加虚拟文件夹。如果写代码的话,除了注册表相关的API写注册表之外,是否有其他的方式呢?想着IShellFolder/IShellView等COM接口也许可以完成相同的功能,这个留作以后研究吧。
在上一步的尝试过程中,创建好注册表以后,需要手动刷新我的电脑窗口,才会出现我们添加的设备,是否可以自动完成呢?我们可以使用如下的方式使窗口自动刷新
SHChangeNotify(SHCNE_CREATE, SHCNF_PATH|SHCNF_FLUSHNOWAIT, _T("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"), 0);
其中{20D04FE0-3AEA-1069-A2D8-08002B30309D} 代表我的电脑。
另外,如果你想删除我的电脑窗口上一些图标,如:文档,图片 等,可以在MyComputer\Namspace节点下找到相应的注册表项,将其删除即可(建议在不懂的情况,不要盲目做)。
32位系统
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
\Explorer\MyComputer\NameSpace\
64位系统除了上述键值,还包含以下键值
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\
具体GUID值与图标的对应关系,可以自行网上搜索,这里就不列举了。