Я написал утилиту '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);
}
}
В основном, этот код делает то, что утилита 'filemon' взаимодействует с драйвером фильтра обратного вызова и всякий раз, когда файл затрагивается любым процессом, который сообщает драйверсоответствующее имя файла утилите 'filemon' через функцию CbFltOpenFileN.
Теперь проблема в том, что эта утилита 'filemon' работает нормально на машине 4GB 64-разрядной машины win7, но как только я раскомментирую последнюю строку в функции CbFltOpenFileNто есть начать вставлять указанное имя файла в набор, затем я начинаю получать BSOD в основном с BugCheck 0xCC, а иногда и с BugCheck 0x50, который в основном указывает, что «система пытается получить доступ к уже освобожденной памяти»
PS на win7 x64 с 8 ГБ ОЗУЯ не вижу никаких проблем, независимо от того, закомментирована ли последняя строка в функции CbFltOpenFileN.
В настоящее время 'wstrSet' использует распределитель по умолчанию, поэтому мне нужно использовать определенный распределитель при объявлении set wstrSet;если да, может кто-нибудь сказать мне, как и почему?
- Позвольте мне поделиться дополнительной информацией:
- Я использую VS2010
- Моя утилита - 32-разрядное приложение, предназначенное для платформы x86
- Драйвер фильтра файловой системы, который я использую, является драйвером фильтра callabck, предоставленным корпорацией Eldos.
- Теперь я тестирую эту утилиту с помощью симулятора, который генерирует много файлов и затем запускает утилиту 'filemon', затем она затрагивает все тефайлы и в конце останавливает утилиту filemon.Этот симулятор повторяет этот процесс 25 раз.
- Теперь для случая, когда закомментирована последняя строка, я получаю пустой файл журнала, созданный 25 раз, поскольку я ничего не вставляю в набор, но утилита filemon также не вызывает никакихBSOD
- Но для случая, когда последняя строка НЕ закомментирована, я получаю файл журнала, каждый раз создаваемый с путевыми путями, так как теперь я вставляю пути в набор, но затем во время первых нескольких итераций, скажем, 2-й, 3-й или 6-й, самаУтилита 'filemon' выполняет этот сценарий BSOD.
Мне сложно воспроизвести эту проблему в режиме отладки, так как мой симулятор заботится о запуске / остановке утилиты 'filemon'и мне нужно запустить его несколько раз, чтобы повторить проблему.
Надеюсь, эта добавленная информация поможет !!!
Спасибо и С уважением, Sachin