C++ Windows平台下如何跟踪进程对文件的创建、读写等操作
Windows平台C++实现带进程信息的文件操作监控方案
ReadDirectoryChanges确实只能捕获目录下的文件操作类型与目标文件路径,无法关联触发操作的进程信息,要实现需求,有两种成熟可行的实现方案:
方案1:Minifilter文件系统过滤驱动(生产环境首选)
- 是微软官方提供的内核层文件监控方案,可捕获全系统所有文件操作的完整上下文,包含发起操作的进程ID(PID)、操作类型(创建/读取/写入/删除/重命名等)、目标文件全路径、操作参数等所有需要的信息
- 用户态侧可用C++开发配套服务,通过过滤驱动的通信端口接收内核上报的事件,拿到PID后调用
OpenProcess、QueryFullProcessImageNameW等Win32 API即可获取进程的完整路径与名称 - 注意事项:驱动需要申请微软的代码签名证书才能在开启安全策略的Windows系统上正常加载,适合商业级项目使用
方案2:ETW(Windows事件追踪)用户态方案(轻量无驱动)
- 无需开发内核驱动,直接订阅Windows内置的
Microsoft-Windows-Kernel-FileETW事件源,该源上报的内核文件操作事件自带发起进程PID、操作类型、目标文件路径等信息 - C++中可通过
StartTrace、EnableTraceEx、ProcessTrace等API订阅并消费ETW事件,在事件回调中解析得到PID后,调用进程查询API即可获取进程名称 - 优点:实现复杂度低,不需要驱动签名,仅需管理员权限即可运行,适合个人项目或轻量场景使用
关键代码示例:根据PID获取进程路径
#include <windows.h> #include <string> std::wstring GetProcessFullPath(DWORD processId) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processId); if (hProcess == nullptr) { return L""; } WCHAR processPath[MAX_PATH] = {0}; DWORD pathSize = MAX_PATH; QueryFullProcessImageNameW(hProcess, 0, processPath, &pathSize); CloseHandle(hProcess); return processPath; }
注意两种方案都需要以管理员权限运行才能捕获全系统所有进程的文件操作,若仅需监控指定目录,可在事件回调中过滤目标路径降低性能损耗。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

