Developer's Diary

22 agosto, 2013

API VirtualAlloc

Filed under: .net, API, Programación, Sin categoría, Uncategorized — Etiquetas: , , , , , — jnavero @ 4:09 PM

Ya estamos de regreso de las vacaciones y como Sheldon Cooper con sus banderas, aquí os traigo una nueva API “Divertida” ^_^.

VirtualAlloc La definición según MSDN: Reserva o compromete una región de paginas en el espacio virtual del proceso que lo llama. La memoria reservada se inicializa a ceros a menos que MEM_RESET sea especificado.

Como es un poco complicada (la definición) intento explicarlo a lo barrio sésamo:
Tenemos un proceso llamado pepito, este proceso llama a VirtualAlloc que reserva una región de paginas (jejeje) virtuales para que el proceso pepito lo pueda utilizar posteriormente, algo así…

Tipo de Función: Gestión de memoria

LPVOID WINAPI VirtualAlloc(
_In_opt_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD flAllocationType,
_In_ DWORD flProtect
);

Parametros:

lpAddress: Es el puntero a la dirección de inicio de la región de memoria que vamos a reservar
dwSize: Indica la cantidad de Bytes que vamos a reserver.
flAllocationType: Especifica el tipo de reserva que vamos a hacer.
Estos tipos pueden ser:
MEM_COMMIT (0x00001000), MEM_RESERVE (0x00002000), MEM_RESET (0x00080000), MEM_RESET_UNDO (0x1000000)

flProtect: Indica el tipo de protección de acceso que vamos a aplicar a la memoria. Vienen dado por una tabla bastante amplia.

Retorna un puntero a la dirección inicial de la memoria reservada. En caso de que la función no tenga éxito, retorna nulo (null).

Aquí os dejo un ejemplo de como se hace una llamada a esta función.

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr VirtualAlloc(
IntPtr hProcess,
IntPtr lpAddress,
IntPtr dwSize,
uint flAllocationType,
uint flProtect);

const uint MEM_COMMIT = 0x1000;
const uint MEM_RESERVE = 0x2000;
const uint PAGE_EXECUTE_READWRITE = 0X40;

IntPtr lpAddress = VirtualAllocEx(
hndProc,
(IntPtr)null,
(IntPtr)520, //Reservamos 520 bytes
MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE);

 
En el ejemplo se hace una reserva de memoria de 520 Bytes, no es algo muy sorprendente, pero, para mostrar el funcionamiento creo que sirve de sobra 🙂

Para más información sobre la api en cuestión. Dejo las paginas de Microsoft.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366786(v=vs.85).aspx

Saludos y hasta pronto.

Anuncios

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: