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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2013, 17:51   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Не резервируется память VirtualAlloc

Уже похожую тему создавал,но тут другая функция:
Код:
startaddr:=$03000000;
libsize:=GetFileSize('C:\MyDll.dll',0);
VirtualAlloc(Pointer(startaddr),libsize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
Загружать данные буду через ReadFile.Проблема в том,что память не резервируется (это видно в отладчике).Пробовал другие startaddr, MEM_RESERVE, PAGE_READWRITE - тоже самое.
Блок памяти свободен,но регион не резервируется.
calypso вне форума Ответить с цитированием
Старый 06.03.2013, 17:57   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А на размер libsize не пробовали посмотреть... сколько \ должно быть в имени файла (в С/С++ должно быть два)
waleri вне форума Ответить с цитированием
Старый 06.03.2013, 18:26   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Размер получает правильный.Почему-то не работает именно VirtualAlloc, если загрузить через MapViewOfFileEx - всё замечательно проецируется.
Надо разобраться,когда регион должен появиться в памяти? После VirtualAlloc или когда мы туда запишем данные? MEM_COMMIT вроде используется для передачи данных региону.
calypso вне форума Ответить с цитированием
Старый 06.03.2013, 18:31   #4
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

А ещё появилась мысль - может нельзя выделить память размером файла? Там же типа гранулярность должна соблюдаться, т.е. размер региона должен быть кратным некоторому значению чтобы CPU мог работать с такой страницей
calypso вне форума Ответить с цитированием
Старый 06.03.2013, 19:12   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

GetLastError()?
Somebody вне форума Ответить с цитированием
Старый 06.03.2013, 20:11   #6
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
GetLastError()?
Она ничего не дает,вернее выдает 87 - неверный параметр.То же самое выдает и после GetFileSize,но размер то определяется.
ShowMessage(IntToStr(libsize)) выдает точный размер файла в байтах
Хотя при PAGE_EXECUTE_READWRITE кажется значение другое ,498 вроде - нет доступа
calypso вне форума Ответить с цитированием
Старый 06.03.2013, 21:57   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от calypso Посмотреть сообщение
Хотя при PAGE_EXECUTE_READWRITE кажется значение другое ,498 вроде - нет доступа
Ну так поексперементируйте
а) С адресом 0
б) С доступом PAGE_READONLY
waleri вне форума Ответить с цитированием
Старый 07.03.2013, 14:03   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

книжка учит, что

MEM_RESERVE - означает, что диапазон виртуальных адресов будет зарезервирован для возможного использования, память при этом не выделеятся (связи с физической памятью нет)

MEM_COMMIT - рабоает только для адресов, которые уже имеют MEM_RESERVE, и означает, что память будет выделена при первой попытке доступа к ней (будет установлена связь с физической памятью).

поэтому иногда имеет смысл делать MEM_RESERVE | MEM_COMMIT в одном VirtualAlloc



кстати, а разве GetFileSize принимает имя файла, а не его хендл?

Последний раз редактировалось f.hump; 07.03.2013 в 14:06.
f.hump вне форума Ответить с цитированием
Старый 07.03.2013, 15:16   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Можно делать MEM_COMMIT напрямую
waleri вне форума Ответить с цитированием
Старый 07.03.2013, 15:54   #10
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Можно делать MEM_COMMIT напрямую
Действительно, видел много раз, оно работает, но всё же в MSDN:
Цитата:
To reserve and commit pages in one step, call VirtualAlloc with MEM_COMMIT | MEM_RESERVE.
The function fails if you attempt to commit a page that has not been reserved.
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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