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

Поиск:

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


Бывалый
*


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

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



Здравствуйте, подскажите, пожалуйста!

Есть перехваченная функция ReadFile. Файл, который считывает эта функция спроецирован в память, как заполнить буфер LPVOID lpBuffer с учетом смещения LPOVERLAPPED lpOverlapped ?

Если можно пример, но и теория не помешает. Проекция, перехват все сделал, только само заполнение со смещением из проекции нужно...
PM MAIL   Вверх
xvr
Дата 4.4.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

LPOVERLAPPER ovl;
LPVOID lpBuffer;
DWORD Size;
LPDWORD ResuiltSize;

char* image_buffer;
__int64 image_size;

__int64 shift = __int64(ovl->Pointer);
if (shift+Size>image_size) Size=image_size-shift;
// check for Size<0 too
memcpy(lpBuffer,image_buffer+shift,Size);
if (ResultSize) *ResuiltSize=Size;



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


Бывалый
*


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

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



Цитата(xvr @ 4.4.2012,  13:01)
Код

LPOVERLAPPER ovl;
LPVOID lpBuffer;
DWORD Size;
LPDWORD ResuiltSize;

char* image_buffer;
__int64 image_size;

__int64 shift = __int64(ovl->Pointer);
if (shift+Size>image_size) Size=image_size-shift;
// check for Size<0 too
memcpy(lpBuffer,image_buffer+shift,Size);
if (ResultSize) *ResuiltSize=Size;


Поясните, пожалуйста, 13 строчку...
PM MAIL   Вверх
xvr
Дата 4.4.2012, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(freezeman @  4.4.2012,  15:13 Найти цитируемый пост)
Поясните, пожалуйста, 13 строчку... 

У ReadFile есть параметр (я его обозвал тут ResuiltSize), через который он возвращает количество реально прочтенных байтов

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


Бывалый
*


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

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



Цитата(xvr @ 4.4.2012,  15:51)
Цитата(freezeman @  4.4.2012,  15:13 Найти цитируемый пост)
Поясните, пожалуйста, 13 строчку... 

У ReadFile есть параметр (я его обозвал тут ResuiltSize), через который он возвращает количество реально прочтенных байтов

Точно, точно...понял, спасибо огромное!!!!
PM MAIL   Вверх
freezeman
Дата 8.5.2012, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(xvr @ 4.4.2012,  13:01)
Код

LPOVERLAPPER ovl;
LPVOID lpBuffer;
DWORD Size;
LPDWORD ResuiltSize;

char* image_buffer;
__int64 image_size;

__int64 shift = __int64(ovl->Pointer);
if (shift+Size>image_size) Size=image_size-shift;
// check for Size<0 too
memcpy(lpBuffer,image_buffer+shift,Size);
if (ResultSize) *ResuiltSize=Size;


Попробовал использовать Ваш код в dll, ошибок не возвращает, но и не считывает файл в приложении...

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


Эксперт
****


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

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



Цитата(freezeman @  8.5.2012,  17:33 Найти цитируемый пост)
 но и не считывает файл в приложении...

А вы уверены, что файл открыт в Overlepped режиме? И что этот файл действительно файл?

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


Бывалый
*


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

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



Цитата(xvr @ 10.5.2012,  14:17)
Цитата(freezeman @  8.5.2012,  17:33 Найти цитируемый пост)
 но и не считывает файл в приложении...

А вы уверены, что файл открыт в Overlepped режиме? И что этот файл действительно файл?

overlapped == NULL, я проверил на условие и смещение shift установли в 0.

Да, уверен... я ему конкретный файл подсовываю, спроецированный ранее. 

Я никакое значение не возвращаю после заполнения, может быть в этом проблема?
Если предположить, что в целевом приложении после вызова ReadFile проверяется результат операции на true/false, а я ничего не возвращаю, то и ничего не грузится...
PM MAIL   Вверх
xvr
Дата 10.5.2012, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(freezeman @  10.5.2012,  14:46 Найти цитируемый пост)
overlapped == NULL, я проверил на условие и смещение shift установли в 0.

Это не правильно. Если Overlapped==NULL, то это обычный последовательный режим чтения, и читать нужно с текущей файловой позиции, которая после чтения должна увеличится на размер прочитанного

Цитата(freezeman @  10.5.2012,  14:46 Найти цитируемый пост)
Я никакое значение не возвращаю после заполнения, может быть в этом проблема?

Может. ReadFile возвращает признак ошибки. Если вы ничего не вернули, то в качестве результата будет использован мусор, что вполне может соотвествовать ошибке чтения

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


Бывалый
*


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

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



Цитата

Если Overlapped==NULL, то это обычный последовательный режим чтения, и читать нужно с текущей файловой позиции, которая после чтения должна увеличится на размер прочитанного

Я так и считываю, просто shift (смещение, насколько я понимаю) устанавливаю в 0, если Overlapped==NULL  и получается такого вида копирование: memcpy(lpBuffer, image_buffer+0, Size); Позиция должна измениться на размер прочитанного... это lpNumberOfBytesRead (число прочитанных байтов) нужно установить в количество прочитанных байт, я правильно понимаю?

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


