Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2014, 11:51   #1
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию Мапирование dll в память

Задача такая: открыть dll файл(не мой) в обычном текстовом виде(каким его могут открыть обычные блокноты), найти нужную последовательность символов и заменить их.
Проблема: как сделать , так чтобы изменения происходили в файле ?
Код:
int _tmain(int argc, _TCHAR* argv[])
{
// Открываем объект ядра "файл"
HANDLE hFile = CreateFile("client2.dll", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// Создаем объект ядра "проекция файла"
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
// Проецируем в адресное пространство процесса объект "проекция файла"
char* pbFile =  (char*) MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
DWORD fileSize = GetFileSize(hFile, NULL);
string sFile;
for (int i = 0; i < fileSize; i++)
sFile +=pbFile[i] ;
//find_and_replace(sFile, "1134", "9999") ;
system("pause");
    return 0;
}
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 11:54   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А зачем мапировать? Считывай по N байт, производи поиск в считанном. Если нашел то получай координаты для замены становись в ту позицию в файл и заменяй через WriteFile(). Проекция файла тут... ну как по мне лишняя.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2014, 11:58   #3
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию

Ну так быстрее должно быть, просто файл не маленький
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 12:36   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Насколько не маленький если не секрет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2014, 12:38   #5
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию

20 мб. Может и не совсем большой, но считывается долго(
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 13:27   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

20mb ДЛЛка... Ниче так для библы как по мне... Это что за библиотека такая? Иконки?
Цитата:
но считывается долго(
А как ты считывал то что долго показалось?

Вот если в цикле считывать по мегабайту в массив в нем проводить поиск. И так 20 раз. Не так уж и проблемно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2014, 13:32   #7
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию

Да от игрушки одной. Хочу , что-то типо патча замутить. А то , что долго мне показалось тогда, когда я хотел на экран просто содержимое вывести через cout для проверки.
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 13:45   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ха! Так на экран 20мб выводить это конечно долго будет )))
Патчи же так не делают.
Не морочь голову считывай по пакетам и там ищи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2014, 13:46   #9
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию

А с помощью какой функции лучше считывать тогда ?
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 13:52   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Та в твоем случае можно не мутить с WinAPI вообще а использовать стандартные сишные fopen()\fread()\fwrite()\fclose()
Проще будет. ИМХО.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инструкция для сборки приложений на Qt в один exe без зависимостей от libstdc++-6.dll, libgcc_s_dw2-1.dll, Qt5Core.dll и т.д. 8Observer8 Qt и кроссплатформенное программирование С/С++ 12 25.06.2015 03:18
dll, классы и динамическая память Manya Visual C++ 3 15.05.2013 18:28
запись в память загружаемой dll BBBW Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 20.04.2012 00:24
dll в память и запустить =) xrob Общие вопросы Delphi 27 17.03.2012 09:31