API VirtualAlloc « Devthisblog

Devthisblog Desarrollo .net, Diseño Web, Seguridad… Y todo lo que se me vaya ocurriendo…

agosto 22, 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

 C# | 
 
 copy code |
?

1
LPVOID WINAPI VirtualAlloc(
2
  _In_opt_  LPVOID lpAddress,
3
  _In_      SIZE_T dwSize,
4
  _In_      DWORD flAllocationType,
5
  _In_      DWORD flProtect
6
);
7

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.

 C# | 
 
 copy code |
?

01
           
02
 
03
          [DllImport("kernel32.dll", SetLastError = true)] 
04
          public static extern IntPtr VirtualAlloc( 
05
               IntPtr hProcess, 
06
               IntPtr lpAddress, 
07
               IntPtr dwSize, 
08
               uint flAllocationType, 
09
               uint flProtect); 
10
 
11
 
12
           const uint MEM_COMMIT = 0x1000;
13
           const uint MEM_RESERVE = 0x2000;
14
           const uint PAGE_EXECUTE_READWRITE = 0X40;
15
 
16
           IntPtr lpAddress = VirtualAllocEx( 
17
                hndProc, 
18
                (IntPtr)null, 
19
                (IntPtr)520, //Reservamos 520 bytes 
20
                MEM_COMMIT |  MEM_RESERVE, 
21
                PAGE_EXECUTE_READWRITE); 
22

 
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.

No hay comentarios »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress