Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

【水·技术】浅谈Windows 10 Build 9879的磁盘清理的System Compression

2014-12-21 13:53| 发布者: pcBeta| 查看: 5671| 评论: 9|原作者: Mouri_Naruto|来自: 景友分享

收藏 分享
摘要: PS:估计看完这篇文章的巨神们可能会认为我这个帖子有些微不足道,既然这样,就当我来水经验好了 PS:感谢@不离不弃的包子,@zifeityzyicq和@ART-Master ,没有他们,我也没有办法水经验 PS:以下正文开始 说到Windows 10 Build 9879的新特性,磁盘清理的System Comp ...

PS:估计看完这篇文章的巨神们可能会认为我这个帖子有些微不足道,既然这样,就当我来水经验好了

PS:感谢@不离不弃的包子@zifeityzyicq和@ART-Master ,没有他们,我也没有办法水经验

PS:以下正文开始

说到Windows 10 Build 9879的新特性,磁盘清理的System Compression肯定会被注意到;我昨天试了一下,效果超级棒(C盘增加了10GB空闲空间);但这引起了我的好奇心,我的直觉告诉我,应该是NTFS压缩,但是,当我随便看一个系统盘下的文件的属性时让我目瞪口呆

以上是ntoskrnl.exe的属性截图,NTFS压缩竟然不勾选,而且看占用和大小这两栏数字,明显发现是压缩过的

……“这种黑科技,微软是怎么做到的?”……我的疑惑越来越大,最终准备用IDA反汇编cleanmgr.exe

但是反编译后,发现cleanmgr.exe没有内建清理列表;但是一个注册表键“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches”给予了我灵感,我想这应该就是cleanmgr的清理列表,事实打开注册表也的确如此。浏览System Compression子键,如图

一般的人估计觉得这里没有什么特别的就走了,但是,我却发现了不同。我马上把(默认)这个值的GUID放进注册表编辑器的搜索选项,结果发现System Compression是调用WofDsCln.dll实现的。于是我准备去SysWOW64去找这个文件(因为32位IDA不能反汇编64位PE文件),但是没有找到;我去远景求助,感谢包子君把32位的WofDsCln.dll发给我

当我求助的时候,也没有忘记用7zip查看WofDsCln.dll的内容,粗略看了看,调用的一个函数引起了我的注意,那就是DeviceIOControl和GetCompressedFileSizeW;我去问zifeityzyicq,他告诉我估计是NTFS压缩的新算法,看看传入DeviceIOControl的是什么参数。

一会儿QQ新消息来了,原来是包子把文件发来了,万岁!我终于可以放大招了

粗略的用IDA看了看,也了解了System Compression的原理(在最后会说明),本来想写个Demo的(非常感谢ART-Master的指导,虽然最后没有写出来,我觉得很愧疚),结果代码Debug出错,出错代

