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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2014, 15:33   #1
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
Вопрос VirtualFree

Hello! Ребят, такой вопрос.
Резервирую память, таким образом:
Код:
procedure TForm2.Button1Click(Sender: TObject);
var
b : BOOL;
bAddress : Integer;
s : DWORD;
P : Pointer;
  begin
    bAddress := $7AAAAAAA;
    s := 2*1024*1024;
    p := VirtualAlloc(Pointer(bAddress), s, MEM_COMMIT + MEM_RESERVE, PAGE_READWRITE);
    b := VirtualFree(Pointer(bAddress), s, MEM_RELEASE);
  end;
end.
Вопрос, резервирует успешно, но при освобождении, возвращает False, в чем моя ошибка?
P.s. Не по теме, уточнение, VirtualAlloc возвращает значение 7AAA0000, т.е. память резервирована от 7ААА0000 до 7ААААААА?

Последний раз редактировалось SPLER; 28.05.2014 в 15:50.
SPLER вне форума Ответить с цитированием
Старый 28.05.2014, 15:45   #2
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Ошибку нашел, получилось так:
Код:
procedure TForm2.Button1Click(Sender: TObject);
var
b : BOOL;
bAddress : Integer;
s : DWORD;
P : Pointer;
  begin
    bAddress := $7AAAAAAA;
    s := 2*1024*1024;
    p := VirtualAlloc(Pointer(bAddress), s, MEM_COMMIT + MEM_RESERVE, PAGE_READWRITE);
    b := VirtualFree(p, 0, MEM_RELEASE);
  end;
end.
Как понял, при освобождении, система сама знает размер резервированного блока. Ну и с указателем освобождаемой памяти ошибка была.

Остается вопрос:
Цитата:
P.s. Не по теме, уточнение, VirtualAlloc возвращает значение 7AAA0000, т.е. память резервирована от 7ААА0000 до 7ААААААА?

Последний раз редактировалось SPLER; 28.05.2014 в 15:50.
SPLER вне форума Ответить с цитированием
Старый 28.05.2014, 15:50   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

по второму вопросу:
память зарезервирована по адресу от p, до s округленного вверх до размера страницы(4096 обычно, но не всегда)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.05.2014, 15:52   #4
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Пепел Феникса, спасибо за разъяснения.
SPLER вне форума Ответить с цитированием
Старый 28.05.2014, 16:09   #5
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Вот опять вопрос возник, по той же теме, в чем на данный момент проблема?
Код:
procedure TForm2.Button1Click(Sender: TObject);
  begin
    bAddress := $7AAAAAAA;
    s := 2*1024*1024;
    GetWindowThreadProcessId($0010124E, @PID);
    h := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
    p := VirtualAllocEx(h, Pointer(bAddress), s, MEM_COMMIT + MEM_RESERVE, PAGE_READWRITE);
    b := VirtualFreeEx(h, p, 0, MEM_RELEASE);
    CloseHandle(h);
  end;
end.
Суть та же, не VirtualFreeEx возвращает False. В чем беда, не пойму пока.

Последний раз редактировалось SPLER; 28.05.2014 в 16:12.
SPLER вне форума Ответить с цитированием
Старый 28.05.2014, 16:25   #6
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Цитата:
Сообщение от SPLER Посмотреть сообщение
Вот опять вопрос возник, по той же теме, в чем на данный момент проблема?
Код:
procedure TForm2.Button1Click(Sender: TObject);
  begin
    bAddress := $7AAAAAAA;
    s := 2*1024*1024;
    GetWindowThreadProcessId($0010124E, @PID);
    h := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
    p := VirtualAllocEx(h, Pointer(bAddress), s, MEM_COMMIT + MEM_RESERVE, PAGE_READWRITE);
    b := VirtualFreeEx(h, p, 0, MEM_RELEASE);
    CloseHandle(h);
  end;
end.
Суть та же, не VirtualFreeEx возвращает False. В чем беда, не пойму пока.
Вопрос исчерпан, была ошибка, из за моей не внимательности, все освобождается, все хорошо.
SPLER вне форума Ответить с цитированием
Старый 28.05.2014, 17:17   #7
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Вопрос возник, от части, касательно темы, задам здесь, т.к. не стоит отдельной темы, вопрос заключается вот в чем, как указать не 2 мб (s := 2*1024*1024, а например 512 кб или любое другое значение, меньше 1 мб ?
SPLER вне форума Ответить с цитированием
Старый 28.05.2014, 17:55   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от SPLER Посмотреть сообщение
Вопрос возник, от части, касательно темы, задам здесь, т.к. не стоит отдельной темы, вопрос заключается вот в чем, как указать не 2 мб (s := 2*1024*1024, а например 512 кб или любое другое значение, меньше 1 мб ?
512 КБ= 512*1024 байт
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.05.2014, 18:06   #9
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

понял, благодарю
SPLER вне форума Ответить с цитированием
Ответ


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