Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заполнение буфера из спроецированного файла 
:(
    Опции темы
GremlinProg
Дата 14.5.2012, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  12.5.2012,  18:07 Найти цитируемый пост)
Неправильно. Нужно узнать смещение из описателя файла (пользуясь функцией SetFilePointer)  

Цитата(freezeman @  12.5.2012,  18:25 Найти цитируемый пост)
Нужно узнать смещение и исходя из него считывать (позиция будет в мой shift записана), так?

сильно сомневаюсь, что это правильный путь, т.к. в теории, такая проекция файла может кешировать данные между потоками и процессами,
ну раз эмулируется повторное открытие файла - точно, ситуация может сложиться такая, что в нескольких нитях один и тот же файл будет читаться параллельно

а указатель на позицию в файле - один, рядом с проекцией ( т.е. дескриптор файла открыт один ), следовательно этот указатель будет хаотично меняться: "лебедь, рак и щука"

следует для каждой нити использовать уникальный файловый указатель (переменную) и на него опираться при расчете смещения в проекции для операции чтения,
так что поддержу скорее xvr

p.s.: пока это не будет реализовано, даже гадать не буду что там и как долго, в какой последовательности считывается


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 14.5.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

При открытии в пользовательской программе такого файла надо завести у себя переменную - позицию в файле. И использовать именно ее в качестве shift при чтении. 

Получить значение shift с помощью SetFilePointer и затем прибавить к lpNumberOfBytesRead? Так заработет?
PM MAIL   Вверх
GremlinProg
Дата 14.5.2012, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(freezeman @  14.5.2012,  11:25 Найти цитируемый пост)
Получить значение shift с помощью SetFilePointer и затем прибавить к lpNumberOfBytesRead? Так заработет?

нет, не заработает

надо на всякий CreateFile создавать уникальный ресурс, который будет хранить файловый указатель (изначально инициируемый в 0) и указатель на проекцию этого файла

а при всяком чтении - обращаться к этому ресурсу, определяя, какая для него текущая позиция,
SetFilePointer тут вообще не пригодится, по моему


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 14.5.2012, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  14.5.2012,  09:29 Найти цитируемый пост)
сильно сомневаюсь, что это правильный путь, т.к. в теории, такая проекция файла может кешировать данные между потоками и процессами,
ну раз эмулируется повторное открытие файла - точно, ситуация может сложиться такая, что в нескольких нитях один и тот же файл будет читаться параллельно

Должно быть, я чего-то не понимаю  smile 
Проекция файла по идее должна кешировать данные между потоками и процессами, но сам файловый описатель не разделяется между процессами (даже при наследовании), а следовательно и файловый указатель. Указанная проблема, на мой взгляд, актуальна лишь в рамках одного процесса, и может быть устранена применением именованного мьютекса...

Добавлено @ 10:53
Цитата(freezeman @  14.5.2012,  10:25 Найти цитируемый пост)
Получить значение shift с помощью SetFilePointer и затем прибавить к lpNumberOfBytesRead?

Думаю, это значение потом нужно засунуть обратно в файловый описатель...

Это сообщение отредактировал(а) feodorv - 14.5.2012, 10:53


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 14.5.2012, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Скорее всего я что-то не допоминаю... У меня есть спроецированное содержимое файла, т.е. я сначала считал файл, а потом поместил считанные данные в проекцию.
При считывании не с ЖД, мне кажется, что если получить текущую файловую позицию, начиная с неё заполнить буфер, а потом сместить указатель должно заработать. Разве нет?
(на мое видение решения проблемы повлиял xvr)
PM MAIL   Вверх
GremlinProg
Дата 14.5.2012, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  14.5.2012,  12:50 Найти цитируемый пост)
но сам файловый описатель не разделяется между процессами (даже при наследовании), а следовательно и файловый указатель

как-то не задумывался, если честно )

как и не особо задумывался над вопросом: "как же тогда MapViewOfFile считывает данные из файла, если не через тот же самый ReadFile?"
по моему, если дескриптор отдан в CreateFileMapping то о файловой позиции в нем можно уже забыть,

