Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado 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??
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?
-
... 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
-
si burrada mia cuando digo bits, yo me refiero a Bytes,
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?
-
si burrada mia cuando digo bits, yo me refiero a Bytes,
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
-
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.
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