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

Поиск:

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


Эксперт
****


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

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



Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
BOOL WINAPI MyReadFile

Интересно, что возвращает эта функция.

Большая просьба к freezeman обращать внимания не только на ошибки компиляции, но и на предупреждения...

Добавлено @ 19:50
Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
а потом ВЫЗЫВАЕТСЯ ПЕРВОНАЧАЛЬНАЯ ФУНКЦИЯ ReadFile

Как Вы это определили?

Это сообщение отредактировал(а) feodorv - 11.5.2012, 19:50


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


Бывалый
*


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

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



Цитата

Интересно, что возвращает эта функция.

Я пробовал и VOID тип указывать... при BOOL возвращаю TRUE или FALSE в зависимости от результата заполнения...

Цитата

Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
а потом ВЫЗЫВАЕТСЯ ПЕРВОНАЧАЛЬНАЯ ФУНКЦИЯ ReadFile

Как Вы это определили?


Я считываю определенный файл, прежде спроецированный в память и возвращаю true... но если изменить файл на диске (т.е. спроецированный и на диске отличаются), то программа считывает файл на ЖД, хотя код заполнения буфера выполняется...

Код

__int64 image_size = ... // размер файла 
                __int64 shift;
                if (lpOverlapped != NULL)
                {
                    shift = __int64(lpOverlapped->Pointer);
                }
                else
                {
                    shift = 0;
                }
                if (shift+nNumberOfBytesToRead>image_size) 
                    nNumberOfBytesToRead=image_size-shift;
                memcpy(lpBuffer,image_buffer+shift,nNumberOfBytesToRead);
                if (lpNumberOfBytesRead) 
                    *lpNumberOfBytesRead+=nNumberOfBytesToRead;
                return true;

PM MAIL   Вверх
feodorv
Дата 11.5.2012, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
Я пробовал и VOID тип указывать...

Зачем? Вам ведь нужно всё указать так же как у оригинальной ReadFile. А там стоит однозначное BOOL smile 

Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
при BOOL возвращаю TRUE или FALSE в зависимости от результата заполнения...

Для своей обработки, да, возвращаете. А здесь:
Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
...
        else
         RealReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); // Вызываем оригинал функции
}

???

Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
Я считываю определенный файл, прежде спроецированный в память и возвращаю true... но если изменить файл на диске (т.е. спроецированный и на диске отличаются), то программа считывает файл на ЖД, хотя код заполнения буфера выполняется...

Так вывод сделать очень сложно, так как после внесения изменений в файл они скорее всего отразятся и на проекции файла (станут когерентными). Windows не гарантирует когерентности, но, тем не менее, скорее всего когерентность будет. Но тут я Вам сказать ничего определённого не смогу, так как с Detour не знаком...

Добавлено через 56 секунд
Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
                    shift = 0;

Всегда?


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


Бывалый
*


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

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



Цитата

Для своей обработки, да, возвращаете. А здесь:
Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
...
        else
         RealReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); // Вызываем оригинал функции
}

???

Здесь вызывается оригинальная функция, если файл, с которого происходит чтение, не найден в проекции.

Цитата

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

