Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: LeandroA en Febrero 03, 2010, 07:41:17 pm

Título: CopyMemory WTF?
Publicado por: LeandroA en Febrero 03, 2010, 07:41:17 pm
Hola, tengo una duda con CopyMemory, que no me cierra, resulta que intento copiar un tipo y un array de bits a un segundo array de bits, pero a este segundo lo redimenciono con una medida menor al que tendria que ser y funciona igual, porque??

Código: [Seleccionar]
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Type UDT
    W As Long
    L As Long
End Type

Dim tUdt As UDT
Dim Data() As Byte
Dim Bit() As Byte

Private Sub Form_Load()

    Dim i As Integer

    ReDim Bit(2)
   
    '--------Cargo los valores
    For i = 0 To 2
        Bit(i) = 255
    Next
   
    tUdt.W = 2147483647
    tUdt.L = 2147483647
    '---------------------------
   
   
    '---Reimenciono Data pero con un valor a 8 ?¿?¿?
    ReDim Data(LenB(tUdt)) ' <---WTF?
    '-----------------------------------------------
   
    '------Copio los datos en Data-----------------
    CopyMemory Data(0), tUdt, LenB(tUdt)
    CopyMemory Data(LenB(tUdt)), Bit(0), 3
    '----------------------------------------------
   
    '---------Borro todo-----------------
    For i = 0 To 2
        Bit(i) = 0
    Next
   
    tUdt.W = 0
    tUdt.L = 0
    '-------------------------------------
   
    '--------Recargo utilizando CopyMemory
    CopyMemory tUdt, Data(0), LenB(tUdt)
    CopyMemory Bit(0), Data(LenB(tUdt)), 3
    '-------------------------------------
   
    '--------------Imprimo-------------------------
    Debug.Print tUdt.W, tUdt.L, Bit(0), Bit(1), Bit(2)

End Sub

como ven tUdt  = 8 bits ,  Bit esta redimencionado en 2 por lo tanto son 3  bits, por lo tanto deberia redimencionar a Data a 10 (10 y no 11 porque Data(0) ocupa un lugar no?), entoces mi duda es ¿por qué si redimenciono a DATA( 8 ) y copio los valores igual funciona todo bien?, no tendria que explotar todo por pisar algun segmento de la memoria?
Título: Re:CopyMemory WTF?
Publicado por: coco en Febrero 03, 2010, 08:59:33 pm
... como ven tUdt  = 8 bits ...

te estas refiriendo a que son 8 bits = 1 byte?

... esta redimencionado en 2 por lo tanto son 3  bits ...

no son 3 bits, en todo caso son 3 * 8 (ya que un byte son 8 bits), es decir son 24 Bits, que serian 3 bytes.

... por lo tanto deberia redimencionar a Data a 10 (10 y no 11 porque Data(0) ocupa un lugar no?) ...

para que 11 items ?

... entoces mi duda es ¿por qué si redimenciono a DATA( 8 ) y copio los valores igual funciona todo bien? ...

*imagino* que el UDT ocupa 8 bytes, ya que son 2 longs (cada long ocupa 4 bytes)


de todas formas, no entendi muy bien para que usas Bit() si ya tenes Data y el udt

saludos
Título: Re:CopyMemory WTF?
Publicado por: LeandroA en Febrero 03, 2010, 09:29:01 pm
si burrada mia cuando digo bits, yo me refiero a Bytes,

Citar
de todas formas, no entendi muy bien para que usas Bit() si ya tenes Data y el udt
es solo por poner un ejemplo

para poner las cosas en claro

LenB(tUdt ) = 8 Bytes

el array Bit() es igual a 3 Bytes ya que ReDim Bit(2)

entoses tenemos en total  8 + 3 = 11 Bytes

Data() tendria que esta redimencionado ReDim Data(10) ,osea serian 11 Bytes, no?
pero.. yo lo estoy redimencionando a Data()  con 8 Bytes   ReDim Data( 8 ), osea que no tendria que entrar todo, pero aun asi los datos se copian igual, esa es mi duda.

o tengo un consepto erroneo de todo?




Título: Re:CopyMemory WTF?
Publicado por: coco en Febrero 03, 2010, 09:54:27 pm
si burrada mia cuando digo bits, yo me refiero a Bytes,

Citar
de todas formas, no entendi muy bien para que usas Bit() si ya tenes Data y el udt
es solo por poner un ejemplo

para poner las cosas en claro

LenB(tUdt ) = 8 Bytes

el array Bit() es igual a 3 Bytes ya que ReDim Bit(2)

entoses tenemos en total  8 + 3 = 11 Bytes

Data() tendria que esta redimencionado ReDim Data(10) ,osea serian 11 Bytes, no?
pero.. yo lo estoy redimencionando a Data()  con 8 Bytes   ReDim Data( 8 ), osea que no tendria que entrar todo, pero aun asi los datos se copian igual, esa es mi duda.

o tengo un consepto erroneo de todo?


Ahora entendi.. Esta bien lo que decis, yo *creo* q estas pisando 3 bytes q estan despues del final de los 8 bytes de Data. Posiblemente no pase nada, pero bueno. proba (antes de escribirle encima) ver que valores tiene (asi comprobas q son datos que no son tuyos).

saludos
Título: Re:CopyMemory WTF?
Publicado por: cobein en Febrero 03, 2010, 10:54:57 pm
Basicamente asi se producen los buffer overflow, mientras no intentes escribir en una zona de memoria protegida o estes pisando algun tipo de instrccion no va a pasar nada. Lo que no quiere decir que este bien. Lo que pasa aca es que estas escribiendo fuera de la zona que reservaste, nada mas.

Edit: Por ej en este codico estoy poniendo "l" en la posicion del puntero mas 10 que no esta reservado.

Código: [Seleccionar]
Private Sub Form_Load()
    Dim l As Long
    Dim lPtr As Long
 
    l = 10
    CopyMemory ByVal VarPtr(lPtr) + 10, l, 4
    l = 0
    CopyMemory l, ByVal VarPtr(lPtr) + 10, 4
    Debug.Print l
End Sub