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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Temas
Páginas: [1] 2 3 4 5 6 7 8 9
1  Programación / ASM / [SOLUCIONADO] Duda con acceso a UART mediante ensamblador. en: 2 Abril 2015, 19:49 pm
Hola a todos.

Tengo que acceder a los registros de la UART del puerto com1 mediante ensamblador, trabajo con C++ builder en windows 98.

Lo primero que hago es conseguir la dirección del COM1 leyendo de la zona BIOS, consigo la dirección de memoria 0x3F8, que entiendo que es la dirección base de la UART del COM1.

Con esta dirección base, usando distintos desplazamientos, accederé a los registros de la UART, ¿es correcto?

Mi problema es que al intentar hacer esto, obtengo un error:
Código:
raised Exception class EAccessViolation with message 'Access violation at address 00401300. Read of address FFFFFFFF'
Esto es lo que he intentado:

Código:
[...]
asm{
    push es;
    mov ax, 3f8h;
    mov es, ax;          //ERROR
    mov ax, es:[0h]
}
[...]

También he intentado acceder a esa posición de memoria de más formas, usando el registro bx, escribiendo directamente la dirección (literal) pero no consigo acceder, siempre el mismo error:
Código:
raised Exception class EAccessViolation with message 'Access violation at address 00401300. Read of address FFFFFFFF'

  
2  Programación / Programación C/C++ / crear librerías dinámicas para windows y linux en: 30 Marzo 2015, 15:31 pm
Hola a todos.

Necesito crear una librería dinámica escrita en C++ , pero necesito crear versiones tanto para windows como para linux (.DLL y .so).

Actualmente estoy desarrollándola en windows usando mingw.

Se generar el DLL pero no el .so, como puedo hacerlo? Gracias.
3  Programación / Programación C/C++ / Duda con extern "C" en: 2 Febrero 2015, 11:20 am
Hola a todos.

Tengo una duda respecto a extern "C", entiendo lo que hace y como funciona, es para forzar el linkado de C aun cuando se intenta compilar en c++.

Mi pregunta es exactamente para qué o en qué situaciones se requiere hacer esto. La única utilidad que le veo es  que los nombres no estén "mangled" a la hora de crear y usar un dll con dichas funciones.

¿Alguien me puede explicar en qué situaciones se debe usar, y por qué/qué problema evita?

Saludos, gracias.
4  Comunicaciones / Redes / Problema con Wake on lan [SOLUCIONADO] en: 21 Diciembre 2014, 20:50 pm
Hola a todos.

Estoy intentando activar el wake on lan en mi pc, para ello de momento envío los magic packets por la red local interna.

En casa tengo 3 PCs, uno de ellos es desde el que mando los magic packets, para los otros 2:

Ya he activado la opción del wake on lan en la BIOS.
Ambos tienen IPs estáticas.
Para mandar los magic packets utilizo WakeMeOnLan.

El problema es que con uno de los 2 PCs ya he conseguido encenderlo, pero el otro no y no entiendo el por qué. El que NO funciona tiene una placa base Asus p5nsli, insisto en que ya he activado el wake on lan en la BIOS.

Ya he probado a encenderlo, mandarle el magic packet y verlo con el wireshark, por eso se que el PC recibe los magic packets.

He probado con 2 IPs de broadcast, 192.168.0.255 y 255.255.255.255.

Para encender remotamente el PC que sí puedo encender, tengo que enviarle varios magic packets (le envío 100). Para el PC que me da problemas he probado a enviarle 1, 100 y 1000.

Nada de lo anterior funciona. ¿Qué puedo hacer?
Saludos, gracias.

EDITO: [SOLUCIONADO]
Ya he encontrado el problema. Además de activar el WOL en la BIOS hay que hacerlo también dentro de las propiedades del adaptador de red. Estas propiedades están en administrador de dispositivos. Ahí buscar el adaptador de red, doble click y avanzadas.
Saludos.
5  Comunicaciones / Redes / Problema con red local [SOLUCIONADO] en: 21 Diciembre 2014, 19:14 pm
Hola a todos.

Tengo un problema con una red local, supongamos que tenemos un pc A (windows 8.1) y otro B (windows 7):

