不知道大家有没有好奇过,资源管理器里的云盘功能,到底是怎么做到的?我在复刻这一功能时,发现了一些不符合直觉的事情,于是写下了这篇文章

我们暂且把注册到文件管理器的云盘称之为“虚拟硬盘”

69706-giwd1dwjid4.png


当你打开文件管理器时,虚拟硬盘已经在运行了

理想情况下,你所看到的云盘图标应该是静态配置,只有你打开文件管理器后,再去点击虚拟硬盘,它才会开始运行

但实际上,只要文件管理器一打开,虚拟硬盘的代码就已经开始执行了

即是不需要用户交互就能运行

注意,这里说的远不只是加载虚拟硬盘的图标或右键菜单那么简单,而是它可以运行任意代码

而这一切,只需要你打开一次文件管理器就能完成

36740-t9f1ylcnmzk.png


右键菜单-扩展菜单是否存在相同问题?

我们写一个自定义菜单来测试一下

同样是纯菜单,没有后台进程

57602-ke3on8fdz0d.png

结果如下:

菜单甚至还没显示出来,扩展菜单的内部代码(打开计算器)就已经执行了

82514-423t1yo5qm5.png

这意味着什么?

如果一个应用心怀不轨,它甚至不需要申请开机自启,仅通过虚拟硬盘或右键扩展菜单中的任意一种方式,就能让自己在后台持续运行


在此之前,我一直以为它的机制和安卓类似:只是向系统注册一个菜单,只有用户明确选中时才会执行。从测试结果来看,两者的原理完全不同

资源管理器会在启动时,调用所有注册的dll,执行dllmain里的代码。
但是dllmain里没有太多限制,几乎是想做什么就能做什么。于是就实现了上面演示图的的效果

47924-yq6db17i67e.png

无论是虚拟硬盘还是右键菜单扩展,它们都可以在用户尚未进行任何交互时就被文件管理器提前加载,其对应的代码也因此获得了执行机会

这也解释了为什么扩展菜单多了后,右键菜单明显卡顿等现象——因为系统并不只是读取一份静态菜单,而是在后台完成了更多工作