在文件上执行 "system compression" (CompactOS) 的 Win32 API 是什么?

What's the Win32 API for doing "system compression" (CompactOS) on files?

除了 NTFS 上的沼泽标准 LZNT1 压缩之外,Windows10 还有一种新的压缩形式,称为 system compression。这种压缩模式针对只读文件(即可执行文件)进行了“优化”。它用于 Compact OS 功能,尽管也可以通过 compact.exe /EXE.

手动调用它

但是获取和设置新型压缩状态的编程方式是什么?我在文件上尝试了旧的 FSCTL_GET_COMPRESSION,但它总是为 COMPRESSION_FORMAT_NONE 提供 0。

好的,这就是我在向 Ghidra 投掷 compact.exe 之后现在所拥有的。

除了 FSCTL_GET_COMPRESSION / FSCTL_SET_COMPRESSIONDeviceIoControl 之外,compact 还为 input/output 调用 FSCTL_GET_EXTERNAL_BACKING and FSCTL_SET_EXTERNAL_BACKING. The documentation explains the compression information is stored in the FILE_PROVIDER_EXTERNAL_INFO_V1 结构。这些字段都有很好的记录。

我现在有点懒得向 Ghidra 添加适当的结构来验证这一发现,但我很确定这是正确的方式。


compact.exe 调用 FSCTL 的方式有点不正统。尽管这些函数被记录为仅使用 NT API,但此处使用的是 Win32 DeviceIoControl 并且工作正常。错误代码有点奇怪,包括未记录的内容,如 0x156 和 0x158。在我敢于将它们与 Win32 句柄一起实际使用之前,我需要找些时间在 RtlNtStatusToDosError 处扔东西。

FWIW,set 调用位于 FUN_1400030e0(可以接受 0x158 和 0x13d?),get 调用位于 FUN_140002074(0xea?)和 FUN_1400040d,以及一个删除调用位于 FUN_1400040dc。这是版本 10.0.19041.1。