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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2013, 17:14   #11
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
кстати, а разве GetFileSize принимает имя файла, а не его хендл?
Да тут опечатка,должно быть (так и есть):
Код:
libname:='C:\GameSystem.dll';
          libhandle:= CreateFile(libname,GENERIC_READ or GENERIC_WRITE or GENERIC_EXECUTE,FILE_SHARE_READ or FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
        libsize:=GetFileSize(libhandle,0);
Теперь по поводу VirtualAlloc: не работает выделение памяти по заданному адресу,так работает:
buffer:=VirtualAlloc(0,libsize,MEM_ COMMIT,PAGE_EXECUTE_READWRITE);

Резервируется память,но адрес выбирает система.Однако данные не пишутся:
Код:
SetFilePointer(libhandle,libsize,0,FILE_BEGIN);
ReadFile(libhandle,buffer,libsize,bytesread,nil);
Ошибка 998 - NOACCESS.
calypso вне форума Ответить с цитированием
Старый 07.03.2013, 17:23   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Почитайте про VirtualProtect()
waleri вне форума Ответить с цитированием
Старый 07.03.2013, 17:55   #13
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

а почему указатель файла ставится в конец?
f.hump вне форума Ответить с цитированием
Старый 11.03.2013, 11:39   #14
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Кажется разобрался.Получилось вот что:
1. В VirtualAlloc надо обязательно ставить параметр MEM_COMMIT or MEM_RESERVE для Delphi или MEM_COMMIT|MEM_RESERVE для Visual C++ (пробовал оба способа)
2. VirtualProtect вообще не нужен,да он и не работает (выдает ошибку что нет доступа)
3. SetFilePointer (libhandle,0,0,FILE_BEGIN) - начало файла

Память теперь замечательно резервируется по любому адресу (который свободен - К.О.),и вроде даже файл читается из самой проги.
Из инжектированной DLL правда при чтении ошибка 998,но это я думаю можно исправить
calypso вне форума Ответить с цитированием
Старый 11.03.2013, 12:48   #15
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Короче не работает в Delphi:
Код:
ReadFile(libhandle,buffer,libsize,&bytesread,nil)
ошибка 998
На VisualC++ и Borland C++ работает:
Код:
ReadFile(libhandle,buffer,libsize,&bytesread,NULL)
bytesread тип DWORD, buffer PVOID
calypso вне форума Ответить с цитированием
Старый 11.03.2013, 13:11   #16
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

в Делфи я не мастак, но смутно вспоминая детство,
bytesread - это output, и передается как var, & - не нужен. я прав?

Код:
ReadFile(libhandle,buffer,libsize,bytesread,nil)
хотя на &, наверно, компилятор ругаться будет

Последний раз редактировалось f.hump; 11.03.2013 в 13:23.
f.hump вне форума Ответить с цитированием
Старый 11.03.2013, 13:46   #17
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Да я уж по всякому пробовал,и с & ,и без, и nil на 0 менял - не хочет файл читать и хоть ты тресни. Одна IDE Embarcadero XE2 , на С++ этот код работает,на Делфи нет. Может быть Дельфям не нравятся какие-то параметры из CreateFile? Хотя тогда бы он размер не определил,но память выделяется - всё ок. Только блок пуст,а на С++ туда ещё считываются данные из файла
calypso вне форума Ответить с цитированием
Старый 11.03.2013, 15:56   #18
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Всё,заработало наконец. Секрет полишинеля заключался в том,что буфер передавался как адрес ячейки стека (указатель) вместо числового значения адреса.
Код:
ReadFile(libhandle,buffer^,libsize,bytesread,nil)
Магический значок "^" делает код рабочим,и теперь содержимое файла загружено в память по выделенному адресу в регион Private RWE
calypso вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузить файл с диска в динамическую память через VirtualAlloc calypso Win Api 2 19.02.2013 14:41
как резервируется память для переменной assch Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 22.12.2010 15:42
VirtualAlloc или GlobalAllocPtr? что лучше. VintProg Общие вопросы Delphi 4 12.06.2010 13:29
VirtualAlloc alenka_ej Win Api 3 03.06.2010 16:05
VirtualAlloc и VirtualProtect? VintProg Общие вопросы Delphi 1 29.06.2009 11:50