Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в коде работы с файлами 
:(
    Опции темы
АлексейX86
  Дата 17.5.2015, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток.
Лабораторная по системному программированию.
Даны в Windows два .exe файла (в коде fDonor и fAcceptor). Нужно кодовый сегмент(далее CS) fDonor вставить в конец CS fAcceptor, и получившийся сегмент правильно выравнять (т.е. добавить в конце нужное кол-во 0h). Пока не требуется, что бы fAcceptor после вставки запускался. Файл fDonor, это файл, который в данный момент запускается (т.е. файл сам себя открывает и вставляет куда надо свой CS, но пока вместо себя загружается другой файл).

Логика кода должна быть верной : скопировать CS из fDonor, скопировать все что в fAcceptor после конца его CS (эти данные в acLast), вставить в конец CS fAcceptor код из CS fDonor, вставить в fAcceptor его вторую часть (т.е. acLast).
Файл fAcceptor разбивается на две части, т.к. при записи в него идет перезапись уже существующих в нем данных. Конечно, этот алгоритм не очень хороший, но как записать в чистом С без перезапись - не нашел.
Но по факту код работает не верно. При комиляции и при запуске ошибок нету. Но работа неверная, т.к. в fAcceptor таки да, записывается CS fDonor,
но само содержимое fAcceptor становится другим.
Думаю, что проблемы с fread и/или fseek, с флагами открытия файлов.

Итак, мои вопросы :
1)где моя ошибка в коде
2)есть ли способ присать в файл на чистом С без перезаписи
Спасибо.
Код

#include <stdio.h>
#include <conio.h>

const int MY_CS_START  = 2;
const int MY_CS_SIZE   = 3;
const int MY_SEG_ALIGN = 0;

const int AC_CS_START  = 2;
const int AC_CS_SIZE   = 2;
const int AC_SEG_ALIGN = 0;

const char* pathMY = "C:\\Users\\Desktop\\SPPLast\\Работы\\fD.txt";
const char* pathAC = "C:\\Users\\Desktop\\SPPLast\\Работы\\fA.txt";
const char* erNFMY = "Error. File Donor not found or cannot be open.";
const char* erNFAC = "Error. File Acceptor not found or cannot be open.";

int main(){
FILE   *fDonor       = fopen(pathMY,"wb+");
FILE   *fAcceptor   = fopen(pathAC,"wb+");

if(fDonor != NULL){
if(fAcceptor != NULL){
        //Get CS of fDonor
    char* myCSData = (char*)malloc(sizeof(char)*MY_CS_SIZE+1);
    fseek(fDonor,MY_CS_START,SEEK_CUR);        
    fread(&myCSData,1,MY_CS_SIZE,fDonor);
    fclose(fDonor);

    //Get part of Acceptor with after its CS code
    fseek(fAcceptor,0L,SEEK_END);
    long  acLastSize  = ftell(fAcceptor);
    acLastSize -= (AC_CS_START+AC_CS_SIZE);
    char* acLast  = (char*)malloc(sizeof(char)*acLastSize+1);
    fseek(fAcceptor,AC_CS_START+AC_CS_SIZE,SEEK_CUR);
    fread(&acLast,1,acLastSize,fAcceptor);

    //Insert fDonor CS in fAcceptor
    fseek(fAcceptor,AC_CS_START+AC_CS_SIZE,SEEK_CUR);
    fwrite(&myCSData,1,MY_CS_SIZE,fAcceptor);
    
    //Insert last part (acLast) in fAcceptor
    fseek(fAcceptor,AC_CS_START+AC_CS_SIZE+MY_CS_SIZE,SEEK_CUR);
    fwrite(&acLast,1,acLastSize,fAcceptor);
    //End
    fclose(fAcceptor);
    printf(">Something is replaced.");
}else{
    printf(erNFAC,"%s");
}
}else{
    printf(erNFMY,"%s");
}
_getch();
return 0;
}

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


Эксперт
****


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

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



Цитата(АлексейX86 @  17.5.2015,  11:55 Найти цитируемый пост)
Лабораторная по системному программированию.

Лично у меня родились сомнения...


Цитата(АлексейX86 @  17.5.2015,  11:55 Найти цитируемый пост)
Файл fDonor, это файл, который в данный момент запускается (т.е. файл сам себя открывает и вставляет куда надо свой CS

Как-то у меня есть сомнения, что такая стратегия выполнима в Windows. У Вас DOS?


Цитата(АлексейX86 @  17.5.2015,  11:55 Найти цитируемый пост)
FILE   *fDonor       = fopen(pathMY,"wb+");
FILE   *fAcceptor   = fopen(pathAC,"wb+");

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


Да и проверок на неудачное выполнение того или иного вызова в коде нет. Остаётся неизвестным, что там реально происходит. Есть ли там чтение в нужном объёме (или оно даже завершается с ошибкой), происходит ли запись - неизвестно.


Цитата(АлексейX86 @  17.5.2015,  11:55 Найти цитируемый пост)
    printf(erNFAC,"%s");

Наверное, всё же, сначала форматная строка, потом аргумент:
Код

printf("%s\n",erNFAC);



А если начальный размер меньше, чем AC_CS_START+AC_CS_SIZE:
Цитата(АлексейX86 @  17.5.2015,  11:55 Найти цитируемый пост)
   acLastSize -= (AC_CS_START+AC_CS_SIZE);

Что будет???


Цитата(АлексейX86 @  17.5.2015,  11:55 Найти цитируемый пост)
   char* acLast  = (char*)malloc(sizeof(char)*acLastSize+1);

А если память не будет выделена (malloc вернёт NULL)? А зачем Вы всё время делаете "+1" в размере выделяемой памяти? А чему, по Вашему, равно sizeof(char)?


Вот в какую область памяти вы считываете данные из файла:
Цитата(АлексейX86 @  17.5.2015,  11:55 Найти цитируемый пост)
    
fread(&acLast,1,acLastSize,fAcceptor);

Вот из какой области памяти Вы сбрасываете данные в файл:
Цитата(АлексейX86 @  17.5.2015,  11:55 Найти цитируемый пост)
    fwrite(&acLast,1,acLastSize,fAcceptor);

???


Согласованность fseek/fread/fwrite дяже не смотрел...


Это сообщение отредактировал(а) feodorv - 17.5.2015, 23:54


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

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


 




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


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

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