La IP de A es dinámica, no puedo ponerla estática porque al intentar configurarla me da error "Para configurar TCP/IP debe instalar y habilitar una tarjeta adaptadora de red", pero la miro con ipconfig.

Ambos PCs tienen conexión a internet.

IP de A ahora mismo: 192.168.0.195
IP de B siempre: 192.168.0.2

Mi problema es que B ve a A, pero A no ve a B.
Puedo hacer ping de B a A, y de A a sí mismo pero no de A a B. Ya he creado excepciones de entrada y salida para la IP de B, y he probado a deshabilitar el firewall y nada.

¿Qué puede estar pasando?

Saludos, gracias.

EDITO: Ya he conseguido ponerle IP estática al PC A.
Puerta de enlace: 192.168.0.1
PC A: 192.168.0.3 | Máscara: 255.255.255.0
PC B: 192.168.0.2 | Máscara: 255.255.255.0

(*)También he activado en el firewall "Archivos e impresoras compartidos  (petición eco: ICMPv4 de entrada)"

EDITO 2: [SOLUCIONADO]
Ye está hecho, el problema era que la regla de firewall mencionada anteriormente(*) no la había activado en el PC B, solo en el A.
6  Programación / Programación C/C++ / Problema con COMMTIMEOUTS [SOLUCIONADO] en: 11 Diciembre 2014, 12:24 pm
Hola a todos. Estoy desarrollando una aplicación en la que, entre otras cosas, tengo que leer y escribir por el puerto seria. Para ello uso la WinAPI.

No consigo configurar bien los timeouts (SetCommTimeouts), yo lo que quiero es que si al intentar leer del puerto serie no hay nada, éste espere un tiempo razonable (500 ms, 1 sec.) y luego continúe con la ejecución.

He leído la documentación de microsoft, y lo que entiendo es:

- El ReadIntervalTimeout es el tiempo max. que transcurre desde que llega un byte hasta que llega el siguiente.

- El ReadTotalTimeoutMultiplier: en cada operación de lectura, la cantidad de bytes a leer se multiplica por este valor. No entiendo para que sirve esto.

- El ReadTotalTimeoutConstant: este valor se suma al resultado de multiplicar el número de bytes a leer por el ReadTotalTimeoutMultiplier. No entiendo para que sirve esto.

De lo mencionado, ¿hay algo correcto?

¿Qué valores debo dar a las variables anteriores para tener por ej. 500 milisegundos de timeout en total?

Saludos, gracias.



7  Programación / Programación C/C++ / Evitar quedarse bloqueado al leer del puerto serie (C++ WinAPI) en: 7 Diciembre 2014, 22:35 pm
Hola a todos.

Estoy haciendo una clase en C++ con funcionalidad para leer y escribir de distintas maneras en el puerto serie (con la Win32 API).
Como no tengo nada que use puerto serie, para hacer las pruebas estoy usando un emulador de puertos serie (com0com).

Estoy intentando implementar un método que lea todo lo que hay actualmente en el buffer del puerto serie, y si no hay nada, que no se quede bloqueado esperando.

He intentado hacerlo con OVERLAPPED pero, aparte de que no me ha funcionado, no me gusta la idea de tener que lanzar un hilo cada vez que quiero hacer esta opración.

Aquí el código que he escrito:
Código:
port = CreateFile(
string2LPCTSTR(this->portName), //\\\\.\\COM4"
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // default security attributes
OPEN_EXISTING,
0,
NULL
);
if (port == INVALID_HANDLE_VALUE)
throw SerialPortNativeIOException("Port value is INVALID_HANDLE_VALUE");

DCB portConfig;
if (GetCommState(port, &portConfig) == 0){
closeConnection();
this->port=INVALID_HANDLE_VALUE;
throw SerialPortNativeIOException("Error trying to get comm state");
}

setPortConfig(portConfig); //Esto simplemente asigna valores...

if(SetCommState(port, &portConfig)==0){
closeConnection();
this->port=INVALID_HANDLE_VALUE;
throw SerialPortNativeIOException("Error trying to set comm state");
}

setTimeoutConfig(); //Esto simplemente asigna valores...

if(SetCommTimeouts(port, &timeoutConfig)==0){
closeConnection();
this->port=INVALID_HANDLE_VALUE;
throw SerialPortNativeIOException("Error trying to set comm timeout config.");
}
this->connected=true;

