Перейти к содержанию
Enjoy [PC] Trainer
Enjoy

VirtualAlloc и VirtualFree

Рекомендуемые сообщения

С помощью данной функции есть возможность выделить или зарезервировать страницы виртуальной памяти. Между выделением и резервированием есть разница. При выделении физически выделяется память и естественно увеличивается файл подкачки. При резервировании этого не происходит. Вот она:

LPVOID VirtualAlloc
(  
	LPVOID lpAddress,		// базовые адрес
	SIZE_T dwSize,		// размер
	DWORD flAllocationType,	// способ получения
	DWORD flProtect		// тип доступа
);

pAddress - задает начальный адрес. При этом адрес округляется до ближайшей границы блока размером 64 Кбайт. Это значение можно задать NULL и тогда операционная система сама выберет этот адрес.

 

DwSize - размер памяти. Но эта величина очень специфичная. Память выделяется блоками по 4096 байт и соответственно указанный размер будет округляться до этого числа. Выделяете память например 10 байт, а получите 4096, а если выделяете например 5000, то будет выделено памяти в 8192 байта. Округление естественно идет в сторону увеличения.

 

FlAllocationType - способ получения, он может быть следующим:

  • MEM_COMMIT - Выполняется выделение страниц памяти для непосредственной работы с ними. Выделенные страницы заполняются нулями.
  • MEM_TOP_DOWN - Память выделяется в области верхних адресов адресного пространства приложения.

 

Как видите мы можем получить память, зарезервировать.

 

FlProtect - устанавливает тип доступа:

  • PAGE_READWRITE - Чтение и запись.
  • PAGE_READONLY - Только чтение.
  • PAGE_EXECUTE - Только исполнение программного кода.
  • PAGE_EXECUTE_READ - Исполнение и чтение.
  • PAGE_EXECUTE_READWRITE - Исполнение, чтение и запись.
  • PAGE_NOACCESS - Запрещен любой вид доступа.
  • PAGE_GUARD - Сигнализация доступа к странице. Это значение можно использовать вместе с любыми другими, кроме PAGE_NOACCESS.
  • PAGE_NOCACHE - Отмена кэширования для страницы памяти. Используется драйверами устройств. Это значение можно использовать вместе с любыми другими, кроме PAGE_NOACCESS.

 

При успешном выполнении функция вернет указатель на выделенную память, иначе NULL.

 

Функция VirtualFree освобождает выделенную память.

BOOL VirtualFree
(  
	LPVOID lpAddress,	// адресс памяти
	SIZE_T dwSize,	// рамер памяти
	DWORD dwFreeType	// операция
);

dwSize - размер, если мы будем использовать тип освобождения, как MEM_RELEASE, то размер должен быть установлен в 0.

 

dwFreeType - будет определять какая операция произойдет с памятью:

  • MEM_RELEASE - освобождена
  • MEM_DECOMMIT - зарезервированные, но не используемые.

 

При успешном выполнении функция вернет ненулевое значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

Важная информация

Используя этот сайт, вы соглашаетесь с нашими Условия использования.