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

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

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

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

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

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

Нужно выделить блок памяти строго с адреса 00596000h ,однако возникает проблема что адрес не кратен 65536 байт или 00010000h. Поэтому выделяется либо с адреса 00590000 ,либо просто возвращает ошибку 487.
Что здесь можно придумать? Мне в принципе важен не именно адрес выделения,а чтобы данные в памяти находились там где нужно. Т.е. как вариант допускается загрузка ReadFile не с 00590000,а с 005960000 адреса.
Возможно ли такое замутить?
calypso вне форума Ответить с цитированием
Старый 18.03.2013, 13:53   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Возможно при условии, что адрес свободной части памяти меньше или равен тому адресу, который Вам нужен.
s-andriano вне форума Ответить с цитированием
Старый 18.03.2013, 14:32   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Всмысле? Т.е. если есть свободный блок например от 00590000 до 006А0000 размером 110000 ,то если я буду выделять блок с адреса 00596000 размером больше (006А0000-00596000)=10А000 то получу ошибку? Значит надо предварительно забить дырку от 00590000 до 00596000 ?
calypso вне форума Ответить с цитированием
Старый 18.03.2013, 15:43   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

выделяйте с запасом а дальше уже делайте вычисление адреса.
Только если вам нужен определенный адрес то нет гарантии, что он будет свободен.
waleri вне форума Ответить с цитированием
Старый 19.03.2013, 20:08   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Возможно при условии, что адрес свободной части памяти меньше или равен тому адресу, который Вам нужен.
Это еще что за мрак?

по теме, просто выделяй с запасом и пользуйся смещением от начала выделенного блока. в принципе, книжка учит, что если сначала сделать MEM_RESERVE, а потом MEM_COMMIT, то зарезервированные адреса будут выравнены по granularity (0х010000), а выделенные адреса - по размеру страницы (0х01000 или 0х0200000).
f.hump вне форума Ответить с цитированием
Старый 07.04.2013, 20:23   #6
JackyBrown
Новичок
Джуниор
 
Регистрация: 07.04.2013
Сообщений: 5
По умолчанию

Может выделить (COMMIT) блок с выравненным адресом 00590000 с размером, гарантированно большим, что бы мог хранить данные. А сами данные записать по адресу 00596000 (со смещение 6000).

>>Мне в принципе важен не именно адрес выделения,а чтобы данные в памяти находились там где нужно
JackyBrown вне форума Ответить с цитированием
Старый 08.04.2013, 00:58   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от JackyBrown Посмотреть сообщение
Может выделить (COMMIT) блок с выравненным адресом 00590000 с размером, гарантированно большим, что бы мог хранить данные. А сами данные записать по адресу 00596000 (со смещение 6000).

>>Мне в принципе важен не именно адрес выделения,а чтобы данные в памяти находились там где нужно
выделите нужные сектора под вашу запись, их и выделяйте, проблема то, просто ненужное не применяете и усе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.04.2013, 09:53   #8
JackyBrown
Новичок
Джуниор
 
Регистрация: 07.04.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
выделите нужные сектора под вашу запись, их и выделяйте, проблема то, просто ненужное не применяете и усе.
Да, я не спрашиваю, а робко советую :-)

Сам всегда выделяю сколько надо и сразу COMMIT'ом без предварительного резервирования.
JackyBrown вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не резервируется память VirtualAlloc calypso Win Api 17 11.03.2013 15:56
Загрузить файл с диска в динамическую память через VirtualAlloc calypso Win Api 2 19.02.2013 14:41
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