так или иначе, опираться на этот дескриптор для получения позиции бессмысленно
Цитата(feodorv @  14.5.2012,  12:50 Найти цитируемый пост)
Указанная проблема, на мой взгляд, актуальна лишь в рамках одного процесса, и может быть устранена применением именованного мьютекса...

один процесс ничего не знает о проекции и о том, что файл, который он только что открыл, тут же вполне может открть другой процесс,
так что мьютекс - конечно хорош, но о том что он нужен при проекции, готовые приложения еще не знают, и не должны знать, по большому счету

задача должна быть прозрачной


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 14.5.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  14.5.2012,  12:57 Найти цитируемый пост)
как и не особо задумывался над вопросом: "как же тогда MapViewOfFile считывает данные из файла, если не через тот же самый ReadFile?"
по моему, если дескриптор отдан в CreateFileMapping то о файловой позиции в нем можно уже забыть,

Это да. Но у меня такое впечатление, что мы говорим о разном. smile 

Если я правильно понял задачу, то freezeman хочет создать разделяемую между процессами именованную файловую проекцию в файле подкачки (то есть даже не связанную с конкретным файлом на диске), в которой будет находится этакая база данных избранных файлов вместе с их содержимым. Содержимое файлов будет грубо скопировано в эту память и никак не привязано к реальным файлам.

Перехватываться detours'ом при этом будут запросы на чтение файла в пользовательском режиме (никак не в режиме ядра). А MapViewOfFile вместе с остальной механикой будет ссылаться на системные вызовы, не затрагивая вызов ReadFile с тем же описателем файла. Поэтому все манипуляции пользователя с файловой проекцией того файла, который обслуживается freezeman'ом, пройдут для него незамеченными (мимо изобретаемого им механизма). И никакого указателя...

Добавлено через 1 минуту и 14 секунд
Цитата(GremlinProg @  14.5.2012,  12:57 Найти цитируемый пост)
один процесс ничего не знает о проекции и о том, что файл, который он только что открыл, тут же вполне может открть другой процесс,
так что мьютекс - конечно хорош, но о том что он нужен при проекции, готовые приложения еще не знают, и не должны знать, по большому счету

Мьютекс, конечно, имелся в виду, исключительно в ведении freezeman...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 14.5.2012, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

Если я правильно понял задачу, то freezeman хочет создать разделяемую между процессами именованную файловую проекцию в файле подкачки (то есть даже не связанную с конкретным файлом на диске), в которой будет находится этакая база данных избранных файлов вместе с их содержимым. Содержимое файлов будет грубо скопировано в эту память и никак не привязано к реальным файлам.

Имменно так)

Цитата

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


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

Это сообщение отредактировал(а) freezeman - 14.5.2012, 12:29
PM MAIL   Вверх
GremlinProg
Дата 14.5.2012, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  14.5.2012,  14:23 Найти цитируемый пост)
Если я правильно понял задачу, то freezeman хочет создать разделяемую между процессами именованную файловую проекцию в файле подкачки (то есть даже не связанную с конкретным файлом на диске), в которой будет находится этакая база данных избранных файлов вместе с их содержимым. Содержимое файлов будет грубо скопировано в эту память и никак не привязано к реальным файлам.Перехватываться detours'ом при этом будут запросы на чтение файла в пользовательском режиме (никак не в режиме ядра). А MapViewOfFile вместе с остальной механикой будет ссылаться на системные вызовы, не затрагивая вызов ReadFile с тем же описателем файла. Поэтому все манипуляции пользователя с файловой проекцией того файла, который обслуживается freezeman'ом, пройдут для него незамеченными (мимо изобретаемого им механизма). И никакого указателя...

а зачем в таком случае вообще открывать файл?
если все файлы уже в памяти, достаточно просто ресурса, который будет ссылаться на нужную проекцию и все, о файлах можно забыть,правда такое решение уже есть, это RAM-диск

