elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Como crear Memoria Dinamica?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como crear Memoria Dinamica?  (Leído 4,320 veces)
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Como crear Memoria Dinamica?
« en: 31 Octubre 2011, 19:24 pm »

bueno tengo esa duda :/
como puedo crear memoria dinamica sin usar apis? :P
es posible? lo normal seria con la virtualAlloc no?
pero derepente en una funcion dependiendo de una condicion quiero devolver un puntero a una variable string por
eso necesitaria crear una variable dinamica porque no sabria si fuera utilizada o no :P
y tambien por la eficiencia ;D
gracias ;D


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Como crear Memoria Dinamica?
« Respuesta #1 en: 1 Noviembre 2011, 06:49 am »

Ammm se me ocurre ocupar un Array de Bytes y con Redim Preserve y jugar un poco con el puntero de la variable... mira:

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Function VarPtrArr Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
  5. Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
  6. Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)
  7.  
  8. Public Function allocMem(ByVal lSize As Long) As Long
  9. '   //  Retorna la Dirrecion de un SafeArray.
  10. Dim pBuff()     As Byte
  11.    If (lSize <= &H0) Then Exit Function
  12.    ReDim pBuff(0 To (lSize - 1))
  13.    GetMem4 VarPtrArr(pBuff), VarPtr(allocMem)
  14.    PutMem4 VarPtrArr(pBuff), 0
  15. End Function
  16.  
  17. Public Function reallocMem(ByVal lptr As Long, ByVal lSize As Long) As Long
  18. '   //  Retorna la Dirrecion de un SafeArray que se retorno en allocMem()/reallocMem().
  19. Dim pBuff()     As Byte
  20.    PutMem4 VarPtrArr(pBuff), lptr
  21.    If not (lSize = &H0) Then
  22.        ReDim Preserve pBuff(0 To (lSize - 1))
  23.    else
  24.        erase pBuff
  25.    end if
  26.    GetMem4 VarPtrArr(pBuff), VarPtr(reallocMem)
  27.    PutMem4 VarPtrArr(pBuff), 0
  28. End Function
  29.  
  30. Public Function getMemData(ByVal lptr As Long) As Long
  31. '   //  lPtr debe ser el valor (Address) que retorno en allocMem()/reallocMem().
  32. '   //  Esta funcion retorna la Dirrecion de memoria EDITABLE de lPtr (Dirrecion de un SafeArray).
  33. '   //  Referencias.
  34. '   //  http://msdn.microsoft.com/en-us/library/aa908603.aspx
  35.    If (lptr = &H0) Then Exit Function
  36.    GetMem4 (lptr + &HC), VarPtr(getMemData)    '   //  obtenemos pvData
  37. End Function
  38.  
  39. Public Sub releaseMem(ByVal lptr As Long)
  40. '   //  lPtr debe ser la Dirrecion que retorno en allocMem().
  41. Dim pBuff()     As Byte
  42.    PutMem4 VarPtrArr(pBuff), lptr
  43. End Sub
  44.  
  45.  

ejemplo:

Código
  1.  
  2. Private Sub Form_Load()
  3. Dim lptr    As Long
  4. Dim lVal    As Long
  5.    lptr = allocMem(8)
  6.    PutMem4 getMemData(lptr) + 3, 10
  7.    lptr = reallocMem(lptr, 4)
  8.    GetMem4 getMemData(lptr) + 3, VarPtr(lVal)
  9.    Call releaseMem(lptr)
  10.    Debug.Print lVal
  11. End Sub
  12.  
  13.  


« Última modificación: 4 Noviembre 2011, 03:18 am por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Como crear Memoria Dinamica?
« Respuesta #2 en: 1 Noviembre 2011, 06:55 am »


pero derepente en una funcion dependiendo de una condicion quiero devolver un puntero a una variable string por


para eso tienes el API SysAllocStringByteLen  pero leete la MSDN por que el puntero lo tienes que liberar.

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Como crear Memoria Dinamica?
« Respuesta #3 en: 1 Noviembre 2011, 07:43 am »

Gracias BlackZeroX  ;-) siempre me salvas  ;-)
se me habia ocurrido lo de los arrays tambien ;D
En línea

Slek Hacker

Desconectado Desconectado

