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


  Mostrar Temas
Páginas: 1 2 3 4 5 [6]
51  Programación / ASM / (Consulta - Windows) ¿En que anillo está el buffer manejado por stdout? en: 23 Diciembre 2015, 01:55 am
Hola, muy buenas. La duda es ¿dónde está el buffer de stdout? Por ejemplo, cuando llamamos a la función printf, lo que hacemos es copiar el buffer del parámetro de dicha función a otro buffer manejado por Windows. Entonces, ¿qué nivel de protección tiene?

Por si alguien anda despitadillo, me refiero a los anillos del modo protegido de los procesadores. He escuchado que suelen haber 4. El kernel se encuentra en el nivel 0, y las aplicaciones de usuario en el 3.

Lo pregunto por saber si puedo acceder a ese buffer directamente o está en el kernel, y por tanto solo se puede acceder a el por Windows y su API (o las librerías standard de los compiladores, aunque estas a su vez requieren a la API).

Gracias
52  Programación / ASM / (Consulta) ¿Por qué Windows no usa interrupciones? en: 22 Diciembre 2015, 08:06 am
Hola, muy buenas! La pregunta es bastante simple. ¿Por qué Windows no usa interrupciones para operaciones de bajo nivel? Por ejemplo, Los sistemas Unix usan su clásica interrupción 0x80 para, por ejemplo, operaciones de lectura o escritura. Sin embargo, para hacer operaciones de escritura o lectura en Windows, necesitas usar su API.

La duda se puede plantear de otra forma. ¿Tienen las interrupciones alguna desventaja clara frente al sistema que usa Windows? Gracias!
53  Programación / Programación C/C++ / std::ofstream::close crashea sin explicación aparente en: 19 Diciembre 2015, 16:58 pm
Hola, muy buenas a tod@s. El problema que tengo es que al intentar cerrar un archivo de un programa que estoy creando, la función que realiza eso crashea el programa.

