不能直接解析windows预读取文件(.pf),因其为未公开、已弃用的私有二进制格式,受权限限制且无官方api;应改用wmi、etw或psapi等官方支持接口获取启动行为数据。

Windows预读取文件(.pf)不是普通可读文件
直接用 fopen、std::ifstream 或 CreateFile 打开 .pf 文件会失败,或读出乱码——因为它是 Windows 内部二进制格式,未公开文档,且从 Windows Vista 起已弃用。它不面向开发者设计,也没有官方 API 供 C++ 程序解析。
.pf 文件的结构和权限限制
Windows 将 .pf 文件存放在 C:\Windows\Prefetch\ 下,所有文件默认只有 SYSTEM 和 Administrators 可读;普通用户进程即使路径正确,调用 CreateFile 也会返回 ERROR_ACCESS_DENIED。即使提权成功,其内容是压缩、加密(部分字段)、带校验和的私有结构,微软从未发布解析规范。
- 没有公开的头定义或结构体(如
PREFETCH_HEADER仅见于逆向分析,版本间不兼容) - Windows 10/11 默认禁用预读取,很多机器根本不存在 .pf 文件
- 试图用
memcpy解析原始字节极易崩溃或误判——字段偏移随系统版本、架构(x86/x64)、SP 补丁变化
替代方案:用 WMI 或 ETW 获取等效信息
如果你实际想监控“哪些程序被频繁加载”“启动耗时分布”或“磁盘 I/O 模式”,应放弃 .pf,改用 Windows 官方支持的接口:
- 通过 WMI 查询
Win32_PerfFormattedData_PerfOS_System或Win32_Process获取进程启动时间与页错误统计 - 用 ETW(Event Tracing for Windows)监听
Microsoft-Windows-Kernel-Process提供的ProcessCreate事件,实时捕获进程拉起行为 - 调用
QueryFullProcessImageName+GetProcessTimes组合估算冷启动开销,比解析 .pf 更可靠
示例片段(需管理员权限 + WMI 引用):
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
IWbemServices* pSvc = nullptr;
// ... 初始化 WMI 后执行查询
hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT Name, CreationDate FROM Win32_Process WHERE Name='chrome.exe'"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, nullptr, &pEnumerator);
真要硬读?只建议用于离线取证场景
极少数情况(如内存取证、恶意软件分析),你手上有完整系统镜像且确认目标为 Windows XP/7,可参考开源项目 prefetch-parser(Python)的逆向逻辑,但 C++ 实现需自行处理:
- 跳过前 4 字节签名("SCCA")后校验版本字段(
dwVersion必须是 17–30,否则结构不同) - 解析
dwNumFiles后紧跟的 Unicode 文件路径数组——注意路径是 offset+length 编码,非连续字符串 - 避免依赖
dwLastRunTime:该字段在 Windows 8+ 中已被清零或复用为其他标志位
即便如此,结果也仅作参考:微软明确表示 .pf 数据可能被截断、延迟写入或完全跳过,无法保证完整性。
真正稳定读取启动行为数据,必须绕过 .pf,走 WMI / ETW / PSAPI 这些受支持路径。试图用 C++ 直接解析 .pf,本质是在维护一个随时会失效的逆向黑盒。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