я в принципе смотрю по совокупности тем freezeman'а,
он же изначально хотел кешировать именно вызовы на чтение данных, а не в целом - файлов
Цитата(feodorv @  14.5.2012,  14:23 Найти цитируемый пост)
Это да. Но у меня такое впечатление, что мы говорим о разном.  

выходит так


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 14.5.2012, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

он же изначально хотел кешировать именно вызовы на чтение данных, а не в целом - файлов

Я собирал статистику по обращениям к файлам, затем кэшировал файлы исходя из этой статистики.

Цитата

если все файлы уже в памяти, достаточно просто ресурса, который будет ссылаться на нужную проекцию и все

Можно подробнее?
PM MAIL   Вверх
feodorv
Дата 14.5.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  14.5.2012,  13:34 Найти цитируемый пост)
а зачем в таком случае вообще открывать файл?
если все файлы уже в памяти, достаточно просто ресурса, который будет ссылаться на нужную проекцию и все, о файлах можно забыть,правда такое решение уже есть, это RAM-диск

Видимо, задача стоИт написать всё самому. Detours - слишком слабое для этой цели средство, но оно доступно, писать соответствующие драйверы не нужно, поэтому и CreateFile, ReadFile и так по порядку...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 14.5.2012, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(feodorv @ 14.5.2012,  13:01)
Цитата(GremlinProg @  14.5.2012,  13:34 Найти цитируемый пост)
а зачем в таком случае вообще открывать файл?
если все файлы уже в памяти, достаточно просто ресурса, который будет ссылаться на нужную проекцию и все, о файлах можно забыть,правда такое решение уже есть, это RAM-диск

Видимо, задача стоИт написать всё самому. Detours - слишком слабое для этой цели средство, но оно доступно, писать соответствующие драйверы не нужно, поэтому и CreateFile, ReadFile и так по порядку...

Это все слишком для моих целей... не успею по срокам, все почти готово, как-то работает, осталось заполнить этот буфер, чтобы чтение происходило) А потом уже все перепишу, если потребуется...
PM MAIL   Вверх
xvr
Дата 14.5.2012, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(freezeman @  14.5.2012,  11:02 Найти цитируемый пост)
При считывании не с ЖД, мне кажется, что если получить текущую файловую позицию, начиная с неё заполнить буфер, а потом сместить указатель должно заработать. Разве нет?

Угу, но как говорится 'дьявол кроется в деталях'  smile Все зависит от того, в какую программу вы это все внедряете. Если в совершенно произвольную, то вам придется самому проэмулировать всю работу с файлом. Для этого придется устроить у себя функциональную копию файлового дескриптора (вместе с позицией файла), затем перехватить все вызовы, которые могут работать с файловыми HANDLE'ами, и [возможно] отработать их самому. А это гораздо, нет ГОРАЗДО, нет ГОРАЗДО больше, чем простой перехват ReadFile  smile 

PM MAIL   Вверх
freezeman
Дата 14.5.2012, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 14.5.2012,  13:47)
Цитата(freezeman @  14.5.2012,  11:02 Найти цитируемый пост)
При считывании не с ЖД, мне кажется, что если получить текущую файловую позицию, начиная с неё заполнить буфер, а потом сместить указатель должно заработать. Разве нет?

Угу, но как говорится 'дьявол кроется в деталях'  smile Все зависит от того, в какую программу вы это все внедряете. Если в совершенно произвольную, то вам придется самому проэмулировать всю работу с файлом. Для этого придется устроить у себя функциональную копию файлового дескриптора (вместе с позицией файла), затем перехватить все вызовы, которые могут работать с файловыми HANDLE'ами, и [возможно] отработать их самому. А это гораздо, нет ГОРАЗДО, нет ГОРАЗДО больше, чем простой перехват ReadFile  smile

Вот спасибо, вы меня "обрадовали")
PM MAIL   Вверх
freezeman
Дата 14.5.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Если получить файловую позицию, а после заполнения буфера сместить её с помощью lseek? Так должно работать если не учитывать все описанные детали?

PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.