![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Здравствуйте, подскажите, пожалуйста!
Есть перехваченная функция ReadFile. Файл, который считывает эта функция спроецирован в память, как заполнить буфер LPVOID lpBuffer с учетом смещения LPOVERLAPPED lpOverlapped ? Если можно пример, но и теория не помешает. Проекция, перехват все сделал, только само заполнение со смещением из проекции нужно... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
|
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Поясните, пожалуйста, 13 строчку... |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
||||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Попробовал использовать Ваш код в dll, ошибок не возвращает, но и не считывает файл в приложении... Это сообщение отредактировал(а) freezeman - 8.5.2012, 18:06 |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
overlapped == NULL, я проверил на условие и смещение shift установли в 0. Да, уверен... я ему конкретный файл подсовываю, спроецированный ранее. Я никакое значение не возвращаю после заполнения, может быть в этом проблема? Если предположить, что в целевом приложении после вызова ReadFile проверяется результат операции на true/false, а я ничего не возвращаю, то и ничего не грузится... |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Это не правильно. Если Overlapped==NULL, то это обычный последовательный режим чтения, и читать нужно с текущей файловой позиции, которая после чтения должна увеличится на размер прочитанного
Может. ReadFile возвращает признак ошибки. Если вы ничего не вернули, то в качестве результата будет использован мусор, что вполне может соотвествовать ошибке чтения |
||||
|
|||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Я так и считываю, просто shift (смещение, насколько я понимаю) устанавливаю в 0, если Overlapped==NULL и получается такого вида копирование: memcpy(lpBuffer, image_buffer+0, Size); Позиция должна измениться на размер прочитанного... это lpNumberOfBytesRead (число прочитанных байтов) нужно установить в количество прочитанных байт, я правильно понимаю? |
|||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Возвращаю значение в перехватившей функции, видит нужный файл, работает правильно, но файл, который я подсовываю (т.е. который спроецирован) как-бы зацикливается при его открытии.
В чем может быть загвоздка? Код то же, только после считывания добавил return true; Блокнот загружает один и тот же файл в цикле каком-то( добавляя собержимое и файл загружается N раз.... Это сообщение отредактировал(а) freezeman - 10.5.2012, 17:49 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну, загвоздка все в том же: на протяжении уже порядка 20 тем, ты не показываешь проблемного кода, следовательно набор и качество твоих ошибок растет и крепнет от темы к теме Добавлено через 1 минуту и 56 секунд к сожалению, в таком случае помочь тебе может только freezeman -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Считываниеспроецированного файла проходит до бесконечности, т.е. считывание прошло успешно, потом опять начинает его же считывать и так далее.... Вот код ))
Это сообщение отредактировал(а) freezeman - 11.5.2012, 10:00 |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Неправильно. При открытии в пользовательской программе такого файла надо завести у себя переменную - позицию в файле. И использовать именно ее в качестве shift при чтении. Почти - не установить, а прибавить к своей переменной. Разумеется, ты же его каждый ReadFile с начала читаешь, а надо продолжать чтение с последней позиции и дальше. Добавлено через 1 минуту и 14 секунд Ой! Для бинарного файла это в корне неверно. Это сообщение отредактировал(а) xvr - 11.5.2012, 11:04 |
|||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Я немного поправил код и выяснил, что при перехвате функции ReadFile выполнится мой код, я заполняю буфер,
а потом ВЫЗЫВАЕТСЯ ПЕРВОНАЧАЛЬНАЯ ФУНКЦИЯ ReadFile, которую я и перехватывал, что происходить не должно! Может я неправильно запускаю перехват? Код:
Это сообщение отредактировал(а) freezeman - 11.5.2012, 16:54 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Интересно, что возвращает эта функция. Большая просьба к freezeman обращать внимания не только на ошибки компиляции, но и на предупреждения... Добавлено @ 19:50 Как Вы это определили? Это сообщение отредактировал(а) feodorv - 11.5.2012, 19:50 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| freezeman |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Я пробовал и VOID тип указывать... при BOOL возвращаю TRUE или FALSE в зависимости от результата заполнения...
Я считываю определенный файл, прежде спроецированный в память и возвращаю true... но если изменить файл на диске (т.е. спроецированный и на диске отличаются), то программа считывает файл на ЖД, хотя код заполнения буфера выполняется...
|
||||||
|
|||||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Зачем? Вам ведь нужно всё указать так же как у оригинальной ReadFile. А там стоит однозначное BOOL
Для своей обработки, да, возвращаете. А здесь:
??? Так вывод сделать очень сложно, так как после внесения изменений в файл они скорее всего отразятся и на проекции файла (станут когерентными). Windows не гарантирует когерентности, но, тем не менее, скорее всего когерентность будет. Но тут я Вам сказать ничего определённого не смогу, так как с Detour не знаком... Добавлено через 56 секунд Всегда? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Здесь вызывается оригинальная функция, если файл, с которого происходит чтение, не найден в проекции.
После изменение файла на диске, я в отдельном приложении проверяю проекцию, она не изменяется... Я сделал проекцию в памяти, т.е. сначала считал файл, а потом эти данные отразил в память с параметром CreateFileMapping(INVALID_HANDLE_VALUE, ... таким образом, к файлу на диске проекция не привязана... Я когда изучал перехват, рассматривал примеры, читал документацию, я так понял, что функция перехватывается, т.е. заменяется оригинальная на мою, а не сначала моя функция ReadFile отрабатывает, потом оригинал.... Думаю здесь что-то не так в перехвате, не может перехват таким образом работать, это очень не полезно!! |
|||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Вынесу в отдельную тему сюда (( а то первоначально была о другом ...
|
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
А где return значения, которое возвращается из оригинальной функции? Или всё равно, что она вернула? Тогда какое возвращаемое значение уйдёт пользователю из MyReadFile? Компилятор разве не вопит, что не все "control paths return a value"? Так же важный вопрос:
Что ж... Тут я не советчик... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Не вопит, я проверял и так: return RealReadFile...
Нет, если режим Overlapped, то получаем смещение. Это сообщение отредактировал(а) freezeman - 12.5.2012, 11:03 |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Странный, однако, у Вас компилятор. Обязательно нужно return RealReadFile... А если не Overlapped, то смещение всегда 0??? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
да, это правильно.
Ну я думаю, что да. Неправильно? По поводу перехвата ReadFile... Я выяснил, что считывание происходит через так называемую прослойку ntdll.dll, поэтому и перехват был некорректный... Это сообщение отредактировал(а) freezeman - 12.5.2012, 14:27 |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
||||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Неправильно. Нужно узнать смещение из описателя файла (пользуясь функцией SetFilePointer) Удалось исправить? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Нет, но я знаю как... пока времени нет на исправление
Спасибо, попробую... Нужно узнать смещение и исходя из него считывать (позиция будет в мой shift записана), так? |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Конечно. Аналогично Overlapped, только придётся повозиться, чтобы узнать смещение... Когда исправишь, напиши, что и как исправил, ладно? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Ок, обязательно. Спасибо за помощь. |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
сильно сомневаюсь, что это правильный путь, т.к. в теории, такая проекция файла может кешировать данные между потоками и процессами, ну раз эмулируется повторное открытие файла - точно, ситуация может сложиться такая, что в нескольких нитях один и тот же файл будет читаться параллельно а указатель на позицию в файле - один, рядом с проекцией ( т.е. дескриптор файла открыт один ), следовательно этот указатель будет хаотично меняться: "лебедь, рак и щука" следует для каждой нити использовать уникальный файловый указатель (переменную) и на него опираться при расчете смещения в проекции для операции чтения, так что поддержу скорее xvr p.s.: пока это не будет реализовано, даже гадать не буду что там и как долго, в какой последовательности считывается -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Получить значение shift с помощью SetFilePointer и затем прибавить к lpNumberOfBytesRead? Так заработет? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
нет, не заработает надо на всякий CreateFile создавать уникальный ресурс, который будет хранить файловый указатель (изначально инициируемый в 0) и указатель на проекцию этого файла а при всяком чтении - обращаться к этому ресурсу, определяя, какая для него текущая позиция, SetFilePointer тут вообще не пригодится, по моему -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Должно быть, я чего-то не понимаю Проекция файла по идее должна кешировать данные между потоками и процессами, но сам файловый описатель не разделяется между процессами (даже при наследовании), а следовательно и файловый указатель. Указанная проблема, на мой взгляд, актуальна лишь в рамках одного процесса, и может быть устранена применением именованного мьютекса... Добавлено @ 10:53
Думаю, это значение потом нужно засунуть обратно в файловый описатель... Это сообщение отредактировал(а) feodorv - 14.5.2012, 10:53 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Скорее всего я что-то не допоминаю... У меня есть спроецированное содержимое файла, т.е. я сначала считал файл, а потом поместил считанные данные в проекцию.
При считывании не с ЖД, мне кажется, что если получить текущую файловую позицию, начиная с неё заполнить буфер, а потом сместить указатель должно заработать. Разве нет? (на мое видение решения проблемы повлиял xvr) |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
как-то не задумывался, если честно ) как и не особо задумывался над вопросом: "как же тогда MapViewOfFile считывает данные из файла, если не через тот же самый ReadFile?" по моему, если дескриптор отдан в CreateFileMapping то о файловой позиции в нем можно уже забыть, так или иначе, опираться на этот дескриптор для получения позиции бессмысленно
один процесс ничего не знает о проекции и о том, что файл, который он только что открыл, тут же вполне может открть другой процесс, так что мьютекс - конечно хорош, но о том что он нужен при проекции, готовые приложения еще не знают, и не должны знать, по большому счету задача должна быть прозрачной -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Это да. Но у меня такое впечатление, что мы говорим о разном. Если я правильно понял задачу, то freezeman хочет создать разделяемую между процессами именованную файловую проекцию в файле подкачки (то есть даже не связанную с конкретным файлом на диске), в которой будет находится этакая база данных избранных файлов вместе с их содержимым. Содержимое файлов будет грубо скопировано в эту память и никак не привязано к реальным файлам. Перехватываться detours'ом при этом будут запросы на чтение файла в пользовательском режиме (никак не в режиме ядра). А MapViewOfFile вместе с остальной механикой будет ссылаться на системные вызовы, не затрагивая вызов ReadFile с тем же описателем файла. Поэтому все манипуляции пользователя с файловой проекцией того файла, который обслуживается freezeman'ом, пройдут для него незамеченными (мимо изобретаемого им механизма). И никакого указателя... Добавлено через 1 минуту и 14 секунд
Мьютекс, конечно, имелся в виду, исключительно в ведении freezeman... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Имменно так)
Это не критично на данный момент, я знаю как обновлять проецированные данные, но пока нужно просто определиться как заполнять буфер. Чтобы при чтении из проекции загружались все требуемые данные. Это сообщение отредактировал(а) freezeman - 14.5.2012, 12:29 |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а зачем в таком случае вообще открывать файл? если все файлы уже в памяти, достаточно просто ресурса, который будет ссылаться на нужную проекцию и все, о файлах можно забыть,правда такое решение уже есть, это RAM-диск я в принципе смотрю по совокупности тем freezeman'а, он же изначально хотел кешировать именно вызовы на чтение данных, а не в целом - файлов выходит так -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Я собирал статистику по обращениям к файлам, затем кэшировал файлы исходя из этой статистики.
Можно подробнее? |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Видимо, задача стоИт написать всё самому. Detours - слишком слабое для этой цели средство, но оно доступно, писать соответствующие драйверы не нужно, поэтому и CreateFile, ReadFile и так по порядку... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Это все слишком для моих целей... не успею по срокам, все почти готово, как-то работает, осталось заполнить этот буфер, чтобы чтение происходило) А потом уже все перепишу, если потребуется... |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Угу, но как говорится 'дьявол кроется в деталях' |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Вот спасибо, вы меня "обрадовали") |
||||
|
|||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Если получить файловую позицию, а после заполнения буфера сместить её с помощью lseek? Так должно работать если не учитывать все описанные детали?
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
А что, lseek уже с HANDLE работает? Если глаза на всё закрывать всё плотнее и плотнее, то да, сработает))) Смелее! -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |