我写了一个' filemon'实用程序,它基本上记录了一段时间内打开的文件。现在我在我的' filemon'中确切地说明了这两个功能。效用
set<wstring> wstrSet;
// callback - get notified by callback filter driver on any file open operation
void CbFltOpenFileN(
CallbackFilter* Sender,
LPWSTR FileName,
ACCESS_MASK DesiredAccess,
WORD FileAttributes,
WORD ShareMode,
DWORD CreateOptions,
WORD CreateDisposition )
{
// don't log for directories
if (FileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
return;
}
wstring wstr = FileName;
wstr.append(L"\n");
//wstrSet.insert(wstr); // as soon as I un-comment this line I start getting BSOD in multiple execution of this utility
}
// Read all paths stored in the set and write them into the log file
void WritePathsToLog() {
typedef set<wstring>::const_iterator CI;
printf("\nNo. of files touched ===> %d\n\n", wstrSet.size());
for (CI iter = wstrSet.begin(); iter != wstrSet.end(); iter++) {
fputws((*iter).c_str(), logFile);
}
}
基本上,这段代码的作用是&#39; filemon&#39;实用程序与回调过滤器驱动程序交互,每当任何进程触摸文件时,驱动程序都会将相应的文件名报告给“文件”。实用程序通过CbFltOpenFileN函数。
现在的问题是这个&#39; filemon&#39;实用程序在win7 x64机器4GB机器上运行良好,但是一旦我取消注释CbFltOpenFileN函数中的最后一行即开始在集合中插入报告的文件名然后我开始获得BSOD主要使用BugCheck 0xCC,有时使用BugCheck 0x50,这基本上表明& #34;系统正在尝试访问已释放的内存&#34;
P.S。在带有8GB RAM的win7 x64上,无论CbFltOpenFileN函数中的最后一行是否被注释,我都没有看到任何问题。
目前,&#39; wstrSet&#39;使用默认分配器,所以在声明set wstrSet时我需要使用特定的分配器;如果有,有人可以告诉我如何&amp;为什么?
我很难在调试模式下重新调试此问题,因为我的模拟器负责启动/停止&#39; filemon&#39;实用程序,我需要多次运行它来重现问题。
希望这个增加的信息有帮助!!!
谢谢和问候, 萨钦
答案 0 :(得分:0)
如果CbFltOpenFileN
是回调函数,这是否意味着它具有异步调用?在这种情况下,您可能希望使用互斥锁保护全局变量(wstrSet
)