Бывалый
*


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

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



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

Код то же, только после считывания добавил return true;

Блокнот загружает один и тот же файл в цикле каком-то( добавляя собержимое и файл загружается N раз....

Это сообщение отредактировал(а) freezeman - 10.5.2012, 17:49
PM MAIL   Вверх
GremlinProg
Дата 11.5.2012, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(freezeman @  10.5.2012,  19:46 Найти цитируемый пост)
В чем может быть загвоздка?

ну, загвоздка все в том же: на протяжении уже порядка 20 тем, ты не показываешь проблемного кода,
следовательно набор и качество твоих ошибок растет и крепнет от темы к теме  smile

Добавлено через 1 минуту и 56 секунд
к сожалению, в таком случае помочь тебе может только 
freezeman  smile 


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


Бывалый
*


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

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



Цитата(GremlinProg @ 11.5.2012,  07:22)

ну, загвоздка все в том же: на протяжении уже порядка 20 тем, ты не показываешь проблемного кода

Считываниеспроецированного файла проходит до бесконечности, т.е. считывание прошло успешно, потом опять начинает его же считывать и так далее....
Вот код ))
Код

static int (WINAPI * RealReadFile)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED) = ReadFile;

BOOL WINAPI MyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
{
            //----Проверить на наличие файла в проекции-Н-------------
            HANDLE hMapCachFile;
            hMapCachFile = OpenFileMapping(
                FILE_MAP_ALL_ACCESS,   
                FALSE,             
                Name); // имя проекции, созданной в другом приложении. ФАЙЛ ПОЛНОСТЬЮ СПРОЕЦИРОВАН, проекция открывается без ошибок!
            if (hMapCachFile != NULL)
            {
                char* image_buffer;
                image_buffer = (char *)MapViewOfFile(
                    hMapCachFile, 
                    FILE_MAP_ALL_ACCESS, 
                    0,
                    0,
                    0);

                //--ЗАПОЛНЕНИЕ БУФЕРА!!!-Н------------------
                __int64 image_size = strlen(image_buffer);
                __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;
                //--ЗАПОЛНЕНИЕ БУФЕРА!!!-К------------------
            }
            //----Проверить на наличие файла в проекции-К-------------
        }
               else
               RealReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
}


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


Эксперт
****


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

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



Цитата(freezeman @  10.5.2012,  16:38 Найти цитируемый пост)
Я так и считываю, просто shift (смещение, насколько я понимаю) устанавливаю в 0, если Overlapped==NULL

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

Цитата(freezeman @  10.5.2012,  16:38 Найти цитируемый пост)
Позиция должна измениться на размер прочитанного... это lpNumberOfBytesRead (число прочитанных байтов) нужно установить в количество прочитанных байт, я правильно понимаю?

Почти - не установить, а прибавить к своей переменной.

Цитата(freezeman @  10.5.2012,  17:46 Найти цитируемый пост)
Возвращаю значение в перехватившей функции, видит нужный файл, работает правильно, но файл, который я подсовываю (т.е. который спроецирован) как-бы зацикливается при его открытии.

Разумеется, ты же его каждый ReadFile с начала читаешь, а надо продолжать чтение с последней позиции и дальше.

Добавлено через 1 минуту и 14 секунд
Цитата(freezeman @  11.5.2012,  10:00 Найти цитируемый пост)
                __int64 image_size = strlen(image_buffer);

Ой! Для бинарного файла это в корне неверно.


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


Бывалый
*


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

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



Я немного поправил код и выяснил, что при перехвате функции ReadFile выполнится мой код, я заполняю буфер, 
а потом ВЫЗЫВАЕТСЯ ПЕРВОНАЧАЛЬНАЯ ФУНКЦИЯ ReadFile, которую я и перехватывал, что происходить не должно!

Может я неправильно запускаю перехват?

Код:
Код

#include "stdafx.h"
#include <windows.h>
#include <detours.h>
#pragma comment (lib, "detours.lib")
...

static int (WINAPI * RealReadFile)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED) = ReadFile;

BOOL WINAPI MyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
{
        if (запрашиваемый файл спроецирован в память)
        {
                 // Выполняем заполнения буфера  
                 return true; // в случае успеха, иначе False
                 /* Если условие выполнится и код корректно отработает и вернет true, почему вызывается первоначальная функция REadFile, 
                 которую я перехватил и начинает отрабатывать так как планировала??!!(( */
         }
        else
         RealReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); // Вызываем оригинал функции
}

BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (dwReason == DLL_PROCESS_ATTACH) {
        // До перехвата можно использовать оригинальный адрес функции
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)RealReadFile, MyReadFile);
        DetourTransactionCommit();
    }
    else if (dwReason == DLL_PROCESS_DETACH) {
        // После перехвата - только тот, что нам дала функция DetourAttach
        // (иначе вызовем перехватчик, а не оригинал функции)
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)RealReadFile, MyReadFile);
        DetourTransactionCommit();
    }
    return TRUE;
}



Это сообщение отредактировал(а) freezeman - 11.5.2012, 16:54
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.4388 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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