用于对文件执行“系统压缩”CompactOS的Win32 API是什么?

问题描述

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

但是,获取和设置新型压缩状态的编程方式是什么?我尝试对文件使用旧的FSCTL_GET_COMPRESSION,但对于COMPRESSION_FORMAT_NONE,它始终给出0。

解决方法

好的,这是我在吉德拉(Ghidra)投掷compact.exe之后现在所拥有的。

除了FSCTL_GET_COMPRESSION / FSCTL_SET_COMPRESSIONDeviceIoControl之外,compact也称为FSCTL_GET_EXTERNAL_BACKINGFSCTL_SET_EXTERNAL_BACKING。该文档说明了压缩信息存储在FILE_PROVIDER_EXTERNAL_INFO_V1结构中,用于输入/输出。这些字段都有很好的记录。

我有点懒惰,无法立即向Ghidra添加适当的结构来验证此发现,但是我很确定这是方法。


compact.exe调用FSCTL的方式有点不合常规。尽管已记录了仅使用NT API的功能,但此处使用Win32 DeviceIoControl并可以正常使用。错误代码有点奇怪,包括未记录的内容,例如0x156和0x158。在我敢将它们与Win32句柄一起实际使用之前,我需要花一些时间向RtlNtStatusToDosError扔东西。

FWIW,在FUN_1400030e0(可以接受0x158和0x13d吗?)找到设置的调用,在FUN_140002074(0xea?)和FUN_1400040d找到get调用,在FUN_1400040dc找到删除调用。这是用于10.0.19041.1版的。