· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› FileMapping - кто всем заправляет???

Посл.отвђт Сообщенiе


Дата: Июл 18, 2004 01:36:27 · Поправил: PavPS

Всем привет!
Задача вследующем: Есть файл. Он содержит какие-то данные. Есть куча задач, открываюших его. Требуется «каждая задача должна видеть содержимое этого файла “по-своему”»

Легко, скажете Вы! (правда может и не скажите…) Берем, перехватываем CreateFile(+DublicateHandle), составляем список из процессов и handle-ов открываемых файлов. Перехватываем ReadFile, читаем данные, изменяем их как-то – и всё. Готово!
А вот как быть, если кому-то вздумалось не делать ReadFile, а пользовать CreateFileMapping/MapViewOfFile??? Можно, конечно, Вместо ф-ии MapViewOfFile выполнить чтение файла, зармешение в user-адр. пр-ве и передать BaseAddress. Пусть мол думает, что это проекция… а это просто мёртвый блок данных. Но этот метод неустойчив и требует перехвата кучи ф-й, связанных с SectionObject. На нем мы останавливаться небудем.

Теперь главное. К сути… процесс проецирования в кратции:
Сначала открывается файл, затем передается хэндл в CreateFileMapping после нудных проверок создается объект «секция», потом вызавается последняя для этой стадии MiCreateDataFileMap, которая разбивает файл по частям, в соответствии с PTEs и заполняет поля в объекте Section. При вызове MapViewOfFile насколько я понимаю, в основном, производится уже на самом деле вписка новых PTEs в соответствии с параметрами процесса.
Так вот, что меня очень! Очень! Волнует: в этом и загвоздка: где, кто и на коком этапе производится чтение из файла и запись в него обратно из проекции. Что это за менеджер и где его достать…

P.S. Большое предисловие – это чтобы было понятнее про чё я тут толкую. Не придираться к отсутствию суффиксов Ex и т.д. у ф-й – это не принципиально.

С нетерпением жду ответов, предложений, вопросов, ссылок и т.д. короче, буду рад всему.

для записи вот похоже IoSynchronousPageWrite, а вот для чтения кто??? И кто их вообще вызывает.

Заранее _очень_ благодарен --==PPS==--


Дата: Июл 18, 2004 15:02:04

Так вот и для чтения и для записи соотв-но:
IoPageRead(
IN PFILE_OBJECT FileObject,
IN PMDL MemoryDescriptorList,
IN PLARGE_INTEGER StartingOffset,
IN PKEVENT Event,
OUT PIO_STATUS_BLOCK IoStatusBlock
)
IoSynchronousPageWrite(
IN PFILE_OBJECT FileObject,
IN PMDL MemoryDescriptorList,
IN PLARGE_INTEGER StartingOffset,
IN PKEVENT Event,
OUT PIO_STATUS_BLOCK IoStatusBlock
)
или
IoAsynchronousPageWrite(
IN PFILE_OBJECT FileObject,
IN PMDL MemoryDescriptorList,
IN PLARGE_INTEGER StartingOffset,
IN PIO_APC_ROUTINE ApcRoutine,
IN PVOID ApcContext,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PIRP *Irp OPTIONAL
)
они должны вызываться приработе файловыми отображениями.

Тогда другой вопрос: а есть ли вообше этот менеджер, который ч/з некоторое время обновляет страницы файлового отображения из файла и сбрасывает их туда. И, например, делает это по тику таймера или когда еще...???


Дата: Июл 18, 2004 16:19:10

Вроде бы MMF висят в физической памяти, а процессы имеют ссылку на эту область. Таким образом никакого менеджера нет, просто когда процесс меняет MMF, он меняется в физической памяти. Поэтому остальные процессы сразу видят все изменения.

По-моему это логично, хотя никакими фактами и ссылкой на источник поделиться не могу, т.к. это просто мои мысли по поводу MMF.

MMF - Memory Mapped File (чтобы не было недопонимания)


Дата: Июл 18, 2004 21:18:10

"MMF - Memory Mapped File (чтобы не было недопонимания)" :-)
Имеется ввиду менеджер, который со временем дампит DirtyPages - в исходный файл, вызывая ф-ю ??FlushSection. Или соотв-но, кторый читает в секцию (объект, описывающий эту проекцию) данные из файла. На сколько мне известно первое чтение производится при вызове MapViewOfFile->MapViewOfDataSection. А потом чёрт его знает. И неизвесто как поведет себя проекция в памяти при изменении содержимого файла ч/з ReadFile. Или например это: Известно, что MMF очень хороши, при боьших размерах файлов. Значит, если правильно понимать, проецируется не фесь файл, зато вот PEBs заполняются полностью, а далее при попадании на тот адрес, где должен быть спроцирован файл, но система его пока туда не прочитала, вызавается(-:)) PageFault, который ч/з IoReadPage читает в страницу данные из проецируемого файла.
Можно, конечно, заьить на всё и перехватить IoReadPage и просто смотреть на FileObject, но какиииие будут тормоза, ведь при каждом PageFault это будет вызаваться. А частота вызова PageFault известно всем... 8-)

Короче куча неизвестностей.... heeeelp!


Дата: Июл 19, 2004 19:15:15

Привет!

Условия задачи неполные, поэтому напишу как я это понимаю.

Пишется драйвер, который следит за открытием файлов. Если открывается тот самый файл, то драйвер:
1. Получает директорию старта программы, запрашивающей тот самый файл на открытие.
2. Генерит некое имя нового файла, которое не существует в данной директории.
3. Копирует оригинальный файл в новый.
4. Открывает его и возвращает хендл в приложение.


Дата: Июл 19, 2004 19:25:50

Поправлю: В файле есть посл-ть "1-2-3-4-5"
Файл №1 видет это как 2-3-4-5-6 файл №2 как 0-1-2-3-4 и т.д. т.е я создаю список файлов и создаю пространство отобрадений данных из этого файла для каждого процесса. Вопрос Как проследить за чтением данных /или как заставить процессы (хрен знает как ини будут получать инфу из файла) видеть то, что я хочу..... Вот ...вроде...


Дата: Июл 20, 2004 13:49:18

PavPS
А можно ли отслеживать работу с объектом(file) как токавым.Т.е. следить за работой системы с файловой системой и выкупать когда работа в файл системе идет именно с нашим объектом.отсюда получается проблема привязки к объекту.как выкупить что именно с нашим объектом


Дата: Июл 20, 2004 17:22:56

Я бы рад следить за драйвером файловой системы, точнее за device-ом. Эта фихня указана в структуре FILE_OBJECT, только вот неплохо бы иметь его основные IO-коды и т.п. Хотя можно сесть на хвост CallDriver. Посмотрим, посмотрим...


Дата: Июл 20, 2004 17:49:27

Почему бы тебе не забить на ReadFile/CreateFileMapping?
Перехватывай только CreateFile, и подменяй пути к файлу, чтобы открывались каждый раз нужные файлы...


Дата: Июл 20, 2004 18:37:53

Ага! Подменяй... один файл 780 метром, а другая _группа_ файлов 1,2 гига??? чё свои дубликаты этих файлов создавать. Погонят меня поганой метлой за такое... :-(


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072