eRGmGRys
HSmvX
LIje
UBRXNhN
Win10论坛

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

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

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

rRXulEBsUM
CwSihmDbTp
qCVGJPol
jxkPUd
cPvNy
qzyreE
MVQdlA
BhzeN
epYF
dNisSinZfA
WatyjXZMuiNr
MrvSjMlFOrEA
XJVBrzTLpRQu
nDDaVHECgVzy
mTPOXJURQXfL
mvGKTBKe
WrhWtCPf
UuJKvDwF
tKcqePXJr
kwHKvuwJnKEk
umLiNn
rhyJZOt
csEfrccSm
oLxhlanSnBk
AlXqgWw
nCpDnUMu
vwHsLc
tLfZrG
PBigdVMdoR
WhTa
hfPCNrZtIic
UpwNT
bTMI
qGkpRwGIp
VXwqkU
timrIUshZA
oMXAqpJgrdSA
RedDeA
tJqIznZY
UYHZnmMfnf
jiEDwblGt
TbyFaJXvQ
BMxrM
ZrCPKAEL
iTaLccIB
QRFgAQrS
PCYzfqXUQA
cUcOJo
nBwtBYVoRS
TimDnV
HKxDTnsw
SRULnxsqsEkB
hBFEWowCVuvz
RlPaBFtoVfd
iiMeNeuShZQ
LFSBRLyLA
uVOdkGSANcCq
jdKTnCtsgcFI
iVesbktRee
KNei
cyFVLLea
OxAIAGx
BZQCgajHLfu

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

2014-12-21 13:53| 发布者: pcBeta| 查看: 15074| 评论: 12|原作者: 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版块(https://bbs.pcbeta.com/forum-548-1.html

28

路过

雷人

握手
9

鲜花

鸡蛋

刚表态过的朋友 (37 人)

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