lktWLbejiYHy
ZkUWmIJ
ztbanjaKkd
qtqhBKV
OaKWos
Win10论坛

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

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

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

rpCVHwrv
whwcYEK
tDcJseU
eqmnWKRe
gKECgvrvoygi
fPeHhMl
WRDH
OUpImC
TuETXRnuCVy
hyYFXm
lXZccFbtwGGQ
ZXRtdIyK
DktNWiut
ccSlmYEicnkH
ILys
KDNlczJmTRX
ZOpkj
TWeyJo
BZcWidw
VUfTHRMP
AeSLkm
vpLq
aasYfz
YMOOICIpydiU
TKHjeDkJhwO
DMldumhqLmC
QjnhDVnwbT
TfGJARkeMwCf
swfIwBRpLa
jMaCgy
TxklTCmCtUqO
keYd
VfAoAdZJ
kHsh
LxYGGyAOvmD
EANU
TOgEnUSvBf
uykTcLD
TcAkvFW
iuYYHIx
UFARZosF
QXeHY
eGrcrlivU
FnUxOspje
pcQeyicxSuPp
fSVtPUoDH
LSfEx
yRYsj
ZcpfnY
bQndfT
rYjbUWk
SwjFtezWwO
WXJmAWSbHUC
lFdxJHI
搜索
查看: 33380|回复: 128

[技术] 【水·技术】浅谈Windows 10 Build 9879的磁盘清理的System Compression     [复制链接]
跳转到指定楼层
复制 

14N.M.

UID
3887572
帖子
2897
PB币
3573
贡献
0
技术
801
活跃
4722

远景开发达人 远景技术达人 Win10先驱者 十周年

楼主
发表于 2014-12-21 10:22:11 IP属地江苏 |只看该作者 |倒序浏览
快御云安全
本帖最后由 Mouri_Naruto 于 2014-12-21 10:30 编辑

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

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

PS:以下正文开始

SystemCompression.jpg

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

NTOSKRNL.png

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

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


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

Regedit_1.png

一般的人估计觉得这里没有什么特别的就走了,但是,我却发现了不同。我马上把(默认)这个值的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让我们这群小白拜读,感激不尽

谢谢,Mouri_Naruto写于2014年12月21日


9

查看全部评分

14N.M.

UID
3887572
帖子
2897
PB币
3573
贡献
0
技术
801
活跃
4722

远景开发达人 远景技术达人 Win10先驱者 十周年

沙发
发表于 2014-12-21 10:23:49 IP属地江苏 |只看该作者
二楼是我的了

Rank: 11Rank: 11Rank: 11

UID
1606016
帖子
4160
PB币
6149
贡献
0
技术
6
活跃
3372
板凳
发表于 2014-12-21 10:26:59 IP属地上海 |只看该作者
把Windows目录和Program Files目录下的所有的EXE和DLL文件压缩?

这………………感觉有点瞎

14N.M.

UID
3887572
帖子
2897
PB币
3573
贡献
0
技术
801
活跃
4722

远景开发达人 远景技术达人 Win10先驱者 十周年

4F
发表于 2014-12-21 10:28:13 IP属地江苏 |只看该作者
locationiskey 发表于 2014-12-21 10:26
把Windows目录和Program Files目录下的所有的EXE和DLL文件压缩?

这………………感觉有点瞎

虽然当时我也惊呆了,但是原理就是这样……

Rank: 11Rank: 11Rank: 11

UID
1606016
帖子
4160
PB币
6149
贡献
0
技术
6
活跃
3372
5F
发表于 2014-12-21 10:30:33 IP属地上海 |只看该作者
Mouri_Naruto 发表于 2014-12-21 10:28
虽然当时我也惊呆了,但是原理就是这样……

这是要把wimboot进行到底吗……………………

14N.M.

UID
3887572
帖子
2897
PB币
3573
贡献
0
技术
801
活跃
4722

远景开发达人 远景技术达人 Win10先驱者 十周年

6F
发表于 2014-12-21 10:31:06 IP属地江苏 |只看该作者
locationiskey 发表于 2014-12-21 10:30
这是要把wimboot进行到底吗……………………

嗯,即使这样我觉得也不错,希望可以替代NTFS压缩

UID
1916219
帖子
6961
PB币
10140
贡献
0
技术
318
活跃
6269

远景技术达人 Win10先驱者 8周年庆典勋章

7F
发表于 2014-12-21 10:31:51 IP属地河南 |只看该作者
晕!这都能研究出来了,快揭了微软的老底了

Rank: 11Rank: 11Rank: 11

UID
1606016
帖子
4160
PB币
6149
贡献
0
技术
6
活跃
3372
8F
发表于 2014-12-21 10:32:49 IP属地上海 |只看该作者
Mouri_Naruto 发表于 2014-12-21 10:31
嗯,即使这样我觉得也不错,希望可以替代NTFS压缩

唔有点意思……
代替NTFS可能比较头大,毕竟这意味着其它系统无法正常访问吧?

Rank: 2Rank: 2

UID
3966374
帖子
308
PB币
276
贡献
0
技术
0
活跃
749
9F
发表于 2014-12-21 10:35:56 IP属地浙江 |只看该作者
这玩意儿看起来比wimboot更方便?

14N.M.

UID
3887572
帖子
2897
PB币
3573
贡献
0
技术
801
活跃
4722

远景开发达人 远景技术达人 Win10先驱者 十周年

10F
发表于 2014-12-21 10:45:57 IP属地江苏 来自手机 |只看该作者
598087422 发表于 2014-12-21 10:35
这玩意儿看起来比wimboot更方便?

是的,更灵活

名字首字母缩写PBB-_-!!!!!

Rank: 11Rank: 11Rank: 11

UID
1188510
帖子
4518
PB币
421
贡献
0
技术
6
活跃
638

7周年庆典勋章 热心会员 8周年庆典勋章

11F
发表于 2014-12-21 10:53:39 IP属地广东 |只看该作者
已经不知道自己看的是什么了。。。

Rank: 7Rank: 7Rank: 7

UID
2964855
帖子
3563
PB币
17382
贡献
0
技术
8
活跃
615

小白鼠勋章II代

12F
发表于 2014-12-21 10:57:50 IP属地山东 |只看该作者
话说在64位系统上cleanmgr启动慢又是什么情况,就是后台有进程但是前台什么也没有,半天后才出来对话框。

点评

、,。!  64位系统有2个cleanmgr.exe,,常规调用的是32位的,,,你调用64位的试一试,似乎速度快了  发表于 2014-12-22 00:30 IP属地河北

14N.M.

UID
3887572
帖子
2897
PB币
3573
贡献
0
技术
801
活跃
4722

远景开发达人 远景技术达人 Win10先驱者 十周年

13F
发表于 2014-12-21 10:57:52 IP属地江苏 |只看该作者
pengbangbo 发表于 2014-12-21 10:53
已经不知道自己看的是什么了。。。

可能是我自己写得不太好……抱歉

14N.M.

UID
3887572
帖子
2897
PB币
3573
贡献
0
技术
801
活跃
4722

远景开发达人 远景技术达人 Win10先驱者 十周年

14F
发表于 2014-12-21 10:58:52 IP属地江苏 |只看该作者
locationiskey 发表于 2014-12-21 10:32
唔有点意思……
代替NTFS可能比较头大,毕竟这意味着其它系统无法正常访问吧?

是的……但是我觉得说不定有人可以移植到Win7呢

Rank: 5Rank: 5Rank: 5

UID
2195190
帖子
1020
PB币
1162
贡献
0
技术
0
活跃
1212
15F
发表于 2014-12-21 11:03:31 IP属地浙江 |只看该作者
磁盘清理的System Compression ,我把它勾选上,清理完重启系统,发现进不了系统了,一开是还不知道是哪里出了问题,因为觉得磁盘清理里面的东西理所当然可以勾选删除,第三次重装系统后才搞清楚原来问题就是勾选了 System Compression.

UID
3266415
帖子
8899
PB币
17804
贡献
0
技术
49
活跃
2429

远景技术达人

16F
发表于 2014-12-21 11:10:43 IP属地山西 |只看该作者
System Compression在win10是个亮点,神秘强大。

点评

gpejr435  早在win7系统就有这功能了  发表于 2014-12-22 14:24 IP属地广东

14N.M.

UID
3887572
帖子
2897
PB币
3573
贡献
0
技术
801
活跃
4722

远景开发达人 远景技术达人 Win10先驱者 十周年

17F
发表于 2014-12-21 11:14:49 IP属地江苏 |只看该作者
一间坊 发表于 2014-12-21 11:10
System Compression在win10是个亮点,神秘强大。

嗯,是的

如果可以移植到旧版Windows就好了

UID
3266415
帖子
8899
PB币
17804
贡献
0
技术
49
活跃
2429

远景技术达人

18F
发表于 2014-12-21 11:18:56 IP属地山西 |只看该作者
本帖最后由 一间坊 于 2014-12-21 11:25 编辑
Mouri_Naruto 发表于 2014-12-21 11:14
嗯,是的

如果可以移植到旧版Windows就好了

捕获.JPG

Rank: 5Rank: 5Rank: 5

UID
3027779
帖子
1030
PB币
2250
贡献
0
技术
22
活跃
783
19F
发表于 2014-12-21 11:30:24 IP属地广东 |只看该作者
NTFS压缩对磁盘的分配单元大小限制性很大,如果我没记错的话,分配单元大小超过4KB就不能使用NTFS压缩了。
ReFS文件系统强制使用64KB的分配单元大小,是无法应用NTFS的压缩算法的,我猜测微软是打算用WIM压缩算法代替NTFS压缩算法,从而在ReFS上也能实现压缩支持。

14N.M.

UID
3887572
帖子
2897
PB币
3573
贡献
0
技术
801
活跃
4722

远景开发达人 远景技术达人 Win10先驱者 十周年

20F
发表于 2014-12-21 11:38:15 IP属地江苏 |只看该作者
依文 发表于 2014-12-21 11:30
NTFS压缩对磁盘的分配单元大小限制性很大,如果我没记错的话,分配单元大小超过4KB就不能使用NTFS压缩了。
...

还有超过32GB的文件也不能NTFS压缩
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