虽然 Compact OS 是一个相当好用的功能,典型情况下可以让你的系统分区节省出 30% 的空间。 但是并不是所有文件都能采用 Compact OS 进行压缩,于是需要排除掉不能使用 Compact OS 压缩的文件。
我从 Windows 10 中提取出了 Compact OS 默认的排除列表,希望能帮助需要开发基于 Compact OS 的第三方应用的朋友。 由于 Windows 下使用 Compact OS 的途径主要是 DISM 和 compact 工具,于是本文贴出这两个工具使用的排除列表。 顺便也贴出 NSudo 9.0 开始附带的毛利优化插件的排除列表。
DISM 工具使用的排除列表 DISM 通过 Windows Imaging Library (wimgapi.dll) 来实现在映像展开过程中对文件进行 Compact OS 压缩, 其采用的排除列表和 WIMBoot 一致,排除列表保存在 WimBootCompress.ini
中,一般情况下内容如下。
DISM 用的这套排除列表比较精细,但是自己实现起来比较麻烦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ; This is the inbox configuration file used for deploying or capture a ; WIMBoot system. Please do not remove this file because WIMCaptureImage ; and WIMApplyImage will fail if WIM_FLAG_WIM_BOOT flag is specified. [CompressionExclusionList] ntoskrnl.exe [PrepopulateList] bootstat.dat *winload.* *winresume.* wof.sys \Windows\System32\Config\SYSTEM \Windows\System32\PlatformManifest\* [ExclusionList] \$bootdrive$ \$dwnlvldrive$ \$lsdrive$ \$installdrive$ \$Recycle.Bin\* \bootsect.bak \hiberfil.sys \pagefile.sys \ProgramData\Microsoft\Windows\SQM \System Volume Information \Users\*\AppData\Local\GDIPFONTCACHEV1.DAT \Users\*\NTUSER.DAT*.TM.blf \Users\*\NTUSER.DAT*.regtrans-ms \Users\*\NTUSER.DAT*.log* \Windows\AppCompat\Programs\Amcache.hve*.TM.blf \Windows\AppCompat\Programs\Amcache.hve*.regtrans-ms \Windows\AppCompat\Programs\Amcache.hve*.log* \Windows\CSC \Windows\Debug\* \Windows\Logs\* \Windows\Panther\*.etl \Windows\Panther\*.log \Windows\Panther\FastCleanup \Windows\Panther\img \Windows\Panther\Licenses \Windows\Panther\MigLog*.xml \Windows\Panther\Resources \Windows\Panther\Rollback \Windows\Panther\Setup* \Windows\Panther\UnattendGC \Windows\Panther\upgradematrix \Windows\Prefetch\* \Windows\ServiceProfiles\LocalService\NTUSER.DAT*.TM.blf \Windows\ServiceProfiles\LocalService\NTUSER.DAT*.regtrans-ms \Windows\ServiceProfiles\LocalService\NTUSER.DAT*.log* \Windows\ServiceProfiles\NetworkService\NTUSER.DAT*.TM.blf \Windows\ServiceProfiles\NetworkService\NTUSER.DAT*.regtrans-ms \Windows\ServiceProfiles\NetworkService\NTUSER.DAT*.log* \Windows\System32\config\RegBack\* \Windows\System32\config\*.TM.blf \Windows\System32\config\*.regtrans-ms \Windows\System32\config\*.log* \Windows\System32\SMI\Store\Machine\SCHEMA.DAT*.TM.blf \Windows\System32\SMI\Store\Machine\SCHEMA.DAT*.regtrans-ms \Windows\System32\SMI\Store\Machine\SCHEMA.DAT*.log* \Windows\System32\sysprep\Panther \Windows\System32\winevt\Logs\* \Windows\System32\winevt\TraceFormat\* \Windows\Temp\* \Windows\TSSysprep.log \Windows\winsxs\poqexec.log \Windows\winsxs\ManifestCache\* \Windows\servicing\Sessions\*_*.xml \Windows\servicing\Sessions\Sessions.back.xml [PinningFolderList] \Windows\System32\config \Windows\System32\DriverStore \Windows\WinSxS [CompressionFolderList] \Windows\System32\WinEvt\Logs \Windows\Installer
compact 工具使用的排除列表 系统自带的 compact 工具直接使用 DeviceIoControl
API 进行 Compact OS 压缩,比 DISM 更加底层。 于是其排除列表是内置的,通过 IDA Pro 工具从 compact 工具提取出来的列表如下。
当然 compact 工具的做法比较暴力,只要判断路径中有列表中的关键字就跳过,但是自己实现起来比较简单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 wchar_t * FileExclusionList [] = { L "\\ aow.wim" , L "\\ boot\\ bcd" , L "\\ boot\\ bcd.log" , L "\\ boot\\ bootstat.dat" , L "\\ config\\ drivers" , L "\\ config\\ drivers.log" , L "\\ config\\ system" , L "\\ config\\ system.log" , L "\\ windows\\ bootstat.dat" , L "\\ winload.efi" , L "\\ winload.efi.mui" , L "\\ winload.exe" , L "\\ winload.exe.mui" , L "\\ winresume.efi" , L "\\ winresume.efi.mui" , L "\\ winresume.exe" , L "\\ winresume.exe.mui" }; wchar_t * DirectoryExclusionList [] = { L "\\ Backup\\ " , L "\\ ManifestCache\\ " , L "\\ Manifests\\ " };
当然上述内容在 GPT 分区表的 Windows 映像实例中没有问题,对于 MBR 分区表的 Windows,Compact OS 还会执行 NTFS 压缩也使用的的排除逻辑,即排除掉 ntldr
, cmldr
和 BootMgr
三个文件。
毛利优化插件的排除列表 毛利优化插件使用 PathMatchSpecExW
API 判断文件是否在排除列表内,逻辑如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 if (S_OK == ::PathMatchSpecExW ( CurrentPath .c_str(), L "*\\ WinSxS\\ Backup;" L "*\\ WinSxS\\ ManifestCache;" L "*\\ WinSxS\\ Manifests;" L "*\\ ntldr;" L "*\\ cmldr;" L "*\\ BootMgr;" L "*\\ aow.wim;" L "*\\ boot\\ bcd;" L "*\\ boot\\ bcd.*;" L "*\\ boot\\ bootstat.dat;" L "*\\ config\\ drivers;" L "*\\ config\\ drivers.*;" L "*\\ config\\ system;" L "*\\ config\\ system.*;" L "*\\ windows\\ bootstat.dat;" L "*\\ winload.e??*;" L "*\\ winresume.e??*;" , PMSF_MULTIPLE )) { return TRUE ; }
参考文献 相关内容