El código es
Código
  1. cPath.append(".bmp");
  2. cFilteredImage.open(cPath,
  3.                    std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
  4. if(cFilteredImage.is_open() == true) {
  5.        cFilteredImage.write(lpbyHeader, 54);
  6.  
  7.        for(unsigned int i = 0; i < stBmpData.uDataSize; i += stBmpData.uBitsPerPixel/8) {
  8.                fVectorLength = calculateLength(&(stBmpData.lpbyData[i]));
  9.  
  10.                if(fVectorLength <= 100.0)
  11.                        lpbyImageData[i/3] = true;
  12.                else
  13.                        lpbyImageData[i/3] = false;
  14.  
  15.                if(lpbyImageData[i/3] == true)
  16.                        cFilteredImage.write("\xFF\xFF\xFF", 3);
  17.                else
  18.                        cFilteredImage.write("\x00\x00\x00", 3);
  19.        }
  20.  
  21.        cFilteredImage.close();
  22. }

A lo mejor la respuesta es obvia, pero no la veo :P Gracias por prestar atención

PD.: El archivo se escribe correctamente. El problema es al cerrarlo
54  Foros Generales / Sugerencias y dudas sobre el Foro / (Conulta - Informativo) Publicidad en este foro y algunos errores en el editor en: 16 Diciembre 2015, 01:34 am
Hola, muy buenas a tod@s. Espero que esto lo lea algún moderador para que pueda solucionar ese error que voy a comentar y a ver si puede responderme a esto.

Bueno, la primera parte es que ahora, cuando hago click sobre ciertas áreas de esta página, de forma aleatoria me aparece publicidad en un pop-up o nueva pestaña. La pregunta es: ¿es normal, o es alguna clase de "virus"? Me parecería normal porque tenéis que obtener dinero (de algo se come), pero me resulta raro que sea con pop-ups y demás.

La segunda parte es para comentar un error. En el editor, cuando intento usar cualquiera de las ayudas que ofrece, no funciona (por ejemplo, las etiquetas GeSHI las tengo que poner manualmente, o las palabras remarcadas en negrita, o cualquiera de los botones encima del editor de texto de este foro). No sé si es solo a mí, por eso pregunto :P

PD.: Uso Google Chrome en Windows 10 de 64 bits. No tengo ningún tipo de extensión instalada (ni siquiera AdBlock). He pasado el AdwCleaner (para limpiar este tipo de "extensiones" que te añaden publicidad a las páginas que no tienen).

PD2.: En chrome, en su consola (pulsando F12), me aparece como que se han producido 1000 errores xD. Unos ejemplos de esos mil errores que me aparecen:
Código:
Uncaught ReferenceError: surroundText is not defined
post.html;board=10.0:378 Uncaught ReferenceError: bbc_highlight is not defined
VM183 post.html;msg=2050893;topic=445635.10;sesc=02dd5f80a8108345c2d72ee8898cf90f:427 Uncaught ReferenceError: storeCaret is not defined
post.html;board=10.0:378 Uncaught ReferenceError: bbc_highlight is not defined
post.html;board=10.0:322 Uncaught ReferenceError: bbc_highlight is not defined
post.html;board=10.0:322 Uncaught ReferenceError: surroundText is not defined
post.html;board=10.0:322 Uncaught ReferenceError: bbc_highlight is not defined
post.html;board=10.0:322 Uncaught ReferenceError: surroundText is not defined
301VM183 post.html;msg=2050893;topic=445635.10;sesc=02dd5f80a8108345c2d72ee8898cf90f:427 Uncaught ReferenceError: storeCaret is not defined
post.html;board=10.0:378 Uncaught ReferenceError: bbc_highlight is not defined

Muchas gracias por su atención y por este gran foro :D
55  Programación / ASM / (Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T) en: 14 Diciembre 2015, 13:31 pm
Hola, muy buenas. Estoy aprendiendo ensamblador y para ello lo estoy enlazando con las librerías estandar de C++. No sé mucho sobre la sintaxis de intel (estoy aprendiendo NASM), pero he conseguido el siguiente código (el cual está guardado en el archivo intercambiar.s)

Código
  1. .file "intercambiar.cpp"
  2. .text
  3. .globl __Z12intercambiarPiS_
  4. .def __Z12intercambiarPiS_; .scl 2; .type 32; .endef
  5. __Z12intercambiarPiS_:
  6. LFB0:
  7. .cfi_startproc
  8. pushl %ebp
  9. .cfi_def_cfa_offset 8
  10. .cfi_offset 5, -8
  11. movl %esp, %ebp
  12. .cfi_def_cfa_register 5
  13.  
  14. movl 8(%ebp), %eax
  15. movl 12(%ebp), %ebx
  16. movl %eax, 12(%ebp)
  17. movl %ebx, 8(%ebp)
  18.  
  19. popl %ebp
  20. .cfi_restore 5
  21. .cfi_def_cfa 4, 4
  22. ret
  23. .cfi_endproc
  24. LFE0:
  25. .ident "GCC: (GNU) 4.8.1"
  26.  

Lo que he hecho es conseguir el código base gracias al compilador g++ de MinGW y añadir el intercambiador de variables.

Lo que sería el intercambiador es el siguiente:

Código
  1. pushl %ebp
  2. movl %esp, %ebp
  3.  
  4. movl 8(%ebp), %eax
  5. movl 12(%ebp), %ebx
  6. movl %eax, 12(%ebp)
  7. movl %ebx, 8(%ebp)
  8.  
  9. popl %ebp
  10. ret

Lo que he hecho después es ejecutar el siguiente comando:
Código:
g++ -Wall -c intercambiador.s

Con el, he obtenido un fichero objeto

Ahora bien, cuando ejecuto el programa principal, no me intercambia las variables.

Aquí tenéis el programa principal en C++:

Código
  1. #include <iostream>
  2.  
  3. void intercambiar(int* lpnValorA, int* lpnValorB);
  4.  
  5. int main() {
  6. int nValorA, nValorB;
  7.  
  8. std::cout << "Introduzca el valor A: ";
  9. std::cin >> nValorA;
  10. std::cout << "Introduzca el valor B: ";
  11. std::cin >> nValorB;
  12.  
  13. intercambiar(&nValorA, &nValorB);
  14.  
  15. std::cout << "\nnValorA = " << nValorA << std::endl;
  16. std::cout << "nValorB = " << nValorB;
  17.  
  18. std::cin.get();
  19. std::cin.get();
  20. return 0;
  21. }

Pues eso, el intercambiador no hace nada

Soy novato en ASM, por lo que no seáis duros :D Gracias
56  Sistemas Operativos / Windows / (Consulta) Accesos directos de Windows que rellenan cuadros de texto en: 4 Diciembre 2015, 18:19 pm
Hola, muy buenas a tod@s. Mi pregunta (aunque no sé si debería ir en este subforo) es la siguiente: ¿Se puede crear un acceso directo de Windows que te rellene los cuadros de texto que están nombrados por un nombre?
Por ejemplo, una página tiene los siguientes recuadros:

Código
  1. <input id="consultaNotaForm:nifnie" type="text" name="consultaNotaForm:nifnie" class="submenu" maxlength="9" size="15">
  2. ...

Gracias por ver el tema
57  Programación / Programación C/C++ / (Consulta) Operador const_cast en: 30 Noviembre 2015, 08:29 am
(Aquí cuento un poco como he llegado a mi duda, puedes leer un resumen abajo)

Hola, muy buenas. El caso es que acabo de encontrarme con este operador, el cual me parece un tanto curioso. Bueno, supongo que cada uno, cuando ha visto este operador, se ha hecho la pregunta ¿podré modificar el valor de una constante? Bueno, pues para probarlo, he elaborado el siguiente código:

Código
  1. #include <iostream>
  2.  
  3. int main() {
  4.    const int value_a = 5;
  5.    int *value_b = NULL;
  6.  
  7.    value_b = const_cast<int *>(&value_a);
  8.    *value_b = 6;
  9.  
  10.    std::cout << "&value_a = " << &value_a << std::endl; // Imprimimos direcciones
  11.    std::cout << " value_b = " << value_b << std::endl;
  12.    std::cout << std::endl;
  13.    std::cout << " value_a = " << value_a << std::endl; // Imprimimos valores
  14.    std::cout << "*value_b = " << *value_b;
  15.  
  16.    std::cin.get();
  17.    return 0;
  18. }

El resultado que he obtenido, es cuanto menos curioso:
Citar
&value_a = 0x9ffe34
 value_b = 0x9ffe34

 value_a = 5
*value_b = 6

Bueno, analicemos. Las dos variables, efectivamente, tienen la misma dirección (así que el casting parece haberse computado correctamente). La cosa es que para dos mismas direcciones de dos variables, ¡tenemos dos valores diferentes!

La duda, en resumidas cuentas es, ¿cómo es posible que para una misma dirección de memoria haya dos valores diferentes almacenados? ¿o a lo mejor sucede otra cosa?

Gracias :D
58  Programación / Programación C/C++ / (Consulta) Definición del operador << para streams en: 29 Noviembre 2015, 01:04 am
Hola, muy buenas. En mi rato libre, quise mirar un poco el standard de C++. Una cosa de las que he mirado es los operadores definidos para los streams definidos en este (lo he mirado tanto en cplusplus como en el propio archivo de mi compilador MinGW.

Un ejemplo de lo que encontré en el archivo "ostream" es el siguiente:
Código
  1. __ostream_type& operator<<(long __n);

La duda es: ¿No necesita una clase o estructura en los parámetros del operador para ser correcto?

Bueno. Para intentar no tener que preguntar, he hecho el siguiente ejemplo:

Código
  1. #include <cstdio>
  2.  
  3. struct stream {
  4.    int null;
  5. };
  6.  
  7. stream& operator<< (int val);
  8.  
  9. int main() {
  10.    stream ostream = {0};
  11.  
  12.    ostream << 123 << 5;
  13.  
  14.    return 0;
  15. }
  16.  
  17.  
  18. stream& operator<< (int val) {
  19.    printf("%i", val);
  20. }

Pero en las definiciones del operador he tenido que poner esto, porque si no me daba error:

Código
  1. stream& operator<< (stream& ostream, int val);

Esto no esclarece nada :S Gracias por su ayuda!
59  Programación / Programación C/C++ / (Consulta) Libro/tutoriales de C++11 en: 13 Noviembre 2015, 19:02 pm
Hola. Estoy buscando un libro en español para aprender C++11. No sé si existe en español. En caso de que no haya, ¿cuál me recomiendan en inglés? Gracias de antemano.
60  Programación / Programación C/C++ / (Aporte) Diagrama de flujo del operador std::cin>> (std::istream>>) en: 2 Noviembre 2015, 09:21 am
Hola a todos. He visto que muchos de mis amigos y que algunas personas de Internet no comprenden muy bien que es lo que hacen cuando usan std::cin >> variable. Por esto mismo, y pareciendo ser una tontería, he diseñado un pequeño diagrama de flujo para que así vea la gente como funciona. Aquí os lo dejo



Procedo a explicarlo. Lo primero que tenemos que saber es que hay un buffer por ahí que guarda lo que metemos por consola. Entonces, lo primero que hace std::cin>> es comprobar que no haya datos en ese buffer. Si no los hay, entonces procedemos a pedir datos por la consola. Si le damos a enter sin meter nada, entonces se imprimirá un espacio de línea y te pedirá de nuevo que ingreses datos (pues no has ingresado nada), y así hasta que introduzcas algún dato. Entonces, sabiendo que el buffer que maneja std::cin tiene algo, procedemos a comprobar. Lo primero que tenemos que saber es que std::cin recogerá datos de su buffer (que es como una cadena de caracteres) hasta que se encuentre con un espacio (' ') o un salto de línea ('\n'). Entonces, comprobamos si esos datos pueden ser almacenados en la variable que queríamos modificar. Por ejemplo, si la variable es de tipo entero pero "Hola", entonces se determina que no son datos compatibles. En ese caso, a esa variable se le asigna el valor 0 y se establece una bandera de error para que así sepamos que ha habido un error. Date cuenta que si los datos no corresponden, el buffer no se limpia, sino que permanece con los datos introducidos. Pero si los datos concuerdan, entonces se transforman al tipo de variable de entrada y se eliminan esos datos del buffer que maneja std::cin (se eliminan los datos hasta el espacio o salto de línea) y en último lugar se imprime un salto de línea.

Espero que lo hayan entendido y que despeje muchas dudas :D

Ejemplos prácticos de las consecuencias de este diagrama:

Código
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. int main() {
  5.    int nValor = 1;
  6.    std::string cString;
  7.  
  8.    std::cout << "Introduzca un número: ";
  9.    std::cin >> nValor;
  10.  
  11.    std::cin >> cString;
  12.  
  13.    std::cout << "nValor = " << nValor << std::endl;
  14.    std::cout << "cString = \"" << cString << "\"";
  15.  
  16.    std::cin.clear();
  17.    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  18.    std::cin.get();
  19.    return 0;
  20. }

Si compilamos y ejecutamos este código, obtendremos la siguiente salida (la salida está enmarcada. Lo otro son explicaciones):

Código:
Introduzca un número: 
Puesto que inicialmente el buffer que maneja std::cin está vacio, entonces el programa se detiene ahí para que introduzcas algo.
Vamos a teclear Hola (que evidentemente no es un entero como se pide) para ver que pasa:

Vamos a comprobar si estáis atentos. ¿Qué debería pasar ahora?

Bien, lo que va a pasar ahora es que std::cin >> cString va a ver que el buffer ya tiene datos guardados (no se han eliminado puesto que se ha producido un error), por lo que el thread no se va a detener como esperaríamos desde un principio, sino que directamente va a asignar esos datos a cString (aquí no hay ningún error, pues "Hola" es un string)

Entonces, una vez pulsado enter al introducir hola, la salida quedaría así:

Código:
Introduzca un número: Hola
nValor = 0
cString = "Hola"

Como veis, la variable 'nValor' tiene un valor de 0, pese a que la hemos inicializado como 1. Eso quiere decir que std::cin ha cambiado el valor de esta variable a 0 (tal y como sale en el diagrama).

Bueno, eso es todo. La mejor manera de que lo veáis es que ejecutéis el código por vosotros mismos y experimentéis. Un último apunte: la función std::cin.clear() lo que hace es limpiar la lista de errores producidos, no limpia el buffer!

Gracias por su atención.

Se aceptan sugerencias y/o optimicaciones :D
Páginas: 1 2 3 4 5 [6]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines