在文件上执行 "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_COMPRESSION
对 DeviceIoControl
之外,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。
除了 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_COMPRESSION
对 DeviceIoControl
之外,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。