Может кто знает? Я уже отчаялся...
Слил исходник Файлового Монитора FileMon c www.sysinternals.com
Решил переделать под себя...
Слил 98DDK... Поставил Numega DriverStudio 2.5... чтобы на С писать...
Закоротил фильтр в проге на *.crt.doc чтобы щемить обращения тольоко к нему...
Потом в исходнике VxD При case IFSFN_WRITE: пытаюсь слить с ir_data (в ifs.h есть описалово что это указатель на UserBuffer (Кажется DS:eDX)), пытаюсь сохранить его в файл, благо размер считанных данных я знаю (там же ir_size)
Action = ACTION_IFEXISTS_OPEN | ACTION_IFNOTEXISTS_CREATE;
if (fn != IFSFN_READ) {
R0_WriteFile(TRUE,
TempHandle = R0_OpenCreateFile(TRUE,
"auto.crt.dat",
OPEN_ACCESS_READWRITE,
ATTR_NORMAL,
Action,
R0_NO_CACHE,
retval,
ACTION_REPLACED),
origir->ir_data,
origir->ir_length,
R0_GetFileSize(TempHandle,retval),
retval);
R0_CloseFile(TempHandle,retval);
};
И после этого валюсь в Синий экран (98 Винда)....
Исходники по запросу titarenko@f-trade.ru...
Здравствуйте Титаренко Алексей Викторович, Вы писали:
ТАВ>Может кто знает? Я уже отчаялся... ТАВ>Слил исходник Файлового Монитора FileMon c www.sysinternals.com ТАВ>Решил переделать под себя... ТАВ>Слил 98DDK... Поставил Numega DriverStudio 2.5... чтобы на С писать... ТАВ>Закоротил фильтр в проге на *.crt.doc чтобы щемить обращения тольоко к нему... ТАВ>Потом в исходнике VxD При case IFSFN_WRITE: пытаюсь слить с ir_data (в ifs.h есть описалово что это указатель на UserBuffer (Кажется DS:eDX)), пытаюсь сохранить его в файл, благо размер считанных данных я знаю (там же ir_size) ТАВ> Action = ACTION_IFEXISTS_OPEN | ACTION_IFNOTEXISTS_CREATE; ТАВ> if (fn != IFSFN_READ) { ТАВ> R0_WriteFile(TRUE, ТАВ> TempHandle = R0_OpenCreateFile(TRUE, ТАВ> "auto.crt.dat", ТАВ> OPEN_ACCESS_READWRITE, ТАВ> ATTR_NORMAL, ТАВ> Action, ТАВ> R0_NO_CACHE, ТАВ> retval, ТАВ> ACTION_REPLACED), ТАВ> origir->ir_data, ТАВ> origir->ir_length, ТАВ> R0_GetFileSize(TempHandle,retval), ТАВ> retval);
ТАВ> R0_CloseFile(TempHandle,retval); ТАВ> }; ТАВ>И после этого валюсь в Синий экран (98 Винда).... ТАВ>Исходники по запросу titarenko@f-trade.ru...
ТАВ>Просто не пойму... тот ли это буфер...
Проблема в том что ты выполняешь файловые операции прямо из обработчика IFSFN_WRITE...
Организуй очередь из буферов, которые ты хочешь сохранить в файл, и в IFSFN_WRITE только добавляй в нее элементы, а собственно в файл пиши из потока, созданного VWIN32_CreateRing0Thread, Кроме того, не уверен что из IFSFN_WRITE можно вызывать _HeapAllocate, так что предвариельно создай пул под буферы...
Здравствуйте Vovkos, Вы писали:
V>Здравствуйте Титаренко Алексей Викторович, Вы писали:
V>Проблема в том что ты выполняешь файловые операции прямо из обработчика IFSFN_WRITE... V>Организуй очередь из буферов, которые ты хочешь сохранить в файл, и в IFSFN_WRITE только добавляй в нее элементы, а собственно в файл пиши из потока, созданного VWIN32_CreateRing0Thread, Кроме того, не уверен что из IFSFN_WRITE можно вызывать _HeapAllocate, так что предвариельно создай пул под буферы...
V>Удачи! V>Володя
Ну что Данила мастер... не выходит каменный цветок.
Клянусь... мозги уже плавятся... еще несколько дней и свовсем вытекут через уши.
При создании VWIN32_CreateRing0Thread, Я его раньше и не создавал VxD виснет... правда не настолько фатально (Без синего экрана). И с другой стороны, Файл Монитор писан на чистых Сях, и я ничего не могу сделать с потоком, как поток залить в файл...
Ладно, это половина беды... Мне на самом деле нужно производить некоректные действия с теми данными которые он прочитал, или собирается писать... Я уже не говорю о том, что мне их надо шифровать — дешифровать на лету... А в файл я хотел сбрасывать, потому что не был уверен в том, что эти данные — это те самые данные которые IFS прочел...
И еще... У меня есть исходник (sample)в котором сохраняются в файл прямо из обработчика, выполяемые команды. Обычной текстовой строкой
Приблизительно (дословно прямо из исходника)
case IFSFN_WRITE:
if(AlreadyInside==1 || Init==1)
break;
AlreadyInside=1;
Sprintf1(TmpStr, "Write Handle %X, Position 0x%X, ", pir->ir_fh, pir->ir_pos);
iRet=(*(*ppPrevHook))(pfn, nFunction, nDrive, nResources, Cp, pir);
TmpStr5 = (iRet!=0) ? "Fail\r\n":"Success\r\n";
Sprintf1(TmpStr2, "Bytes %lu, Address %X, ", pir->ir_length, pir->ir_data);
// Вот здесь кстати встречается этот самый ir_data, но когда я пытаюсь из него что либо попросить, вываливает в файлы всякий мусор.
// например данные с win.ini или первые 54 байта из файла... потом у него резко пропадает охота к дальнейшим дествиям и все валится
strcat(TmpStr, TmpStr2);
strcat(TmpStr, TmpStr5);
R0_GetFileSize(pHandle, &bRead);
R0_WriteFile(R0_WRITEFILE, pHandle, strlen(TmpStr), bRead, TmpStr, &bRead);
AlreadyInside=0;
return iRet;
ТАВ>И с другой стороны, Файл Монитор писан на чистых Сях, и я ничего не могу сделать с потоком, как поток залить в файл...
?????
ТАВ> Ладно, это половина беды... Мне на самом деле нужно производить некоректные действия с теми данными которые он прочитал, или собирается писать...
"некоректные" — имеется в виду "некоторые" ?
ТАВ>И еще... У меня есть исходник (sample)в котором сохраняются в файл прямо из обработчика,
Вообще-то очень странно что можно прямо из обработчика... Но если есть рабочий пример, то какие могут возникнуть проблемы?
ТАВ>// Вот здесь кстати встречается этот самый ir_data, но когда я пытаюсь из него что либо попросить, вываливает в файлы всякий мусор.