...

std::string SerialPortNative::readExisting(){
ulong readBytes=0;
OVERLAPPED oR = {0};
oR.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!ReadFile(this->port,this->buffer,READEXISTING_BUFFER_SIZE,&readBytes,&oR))
if(GetLastError() != ERROR_IO_PENDING)
throw SerialPortNativeIOException("Error reading from serial port");
return string(this->buffer,0,readBytes);
}

Al usar el método 'readExisting()' la lectura da error y no es ERROR_IO_PENDING, es el error con código 3 (ERROR_PATH_NOT_FOUND).

Ya he leído la documentación y ejemplos de msdn.microsoft y he googleado, pero no consigo hacerlo funcionar.

¿Qué puedo hacer? Gracias, saludos.
8  Programación / Scripting / Modificar código en tiempo de ejecución en función de la versión de python en: 7 Noviembre 2014, 09:32 am
Hola a todos.

Tengo que hacer un proyecto en python que sea compatible con la versión 2.7. hasta ahora usaba esta versión pero he llegado a un punto del código en el que me vendría genial poder usar @abstraclassmethod que solo está en la versión 3 en adelante.

Lo que quiero hacer es, dentro del código, tener en una variable la versión del intérprete y, en función de si es mayor o menor que 3, hacer una cosa u otra.

Aquí un fragmento de código:
Código:
#dentro de ModuloA.py

__INTERPRETER_VERSION = float(sys.version.split(" ")[0])
if(__INTERPRETER_VERSION >= 3):
    from abc import abstractclassmethod

class AAA(object):
....
     if(__INTERPRETER_VERSION < 3):
        @classmethod
        def createPacket(cls, bArray, escaped):
            raise NotImplementedError("This method is not implemented in this class. See inheritance.")
    else:
        @abstractclassmethod
        def createPacket(cls, bArray, escaped):
            pass

El problema es que al ejecutar el código me dice que la variable _ModuloA__INTERPRETER_VERSION no está definida. Esto ya se que es por los dos guiones bajos.

Mis preguntas son:
1 - ¿Es buena idea hacer lo que estoy haciendo? ¿pongo simplemente la versión del 2.7 y ya está?

2 - ¿Cómo hago para definir una variable privada dentro del módulo y accederla dentro de las clases de dicho módulo?

Gracias, saludos.
9  Programación / .NET (C#, VB.NET, ASP) / Problema con BitBlt y C++/CLI en: 17 Octubre 2014, 21:42 pm
Hola a todos.

Tengo que usar la función BitBlt() en código C++/CLI. Lo he intentado de muchas formas y no consigo que funcione. Me da el error código 6 (invalid handle).
He leído bastantes posts etc. por internet, y para empezar veo que nadie que use esta función tiene que hacer un casting de IntPtr a HDC. Adjunto el código (comentado en inglés)

Código
  1. /*
  2. 1 - Get a bmp image from hard drive( i have it).
  3.  
  4. 2 - Copy it to byte array, or get its internal array, i have tested both ways (method1 and method2 in comments).
  5.  
  6. 3 - Prepare a PicutreBox and obtain from it my context device.
  7.  
  8. 4 - Use BitBlt function to copy only first 50 lines of the initial bitmap.
  9.  
  10. 5 - Display it in a windows form.
  11. */
  12.  
  13. #include "stdafx.h"
  14. #include <Windows.h>
  15. #include "MyForm.h"
  16. #include "string.h"
  17.  
  18. using namespace System;
  19. using namespace System::Runtime::InteropServices;
  20. using namespace System::Runtime::CompilerServices;
  21. using namespace System::IO;
  22. using namespace System::Windows::Forms;
  23. using namespace System::Drawing;
  24. using namespace System::Drawing::Imaging;
  25.  
  26. using namespace ConsoleApplication1;
  27.  
  28. [DllImport("gdi32.dll", CallingConvention = CallingConvention::StdCall, SetLastError = true)]
  29. extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
  30. IntPtr hdcSrc, int nXSrc, int nYSrc, long dwRop);
  31.  
  32. int main(array<System::String ^> ^args){
  33. Graphics ^gph = nullptr;
  34. try{
  35. //Get a test image and it's parameters
  36. Bitmap ^image = gcnew Bitmap("./img/Simple_tux0.bmp");
  37. int iWidth = image->Width;
  38. int iHeigth = image->Height;
  39. PixelFormat pxF = image->PixelFormat;
  40.  
  41.  
  42. //Prepare a PictureBo, whici will be given as parameter to Windows Form.
  43. PictureBox ^pb = gcnew PictureBox();
  44. pb->SizeMode = PictureBoxSizeMode::StretchImage;
  45. pb->Size = Drawing::Size(iWidth + 10, iHeigth + 10);
  46. pb->Location = Drawing::Point(3, 3);
  47.  
  48. //Get bitmap
  49. IntPtr prueba = image->GetHbitmap();
  50.  
  51. //Create my device context, where i will paint my lines.
  52. gph = pb->CreateGraphics();
  53. IntPtr deviceContext = gph->GetHdc();
  54.  
  55.  
  56. //Paint only 50 lines of the source Bitmap.
  57. BOOL b = BitBlt((HDC)deviceContext.ToPointer(), 0, 0, iWidth, 50,
  58. (HDC)prueba.ToPointer(), 0, 0, SRCCOPY);
  59.  
  60. //Get the error:
  61. unsigned long err = GetLastError();
  62. Console::WriteLine("error: {0}", err); //error 6 : Invalid Handle
  63.  
  64. //Create windows form with the PictureBox to display my 50 lines.
  65. MyForm ^f = gcnew MyForm(pb);
  66. Application::Run(f);
  67. Application::Exit();
  68. }
  69. finally{
  70. if (gph != nullptr){
  71. gph->ReleaseHdc();
  72. delete gph;
  73. }
  74.  
  75. }
  76. return 0;
  77. }
  78.  

He intentado usar también esto:

Código
  1. [DllImport("coredll.dll", EntryPoint = "CreateCompatibleDC")]
  2. extern IntPtr CreateCompatibleDC(IntPtr hdc);
  3.  
  4. [DllImport("coredll.dll", EntryPoint = "GetDC")]
  5. extern IntPtr GetDC(IntPtr hwnd);
  6.  
  7. int main(){
  8. //...
  9. //...
  10. IntPtr dc = GetDC(deviceContext);
  11. IntPtr compDc = CreateCompatibleDC(dc);
  12.  
  13. //Paint only 50 lines of the source Bitmap.
  14. BOOL b = BitBlt((HDC)compDc.ToPointer(), 0, 0, iWidth, 50,
  15. (HDC)prueba.ToPointer(), 0, 0, SRCCOPY);
  16.  

La primera pregunta que me surge es por qué yo tengo que hacer esto:
Código:
(HDC)deviceContext.ToPointer()
Y en todos los post que leo nadie lo hace.

Saludos, gracias.
10  Programación / .NET (C#, VB.NET, ASP) / Problema con modificación de un PictureBox desde el hilo generado por un Timer. en: 6 Octubre 2014, 00:00 am
Hola a todos.

Tengo un método en C# que actualiza el contenido de un PictureBox que recibe como parámetro, algo así:
Código:
void fun(PictureBox pb){
   pb.Image = (Image)this.bitMap; //bitMap es un objeto Bitmap.
}
El caso es que esa función la uso de callback en un Timer, para ir cambiando la imagen cada cierto tiempo.
Si todo el código anterior lo meto en el mismo Windows.Form donde está el PictureBox todo va bien.
El problema es que quiero sacar todo ese código a otra clase, y usar esta clase desde mi Windows.Form. Es cuando hago esto cuando todo falla.

El error que me da es: Unexpected “Bitmap Region is already Locked”.

He buscado bastante por internet y he intentado varias cosas:
1 - He probado con Timers.Timer y con Windows.Forms.Timer .
2 - He usado el keyword 'lock' en el método de callback.
3 - He leído algo de Invoke e InvokeRequired. PictureBox tiene el InvokeRequired a 'false' así que imagino que no tiene nada que ver con usar invoke.

¿Alguien sabe qué puedo hacer?

Gracias, saludos.
Páginas: [1] 2 3 4 5 6 7 8 9
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines