汗啊,逆向Windows可不是容易的事,对于我来说就更难了。。
所以,我就用一些工具和丰富的Windows软件开发经验来简单滴研究一下Windows10沸沸扬扬的"虚拟桌面"
其实大家都知道,虚拟桌面其实在很早就有了,市面上就有一些虚拟桌面软件,我也有偶然得到了一款虚拟桌面的源码,这些虚拟桌面软件其实都是调用了一个叫CreateDesktop(Ex)的API而已,所以我就以为Windows10虚拟桌面也就是调用了一下这个API而已,但是又很奇怪,毕竟Windows10虚拟桌面可以让窗口随意切换桌面,但是根据微软的规定,一直以来都是“如果一个线程没有UI,那么他可以通过API修改自己所属于的桌面,如果线程有UI,那么他不能切换桌面”,难道Windows10要打破这一规则么,那为何MSDN上没有说明呢?这里面又有什么不为人知的隐秘呢?
昨天装了一天的虚拟机,操蛋,太操蛋,装了4次。。。第一次装个2000练练手,装好了就删了,第二次,用virtualbox装w10,结果装完工具重启一下说驱动程序签名错误,还不能修复,高级启动(因为里面有禁用强制签名)还点不动,于是果断卸掉virtualbox,改装vmware,还是vmware好用啊,就像windows比linux好用一样,开源的东西经常出一些问题,vmware估计给买了权威CA的签名了,所以不会出现驱动签名的问题,好吧,结果今天我又把w10玩坏了,开始菜单点不动了,重启也不行(不愧是预览版),没办法,今天重装。。。我可怜的硬盘,我可怜的cpu。。。
先看看我的用的w10吧,应该是10074.。不是很新,不过没办法。。更新卡住0%不动弹。。
开始测试:
首先,创建一个“Win10虚拟桌面”,然后运行我写的一个工具(目前只是半成品),他能枚举桌面,但是发现当前只有一个桌面(默认桌面)
然后运行一个虚拟桌面软件,同时创建一个桌面:
随后仔使用我写工具枚举桌面:
发现多了一个桌面!!!这意味着。。
结论1:win10虚拟桌面和windows桌面机制无关,同时win10上的桌面机制和依旧可以正常工作,也就是说win10虚拟桌面是采用了其他办法在一个桌面上实现的。
我在这里猜测:是不是shell或者init在当前桌面创建了很多“子桌面”,不同的窗口可以随时使用setwindowlong设置父窗口实现,但是一想又不对,还是让spy++来看看吧
(win10UAC的盾牌变得好难看。。)
果然没有任何端倪,和其他windows一样。
把spy++放到其他的“win10虚拟桌面”,发现窗口没有变!!
于是我干脆监控消息,发现切换到窗口所在桌面时窗口响应了几个偏门的消息
结论2:win10虚拟桌面有可能是通过窗口消息实现的,窗口切换到其他桌面时,窗口的一切没有改变,包括坐标,是否隐藏等等。
在首先在win10的一个win10桌面隐藏窗口,在另一个桌面显示,发现窗口显示到了这个桌面。
然后我运行我做的后台软件,发现命令后台软件创建其他进程时窗口显示在当前桌面。
结论3:后台程序创建窗口,创建进程,或者把隐藏的窗口显示出来,都在当前win10桌面。
然后装了一个360,发现360的加速球(看右下角)可以不受win10桌面机制的影响,切换桌面依旧有!大家都应该知道这是个总在最前工具窗口
然后我自己写了一个工具窗口
CreateWindowEx(WS_EX_TOOLWINDOW|WS_EX_TOPMOST,。。。。
即创建一个WS_EX_TOOLWINDOW(工具窗口)WS_EX_TOPMOST(总在最前)的窗口
发现和360的加速球一样。
结论4:总在最前的工具窗口不受win10虚拟桌面影响,如果我们要给用户发一个通知,应该用总在最前的工具窗口。
暂时就这么多,等win10正式版发布了再研究。