码是0x00000157(也就是请提供Provider);遂我只好放弃了(抱歉)顺便把反汇编后的主要操作的C++伪代码贴一下

  1. char __fastcall CompressFile(void *a1, const WCHAR *a2, void *a3, unsigned __int16 *a4, struct _WIN32_FIND_DATAW *a5, struct _COMPRESS_STATS *a6)
  2. {
  3.   char v6; // zf@1
  4.   unsigned int v8; // ecx@3
  5.   int v9; // eax@3
  6.   char v10; // bl@6
  7.   unsigned __int8 v11; // cf@6
  8.   const WCHAR *v12; // ecx@7
  9.   const WCHAR v13; // ax@8
  10.   int v14; // ecx@9
  11.   const wchar_t *v15; // edi@10
  12.   DWORD v16; // eax@19
  13.   HANDLE v17; // ecx@21
  14.   int v18; // edi@24
  15.   const WCHAR *lpFileName; // [sp+10h] [bp-30h]@1
  16.   int v20; // [sp+14h] [bp-2Ch]@3
  17.   DWORD BytesReturned; // [sp+18h] [bp-28h]@13
  18.   int v22; // [sp+1Ch] [bp-24h]@3
  19.   DWORD v23; // [sp+20h] [bp-20h]@19
  20.   HANDLE FileSizeHigh; // [sp+24h] [bp-1Ch]@1
  21.   int OutBuffer; // [sp+28h] [bp-18h]@13
  22.   int v26; // [sp+2Ch] [bp-14h]@16
  23.   int v27; // [sp+30h] [bp-10h]@16
  24.   unsigned __int32 v28; // [sp+34h] [bp-Ch]@16
  25.   int v29; // [sp+38h] [bp-8h]@16

  26.   v6 = (*(_BYTE *)a3 & 0x10) == 0;
  27.   lpFileName = a2;
  28.   FileSizeHigh = a1;
  29.   if ( !v6 )
  30.     return 1;
  31.   v8 = *((_DWORD *)a3 + 8);
  32.   v9 = *((_DWORD *)a3 + 7);
  33.   v20 = *((_DWORD *)a3 + 8);
  34.   v22 = v9;
  35.   if ( v9 > 0 || v9 >= 0 && v8 >= 0x2000 )
  36.   {
  37.     v12 = a2;
  38.     do
  39.     {
  40.       v13 = *v12;
  41.       ++v12;
  42.     }
  43.     while ( v13 );
  44.     v14 = v12 - (a2 + 1);
  45.     v10 = 1;
  46.     if ( (unsigned int)v14 <= 4 || (v15 = &a2[v14 - 4], __wcsicmp(v15, L".exe")) && __wcsicmp(v15, L".dll") )
  47.     {
  48.       v11 = __CFADD__((*((_DWORD *)a4 + 8))++, 1);
  49.       *((_DWORD *)a4 + 9) += v11;
  50.     }
  51.     if ( DeviceIoControl(FileSizeHigh, 0x90310u, NULL, 0, &OutBuffer, 0x14u, &BytesReturned, NULL)
  52.       || GetLastError() == 234
  53.       || GetLastError() == 122
  54.       || (v29 = 0,
  55.           v28 = WofAlgorithm,
  56.           OutBuffer = 1,
  57.           v26 = 2,
  58.           v27 = 1,
  59.           !DeviceIoControl(FileSizeHigh, 0x9030Cu, &OutBuffer, 0x14u, NULL, 0, &BytesReturned, NULL))
  60.       && GetLastError() != 344
  61.       && GetLastError() != 317 )
  62.       return v10;
  63.     v16 = GetCompressedFileSizeW(lpFileName, (LPDWORD)&FileSizeHigh);
  64.     v23 = v16;
  65.     if ( v16 == -1 )
  66.     {
  67.       if ( GetLastError() )
  68.       {
  69.         v16 = 0;
  70.         v17 = NULL;
  71. LABEL_24:
  72.         v18 = v22;
  73.         if ( !v20 )
  74.         {
  75.           if ( !v22 )
  76.           {
  77.             v17 = NULL;
  78.             v16 = 0;
  79.           }
  80.         }
  81.         v11 = __CFADD__(v20, *((_DWORD *)a4 + 12));
  82.         *((_DWORD *)a4 + 12) += v20;
  83.         *((_DWORD *)a4 + 13) += v18 + v11;
  84.         v11 = __CFADD__(v16, *((_DWORD *)a4 + 16));
  85.         *((_DWORD *)a4 + 16) += v16;
  86.         *((_DWORD *)a4 + 17) += (char *)v17 + v11;
  87.         v11 = __CFADD__((*((_DWORD *)a4 + 2))++, 1);
  88.         *((_DWORD *)a4 + 3) += v11;
  89.         return v10;
  90.       }
  91.       v16 = v23;
  92.     }
  93.     v17 = FileSizeHigh;
  94.     goto LABEL_24;
  95.   }
  96.   v10 = 1;
  97.   v11 = __CFADD__((*((_DWORD *)a4 + 10))++, 1);
  98.   *((_DWORD *)a4 + 11) += v11;
  99.   return v10;
  100. }

总体来说,这个System Compression的原理还是挺搞笑的,那就是把Windows目录和Program Files目录下的所有的EXE和DLL文件采用WofAlgorithm压缩(Wof算法,估计有人会疑问,说白了就是对每个文件进行WIMBoot压缩)

顺便也想说,去MSDN查了查那个IO码,也就是FSCTL_SET_EXTERNAL_BACKING和FSCTL_GET_EXTERNAL_BACKING;最低要求Windows 8.1 Update;但是微软在C++的头文件里写最低要求Win7?莫非是WIMBoot早就在Win7就策划好了?@vb4112 麻烦巨神解答一下

如果有大神可以写出Demo,希望可以Open Source让我们这群小白拜读,感激不尽

更多Windows 10 技巧讨论,请移步至远景论坛 Windows 10版块(http://bbs.pcbeta.com/forum-548-1.html

26

鲜花

握手

雷人
7

路过

鸡蛋

刚表态过的朋友 (33 人)

发表评论

最新评论

引用 2016-11-9 12:01 PCBETA网友 36.108.*.*
好!
引用 2015-6-22 14:40 PCBETA网友 120.42.*.*
为什么10130没有这个选项啊
引用 2015-3-10 23:01 PCBETA网友 123.138.*.*
学-!-习学-!-习
引用 2015-1-8 20:10 PCBETA网友 49.87.*.*
虽然不明白你在说什么,但听起来好厉害的样子
引用 2015-1-8 20:03 PCBETA网友 49.87.*.*
慢慢学习吧,路还很长
引用 2015-1-5 10:09 PCBETA网友 116.231.*.*
细节虽然没看懂,但是win10的这个新特性我是读懂了;绝对不是作者所说“微不足道”的。感谢楼主,加油啊。。。
引用 2014-12-23 12:41 PCBETA网友 60.28.*.*
虽然不明白你在说什么,但听起来好厉害的样子
引用 2014-12-23 10:09 PCBETA网友 101.16.*.*
一知半解的。不错加油
引用 2014-12-22 19:56 PCBETA网友 58.212.*.*
太高深了,没看懂……

查看全部评论(9)

验证码 换一个
远景网官方微博 远景网人人小站
投递新闻
关闭

站长推荐

Ourbits邀请函
PT爱好者的福音~详见帖子正文
回顶部
Copyright (C) 2005-2017 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛 | 电脑硬件 | 安卓软件