Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinAPI работа с памятью 
:(
    Опции темы
Barabeo
Дата 6.10.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Зарезервировать 2 региона памяти (по 2 страницы каждый).Заполнить 1-й регион значением в шестнадцатеричной форме.Скопировать данные из 1-го региона во 2-ой.Обнулить данные в 1-ом регионе.Вывести содержимое используемых регионов.

Код


#include <windows.h>
#include <iostream.h>

int main()
{
  BYTE *a, *b;     // указатели на регионы памяти
  const int size = 1000;   // размерность массива

///////////////////////////распределяем виртуальную память////////////////////////////

//первый регион

  a = (BYTE*)VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
  if(!a)
  {
    cout << "Virtual allocation failed." << endl;
    return GetLastError();
  }

//второй регион

  b = (BYTE*)VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
  if(!b)
  {
    cout << "Virtual allocation failed." << endl;
    return GetLastError();
  }

// Заполняем регион значением

  FillMemory(a, size, 'X');

// копируем данные из первого региона во второй

  CopyMemory(b, a, size);

//Выводим результат

  cout << "b[10] = " << b[10] << endl;

// освобождаем виртуальную память

  if (!VirtualFree(a, 0, MEM_RELEASE))
  {
    cout << "Memory release failed." << endl;
    return GetLastError();
  }
  system("PAUSE");
  return 0;
}




Вообще есть какой-нибудь толк в этом коде?
Обнулить память и освободить,это одно и тоже?
Как обнулить память?
Как вывести содержимое используемых регионов?


PM MAIL   Вверх
Estranged
Дата 7.10.2010, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здесь выделяется не две страницы, а одна. Обнулить - SecureZeroMemory, memset.
Вывести значение в цикле cout << hex << (int )a[i]?
PM MAIL   Вверх
Barabeo
Дата 7.10.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А как выделить 2 страницы?
PM MAIL   Вверх
Barabeo
Дата 7.10.2010, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Может так
Код


short* code;
...
 DWORD region_size = si.dwAllocationGranularity;
...

 code = (short*)VirtualAlloc(NULL, region_size * 2, MEM_COMMIT, PAGE_EXECUTE_READWRITE);


PM MAIL   Вверх
Estranged
Дата 8.10.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нет. http://msdn.microsoft.com/en-us/library/ms...28VS.85%29.aspx и http://msdn.microsoft.com/en-us/library/ms...v=VS.85%29.aspx
DWORD     dwPageSize; - это размер страницы в байтах. Т.е. для выделения двух страниц нужно запросить размер в VirtualAlloc: dwPageSize < size <= dwPageSize * 2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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