Mensajes: 35


El Conocimiento nos hace Libres...


Ver Perfil
Re: Como crear Memoria Dinamica?
« Respuesta #4 en: 3 Noviembre 2011, 21:32 pm »

Tengo un par de preguntas sobre este tema. A ver, la función reallocMem, ¿la usas para convertir los datos de Long a Integer (osea, de 8 bytes de tamaño a 4)? ¿Para qué sirve exactamente releaseMem?
¿Por qué sumas +3 a la dirección de memoria editable del SafeArray?
Y la función reallocMem, ¿no debería ser así?
Código
  1. Public Function reallocMem(ByVal lptr As Long, ByVal lSize As Long) As Long
  2. '   //  Retorna la Dirrecion de un SafeArray que se retorno en allocMem()/reallocMem().
  3. Dim pBuff()     As Byte
  4.    PutMem4 VarPtrArr(pBuff), lptr
  5.    If (lSize = &H0) Then
  6.        Erase pBuff
  7.    Else
  8.        ReDim Preserve pBuff(0 To (lSize - 1))
  9.    End If
  10.    GetMem4 VarPtrArr(pBuff), VarPtr(reallocMem)
  11.    PutMem4 VarPtrArr(pBuff), 0
  12. End Function

Gracias!
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Como crear Memoria Dinamica?
« Respuesta #5 en: 4 Noviembre 2011, 03:26 am »

.
Tengo un par de preguntas sobre este tema. A ver, la función reallocMem, ¿la usas para convertir los datos de Long a Integer (osea, de 8 bytes de tamaño a 4)?

long = 4 bytes
integer = 2 bytes

reallocMem solo invoca una redimencion del bloque de memoria es decir hace lo mismo que realloc() de C

¿Para qué sirve exactamente releaseMem?

libera el bloque de memoria. es como free() de C.

¿Por qué sumas +3 a la dirección de memoria editable del SafeArray?

Se reservaron 8 bytes editables allocMem(8).

Entonces getMemData nos retorna el inicio de estos 8 bytes que podemos editar libremente.

00000000

solo me muevo 3 bytes y Pusheo el numero 10 con putmem4() es decir de longitud 4

es decir en estos bytes

00000000

Y la función reallocMem, ¿no debería ser así?

Perdon en lugar de If (lSize = &H0) Then era  If not (lSize = &H0) Then... me falto not...

P.D.: Aqui hay otra forma... con ejemplo a una creacion de String de vb6 con su creacion seteo y liberacion aqui.

Nota: Estos metodos al parecer son mas recomendables para Malware que para un proyecto profesional... aun nunca esta demas meterle algo dificil para que te llamen a solucionar a ti un problema xP... jejejeje.

Dulces Lunas!¡.
« Última modificación: 4 Noviembre 2011, 04:07 am por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
Slek Hacker

Desconectado Desconectado

Mensajes: 35


El Conocimiento nos hace Libres...


Ver Perfil
Re: Como crear Memoria Dinamica?
« Respuesta #6 en: 4 Noviembre 2011, 10:54 am »

Ok ya lo pillo. Entonces, el +3 ese se podría omitir, y pushear el 10 al principio de los 8 bytes editables no?
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Como crear Memoria Dinamica?
« Respuesta #7 en: 4 Noviembre 2011, 11:18 am »

si

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cómo comparar 2 variables en memoria dinamica?
.NET (C#, VB.NET, ASP)
luison 0 1,783 Último mensaje 19 Marzo 2012, 20:57 pm
por luison
como crear tabla dinamica con un select dinamico php
PHP
include (); 3 11,512 Último mensaje 21 Septiembre 2012, 03:05 am
por include ();
[DUDA] Como crear una Librería Dinámica.
Programación C/C++
Zodiak98 2 2,166 Último mensaje 25 Mayo 2013, 00:05 am
por Zodiak98
¿Cómo de dinámica es una IP dinámica?
Redes
‭lipman 3 3,152 Último mensaje 7 Marzo 2014, 09:04 am
por ‭lipman
Como liberar memoria en estructura dinámica [C]
Programación C/C++
NOB2014 4 5,503 Último mensaje 13 Enero 2017, 15:24 pm
por geeke
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines