Поиск:

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


Шустрый
*


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

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



Здравствуйте. Подскажите пожалуйста как добавить файл в ресурсы (не компилируя предварительно в *.RES). Допустим , при запуске программа добавляет в свои ресурсы текстовый файл, а через некоторый промежуток времени извлекает его на диск. 
Подскажите как реализовать. Заранее спасибо. 
PM MAIL   Вверх
setty
Дата 29.6.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



зачем это может понадобится? 
PM MAIL   Вверх
denks
Дата 29.6.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Это будет проблематично, потому, что во время исполнения exe-файла он доступен для чтения, и записать он в себя ничего не может. 
PM   Вверх
denks
Дата 29.6.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мне подходит также такой вариант. Одна программа просто выполняет роль записи в файл носитель (который в свою очередь будет потом проводить необходимые действия- извлекать файлы на диск по мере необходимости). А носитель , в свою очередь , содержит функции извлечения ресурсов из себя.  
PM MAIL   Вверх
586
Дата 29.6.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



MSDN 
PM   Вверх
setty
Дата 30.6.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вопщемто можно писать в себя, если отметить секцию кода как writable.

однако что касается ресурсов, то недумаю  что это является тривиальной и легковыполнимой задачей...

что мешает тебе промапировать в память картинку, произвести нужные действия, сохранить при необходимости в файл и освободить файл? Зачем именно ресурсы? 
PM MAIL   Вверх
rsm
Дата 30.6.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(denks @  29.6.2006,  20:13 Найти цитируемый пост)
Мне подходит также такой вариант.

А это уже реальный вариант. См. пример из MSDN.
Тогда действие будет выглядеть примерно так:
- программа 1 обновляет ресурсы программы 2, записывая в них нужные данные;
- программа 2 при запуске извлекает из своих ресурсов данные и записывает их в файл;

Или другой, более сложный вариант:
- программа копирует себя в другой файл;
- программа добавляет к своей копии новую секцию и записывает туда нужные данные;
- программа удаляет себя;
- при запуске копии программы она извлекает данные из новой секции и пишет их в файл;

Второй вариант позволяет обойтись одной и той же программой, но требует знаний формата РЕ.
Иных способов решения задачи я лично не усматриваю, поскольку запись в работающий файл запрещена. 
PM MAIL   Вверх
denks
Дата 1.7.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решил попробовать на примере текста. Вот что получилось
Код

.386
.model flat, stdcall
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.data
resl db ".DATA",0
fileq db "c:\1.exe",0
dname db "test",0
hupdateres dd ?
.code
start:
invoke BeginUpdateResource,addr fileq,0
mov hupdateres,eax
invoke UpdateResource,addr hupdateres,addr resl,addr dname,0,offset dname,sizeof dname
invoke EndUpdateResource,hupdateres,0
invoke ExitProcess, 0
end start

Но в результате выполнения, происходит порча файла в которых записываем. Что я делаю не так ? Подскажите пожалуйста. Если можно с примерами, я начинающий в асме. 
Может быть дело в том что resl db ".DATA",0 . Тогда необходимо создать новую секцию и писать в неё. Подскажите пожалуйста. Спасибо. 

Это сообщение отредактировал(а) denks - 1.7.2006, 13:03
PM MAIL   Вверх
586
Дата 1.7.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



BOOL UpdateResource(
    HANDLE hUpdate,            // хендл обновляемого ресурса
    LPCTSTR lpType,              // тип ресурса
    LPCTSTR lpName,             // имя или индентификтор
    WORD wLanguage,          // язык
    LPVOID lpData,                // данные
    DWORD cbData                // размер данных
);

тип ресурса (ссылка) Ставь RT_RCDATA.
язык -- поставь 1049 или 1033
lpData -- адресс данных в памяти. Т. е. тебе придётся загрузить в память файл.
  

Это сообщение отредактировал(а) 586 - 1.7.2006, 16:58
PM   Вверх
586
Дата 1.7.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



http://slil.ru/22889139
Читай READ_ME.TXT 
PM   Вверх
rsm
Дата 1.7.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

;goto make

.386    
.model flat,stdcall    
option casemap:none    

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

.data    

    szTargetExe db 'notepad.exe',0
    szTargetFile db 'readme.txt',0
    hMod dd 0
    hFile dd 0
    hMem dd 0
    dwRW dd 0
    dwSize dd 0
    
.code
start:

    invoke CreateFile, ADDR szTargetFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0
    test eax,eax
    js _exit
    mov hFile,eax

    invoke GetFileSize, eax, 0
    mov dwSize,eax
    invoke LocalAlloc, LPTR, eax
    mov hMem,eax
    
    invoke ReadFile, hFile, hMem, dwSize, ADDR dwRW, 0
    invoke CloseHandle, hFile
    
    invoke BeginUpdateResource, ADDR szTargetExe, 0
    or eax,eax
    jz _free
    mov hMod,eax

    invoke UpdateResource, eax, RT_RCDATA, 7789h, 0, hMem, dwSize    
    invoke EndUpdateResource, hMod, 0

_free:
    invoke LocalFree, hMem

_exit:
    invoke ExitProcess, 0
    
end start

;:make
;del upres.exe
;\masm32\bin\ml.exe /c /coff upres.cmd
;\masm32\bin\link.exe /SUBSYSTEM:WINDOWS upres.obj
;del upres.obj
;pause
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




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


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

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