После изменение файла на диске, я в отдельном приложении проверяю проекцию, она не изменяется... Я сделал проекцию в памяти, т.е. сначала считал файл, а потом эти данные отразил в память с параметром CreateFileMapping(INVALID_HANDLE_VALUE, ... таким образом, к файлу на диске проекция не привязана...

Я когда изучал перехват, рассматривал примеры, читал документацию, я так понял, что функция перехватывается, т.е. заменяется оригинальная на мою, а не сначала моя функция ReadFile отрабатывает, потом оригинал.... Думаю здесь что-то не так в перехвате, не может перехват таким образом работать, это очень не полезно!!
PM MAIL   Вверх
freezeman
Дата 12.5.2012, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вынесу в отдельную тему сюда (( а то первоначально была о другом ...
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(freezeman @  12.5.2012,  08:49 Найти цитируемый пост)
Здесь вызывается оригинальная функция, если файл, с которого происходит чтение, не найден в проекции.

А где return значения, которое возвращается из оригинальной функции? Или всё равно, что она вернула? Тогда какое возвращаемое значение уйдёт пользователю из MyReadFile? Компилятор разве не вопит, что не все "control paths return a value"?


Так же важный вопрос:
Цитата(feodorv @  12.5.2012,  00:22 Найти цитируемый пост)
Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
                    shift = 0;

Всегда? 



Цитата(freezeman @  12.5.2012,  08:49 Найти цитируемый пост)
к файлу на диске проекция не привязана...

Что ж... Тут я не советчик...


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


Бывалый
*


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

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



Цитата

А где return значения, которое возвращается из оригинальной функции? Или всё равно, что она вернула? Тогда какое возвращаемое значение уйдёт пользователю из MyReadFile? Компилятор разве не вопит, что не все "control paths return a value"?

Не вопит, я проверял и так: return RealReadFile...

Цитата

shift = 0; 
Всегда?

Нет, если режим Overlapped, то получаем смещение.

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


Эксперт
****


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

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



Цитата(freezeman @  12.5.2012,  11:14 Найти цитируемый пост)
Не вопит, я проверял и так: return RealReadFile...

Странный, однако, у Вас компилятор. Обязательно нужно return RealReadFile...


Цитата(freezeman @  12.5.2012,  11:14 Найти цитируемый пост)
если режим Overlapped, то получаем смещение. 

А если не Overlapped, то смещение всегда 0???


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


Бывалый
*


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

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



Цитата

Странный, однако, у Вас компилятор. Обязательно нужно return RealReadFile...

да, это правильно.

Цитата

А если не Overlapped, то смещение всегда 0???

Ну я думаю, что да. Неправильно?

По поводу перехвата ReadFile... Я выяснил, что считывание происходит через так называемую прослойку ntdll.dll, поэтому и перехват был некорректный...

Это сообщение отредактировал(а) freezeman - 12.5.2012, 14:27
PM MAIL   Вверх
xvr
Дата 12.5.2012, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(freezeman @  12.5.2012,  14:27 Найти цитируемый пост)
Ну я думаю, что да. Неправильно?

Разумеется неправильно, о чем я вам уже неоднократно писал  smile 
PM MAIL   Вверх
freezeman
Дата 12.5.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(xvr @ 12.5.2012,  16:04)
Цитата(freezeman @  12.5.2012,  14:27 Найти цитируемый пост)
Ну я думаю, что да. Неправильно?

Разумеется неправильно, о чем я вам уже неоднократно писал  smile

Ахха)) Значит я неправильно понял))
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(freezeman @  12.5.2012,  15:27 Найти цитируемый пост)
Неправильно?

Неправильно. Нужно узнать смещение из описателя файла (пользуясь функцией SetFilePointer) smile 

Цитата(freezeman @  12.5.2012,  15:27 Найти цитируемый пост)
поэтому и перехват был некорректный...

Удалось исправить?


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


Бывалый
*


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

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



Цитата

Удалось исправить?

Нет, но я знаю как... пока времени нет на исправление

Цитата

Неправильно. Нужно узнать смещение из описателя файла (пользуясь функцией SetFilePointer)

Спасибо, попробую...
Нужно узнать смещение и исходя из него считывать (позиция будет в мой shift записана), так?
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Конечно. Аналогично Overlapped, только придётся повозиться, чтобы узнать смещение...

Цитата(freezeman @  12.5.2012,  17:25 Найти цитируемый пост)
но я знаю как...

Когда исправишь, напиши, что и как исправил, ладно?


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


Бывалый
*


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

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



Цитата

Когда исправишь, напиши, что и как исправил, ладно?

Ок, обязательно. 

Спасибо за помощь.
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.0914 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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