C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 113 - VirtualAlloc() и VirtualFree() / Win 32 API / Win32 API

Шаг 113 - VirtualAlloc() и VirtualFree()

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

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

lpAddress - задает начальный адрес. При этом адрес округляется до ближайшей границы блока размером 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 - зарезервированные, но не используемые.

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

Давайте посмотрим пример.

// testAlloc.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

#define MEMSIZE 4000

void main()
{
	void *p=NULL;
	p=VirtualAlloc(NULL,MEMSIZE,MEM_RESERVE,PAGE_READWRITE);
	if (p!=NULL)
	{
		cout << "OK Alloc " << endl;
		if (VirtualFree(p,0,MEM_RELEASE))
			cout << "Ok Free";
		else
			cout << "Not Free" << endl;
	}
	else
		cout << "Error Alloc " << endl;
}

| |
Автор Каев Артем.
[AD]