winapi - 对文件进行“系统压缩”(CompactOS)的 Win32 API 是什么?
问题描述
除了 NTFS 上的沼泽标准 LZNT1 压缩之外,Windows 10 还具有一种称为系统压缩的新压缩形式。这种压缩模式针对只读文件(即可执行文件)进行了“优化”。它用于 Compact OS 功能,但也可以通过compact.exe /EXE
.
但是获取和设置新型压缩状态的编程方式是什么?我在文件上尝试了旧FSCTL_GET_COMPRESSION
的,但它总是为COMPRESSION_FORMAT_NONE
.
解决方案
好的,这就是我现在所拥有的,在投掷compact.exe
Ghidra 之后。
除了FSCTL_GET_COMPRESSION
/FSCTL_SET_COMPRESSION
对DeviceIoControl
,compact
还调用FSCTL_GET_EXTERNAL_BACKING
和FSCTL_SET_EXTERNAL_BACKING
。该文档解释了压缩信息存储在FILE_PROVIDER_EXTERNAL_INFO_V1
输入/输出结构中。这些字段有很好的记录。
我现在有点懒得向 Ghidra 添加适当的结构来验证这一发现,但我很确定这就是方法。
有点不正统的是compact.exe
调用 FSCTL 的方式。虽然这些函数被记录为仅使用 NT API,但DeviceIoControl
这里使用的是 Win32 并且工作正常。错误代码有点奇怪,包括 0x156 和 0x158 等未记录的内容。RtlNtStatusToDosError
在我敢于将它们与 Win32 句柄一起实际使用之前,我需要找一些时间来扔东西。
FWIW,设置调用位于 FUN_1400030e0(0x158 和 0x13d 是否可以接受?),get 调用位于 FUN_140002074(0xea?)和 FUN_1400040d,删除调用位于 FUN_1400040dc。这适用于版本 10.0.19041.1。
推荐阅读
- python - 使用 ortools 添加有序约束的 N-Queens 问题
- python - 我收到一个 ValueError:“ValueError:标签数=16512 与样本数=16339 不匹配”
- firebase - Flutter + Firebase:如何遍历子集合?
- r - 使用 plot2docx 从 R 到 Word
- python - 使用 Python 接受用户输入以从 API 返回 JSON 条目
- json - 无法反序列化当前 JSON 对象,因为该类型需要 JSON 数组
- python - 在 Python 中将混合数转换为小数
- reactjs - 根据状态在 React 中创建受保护的路由
- docker - 如何修复:docker-compose.yml 无效、不支持配置和无效类型错误
- node.js - redirect_uri_mismatch: http://localhost:4500/AUTH/auth/google/callback,不匹配