Compact OS 的使用方法
本文归纳并总结 Compact OS 的用法,本文适用于对 Compact OS 感兴趣的用户和开发者。
支持的算法
算法 | 速度 | 效果(数据摘自Dism++设置对话框) | 备注 |
---|---|---|---|
XPRESS4K | 最快 | 大约节省33%的已用空间 | 默认压缩选项,与WIMBoot使用相同的算法 |
XPRESS8K | 大约节省36%的已用空间 | ||
XPRESS16K | 大约节省38%的已用空间 | ||
LZX | 最慢 | 大约节省44%的已用空间 | 效果最好,与WIM最大压缩使用相同的算法 |
命令行用法
- 使用 DISM 工具以 Compact OS 模式释放系统映像 (需要管理员权限)
DISM /Apply-Image /ImageFile:”WIM或ESD映像路径” /Index:”映像号” /ApplyDir:”展开位置,例如D:" /compact
- 使用 compact 工具查询当前 Windows 映像实例的 Compact OS 状态 (需要管理员权限)
compact /CompactOs:query
- 使用 compact 工具启用当前 Windows 映像实例的 Compact OS 模式 (需要管理员权限)
compact /CompactOs:always
- 使用 compact 工具禁用当前 Windows 映像实例的 Compact OS 模式 (需要管理员权限)
compact /CompactOs:never
- 使用 compact 工具以默认压缩算法对单个文件进行 Compact OS 模式压缩
compact /c /exe “文件路径”
- 使用 compact 工具以其他可用算法对单个文件进行 Compact OS 模式压缩
compact /c /exe:”算法名” “文件路径”
- 使用 compact 工具对单个以 Compact OS 模式压缩的文件解压缩
compact /u /exe “文件路径”
Win32 API 用法
虽然从 Windows 10 开始微软为开发者提供了文件名为 Wofutil.dll
的库用提供了对 WIMBoot 和 Compact OS 操作的简易包装。 但是笔者却不建议开发者使用该库,首先相对于本文接下来要介绍的基于 DeviceIoControl
的用法而言在用法上并没有明显简化。 而且 Compact OS 特性其实也是可以通过 Windows ADK 提供的 wofadk.sys
在 Windows 7 及之后的 Windows 操作系统中使用,而 Wofutil.dll
这个库只有 Windows 10 及之后的 Windows 版本才开始提供,如果你要写一个支持 Windows 旧版本的操作 Compact OS 的应用,你依然还得有 DeviceIoControl
API。
基于 DeviceIoControl
API 用法其实并不复杂,Windows Overlay Filter 驱动在用户模式下提供了以下 I/O 控制码。
- FSCTL_SET_EXTERNAL_BACKING 为特定文件添加 WIMBoot 或 Compact OS 属性
- FSCTL_GET_EXTERNAL_BACKING 获取特定文件的 WIMBoot 或 Compact OS 属性
- FSCTL_DELETE_EXTERNAL_BACKING 移除特定文件的 WIMBoot 或 Compact OS 属性
由于千言万语不如提供一个示例,于是我写了个简单的 C++ 示例以供参考。
1 |
|
移植到旧版 Windows
你并没听错,Compact OS 功能是可以移植到旧版 Windows 的,因为 Windows ADK 下提供了 wofadk.sys
以让用户可以在旧版 Windows 操作以 WIMBoot 和 Compact OS 模式压缩过的文件。
鉴于 DISM++ 和无忧启动论坛里的不少工具已经实现该特性且在旧版本 Windows 使用 Compact OS 也存在潜在的系统稳定性风险, 于是以负责任的角度,本文不提供将 Compact OS 移植到旧版 Windows 的方法,但是会提一些旧版 Windows 使用 Compact OS 的潜在的问题。
首先 wofadk.sys
最低支持的 Windows 版本为 Windows 7,所以你并不能在 Windows 7 之前的 Windows 版本譬如 Windows Vista 中使用 Compact OS。
其次 wofadk.sys
的实现存在问题,据 DISM++ 作者描述会在 Windows 7 和 Windows 8 下返回从 Windows 8.1 Update 1 才开始引入的结构体的内容,于是导致在 Windows 7 和 Windows 8 下启用 Compact OS 后系统会莫名其妙的出现蓝屏情况, 于是将 Compact OS 移植到 Windows 8.1 Update 1 开始的 Windows 8.1 版本是稳妥之选。
在旧版 Windows 下由于其他可能不支持 Compact OS 的应用可能并不会以正确的方式处理,于是在旧版本 Windows 下使用 Compact OS 还需要排除更多的文件。
参考文献
- 浅谈Windows10的CompactOS特性
- Compact OS
- compact.exe
- Wofapi.h
- FSCTL_SET_EXTERNAL_BACKING
- FSCTL_GET_EXTERNAL_BACKING
- FSCTL_DELETE_EXTERNAL_BACKING
相关内容
本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 协议 ,转载请注明出处!