Hola!! Como andan ?
Bueno,, la consulta es facil hoy.. resulta que tengo un problema al limpiar una variable llamada buffer, la cual se modifica constantemente cuando llega un dato por una conexion con socket.. aca dejo el code y el problema detallado.
.data?
buffer db 512 dup(?) ;Bufer para guardar datos recibidos
Eso en la sección .data?, luego en la sección .code:
Recv:
invoke recv, sock, addr buffer, sizeof buffer, 0
cmp sock, 0
je EMsg
EMsg:
invoke MessageBox, 0, addr buffer, addr Titulo, MB_OK
jmp Recv
El problema es que el "buffer" siempre queda cargado con la mayor cantidad de bytes que se le hayan pasado, por ejemplo:
si cargo buffer con "Hola", y luego cargo buffer con "J" el buffer queda asi: "Jola"
Ya probe con: mov buffer, 0 pero no da resultado...
Tendria que recorrer el buffer byte por byte y si es <> de 0 borrarlo ?? Es esa la solucion ?
Desde ya muchas gracias !! :)
Probaste algo como:
mov eax, offset buffer
mov byte ptr[eax], 0
antes de hacer recv?
Cita de: MCKSys Argentina en 12 Abril 2013, 05:08 AM
Probaste algo como:
mov eax, offset buffer
mov byte ptr[eax], 0
antes de hacer recv?
mmm no dudo de ti fly tu sabes muncho pero solo pienso yo que con eso solo limpiarias la primera posicion de memoria de la variable, orita no estoy en la pc apenas calando pero eso es lo que pienso y con el tema pienso que tendras que saber la longitud de la variable y hacer un bucle y limpiar cada posicion de memoria
y si estoy mal corrijanme
saludos flamer
Jajajaja justo cuando estaba para responder, el foro me sugirio que mirara una nueva respuesta...
Recien pruebo esa opcion de MCK y creo que si,, digo creo porque: O limpia el primer byte, o no lo remplaza.. la cadena queda igual.. Probablemente tenga que medir la longitud de la cadena y llenarla con ceros, si.. o al menos eso deberia funcionar..
Cuando trabajas con cadenas terminadas en cero, si pones un cero al principio, lo demas ya no importa: la cadena tiene largo 0... ;)
Ahora, si quieres escribir si o si TODO el buffer, usa memfill y listo.
Cita de: Vaagish en 12 Abril 2013, 06:13 AM
Jajajaja justo cuando estaba para responder, el foro me sugirio que mirara una nueva respuesta...
Recien pruebo esa opcion de MCK y creo que si,, digo creo porque: O limpia el primer byte, o no lo remplaza.. la cadena queda igual.. Probablemente tenga que medir la longitud de la cadena y llenarla con ceros, si.. o al menos eso deberia funcionar..
Con que pongas un 0 en la posicion cadena[strlen(cadena)]=0 asi delimitas la cadena, no hace falta que limpies todo.
Sa1uDoS
Citar
Con que pongas un 0 en la posicion cadena
[strlen(cadena)]=0 asi delimitas la cadena,
no hace falta que limpies todo.
Sa1uDoS
delimitando la cadena como dises los bytes quedarian en memoria y se borrarian al sobreescribir en ellos pero tendria que tener cuidado de no hacer un llamado a la cadena y salgan a la luz.
Osea si la variable media 10 anteriormente y delimitas a 0 y empiesas a sobreescribir hasta el byte 5 tendrias que tener cuidado de no invocar del byte 6 en adelante.
Es muy buena opcion pero con cuidado
saludos flamer
Impecable! memfill do the hard work!!
CitarOsea si la variable media 10 anteriormente y delimitas a 0 y empiesas a sobreescribir hasta el byte 5 tendrias que tener cuidado de no invocar del byte 6 en adelante.
Exacto.. y yo preciso el buffer en un MessageBox.. siempre me tira el buffer con la mayor cantidad de bytes guardados..
Cualquier funcion que trabaje con cadenas lee hasta el primer 0 que encuentra, porque cualquier funcion que mida la longitud de una cadena lee hasta el primer 0 que encuentra.
Sa1uDoS
Cita de: mr.blood en 12 Abril 2013, 22:05 PM
Cualquier funcion que trabaje con cadenas lee hasta el primer 0 que encuentra, porque cualquier funcion que mida la longitud de una cadena lee hasta el primer 0 que encuentra.
Sa1uDoS
la mento desirte pero no son cadenas son posiciones de memoria y lo de delimitar y sobreescribir en ellas creo que no funcionaria pensandolo bien ya que cuando declaro la variable buffer se asigno una sierta posicion de memoria y es la que seba a imprimir ejemplo:
si buffer en piesa de 00401000 y termina en 0040100F y sobre escribe hasta 00401007 y luego manda a imprimir seba a imprimir hasta la ultima posicion que es 0040100F junto con lo que no se sobreescribio o como dise tu si pongo un 0 en la posicion 00401007 y mando a imprimir la variable hasta hay seba a imprimir
saludos flamer y delimitar si se puede pasando lo sobreescribido a otra variable pero seri mas pancho
Nota: en ASM cuando se declara una variable ase referencia a sierta posicion de memoria no son cadenas como en lenguajes de alto nivel y si estoy mal corrijanme y perdonen las falta de ortografia
Cita de: Flamer en 13 Abril 2013, 18:40 PM
no son cadenas como en lenguajes de alto nivel y si estoy mal corrijanme
Cuando usas APIs de Windows desde MASM, el concepto de szstring se define como una secuencia de bytes que termina en un byte nulo (osea 0 en ASCII).
Osea, que cuando llamas, por ej. a MessageBoxA, en el parametro lpText debes pasar un ptr a una szstring. Mas info: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx)
Saludos!
Citar
Cuando usas APIs de Windows desde MASM,
el concepto de szstring se define como una
secuencia de bytes que termina en un byte
nulo (osea 0 en ASCII).
esa secuensia de bytes estan almasenadas en posiciones de memoria a la cual para acceder a ellas hacemos referencia a una variable la cual acupa dicho espacio en memoria, no creo que interponiendo un cero en medio evite leer los demas bytes siguientes si dicho espacio es parte de la variable asignada.
Nota: si tengo tiempo boy a ser pruebas en mi pc aver que pasa ya que lo que digo son solo opiniones.
Saludos flamer y para limpiar la variable tienes que sobreescribir todo o llenarla de ceros
http://en.wikipedia.org/wiki/Null_terminated_string
El problema aca no es ese igual, la historia es que recv no trabaja con cadenas y con poner en 0 el primer byte no es suficiente si por ejemplo pasa esta secuencia:
1) recv lee la cadena "hola"
2) ponemos 0 en el primer caracter
3) recv lee la cadena bol
¿Y donde esta el terminador de cadena? ¿En el primer caracter que ahora es 'b'? En fin, que limpie todo o sino que ponga el terminador usando de base el tamaño que devuelve recv que para algo esta.
memfill funciono bien y rapido.. pero lo que dice Eternal es buena opcion.. el tamaño de la 'cadena' esta dada en recv,, seria poner un 0 al final y listo.. ;)