Foro de elhacker.net

Informática => Hardware => Mensaje iniciado por: ~ en 9 Abril 2016, 04:06 am



Título: Programar el puerto paralelo en Windows con inpout32.dll y hwinterface.sys
Publicado por: ~ en 9 Abril 2016, 04:06 am
Programar el puerto paralelo en Windows

(http://devel.archefire.org/favicons/www.winzip.com.ico) Descargar lpthandler.tar (http://devel.archefire.org/TextRecordings/lpthandler.tar)

Solo necesitamos conectar un LED entre el pin 9 y el 22 del paralelo.

O como muestra el esquema, entre cualquiera de los pines anaranjados (los pines de datos) y cualquiera de los pines grises (pines de polo a Tierra, GND). Tenemos un total de 16 de esos pines, 2 pines por bit de datos para poder conectar las 2 patas de un LED u otro dispositivo.

Asegurarse de poner el LED en la polaridad correcta, o darle vuelta, o simplemente no va a dejar pasar la electricidad y no va a encender.


Uso de este programa para encender todos los 8 LEDS:
Código:
lpthandler.exe 3bc 11111111

   o sino el puerto 378
lpthandler.exe 378 11111111

   o sino el puerto 278
lpthandler.exe 278 11111111

Uso de este programa para apagar todos los 8 LEDS:
Código:
lpthandler.exe 3bc 00000000

   o sino el puerto 378
lpthandler.exe 378 00000000

   o sino el puerto 278
lpthandler.exe 278 00000000

Cada uno de los 8 bits a escribir debe ser un 1 o 0.
Un 0 apaga y un 1 enciende.


Código
  1. /*
  2.  En resumen solo necesitamos:
  3.  
  4.   Out32(Direccion_Base_Puerto_Paralelo+2, 0);          //Resetear Puerto de Control
  5.   Out32(Direccion_Base_Puerto_Paralelo,   0xFF-0x00);  //Escribir el Puerto de Datos
  6. */
  7.  
  8.  
  9.  
  10. //Aquí, la Direccion_Base_Puerto_Paralelo
  11. //puede ser:
  12. //          0x3BC -- LPT1
  13. //          0x378 -- LPT1
  14. //          0x278 -- LPT2
  15. ///
  16.  
  17. //Necesitamos resetear el Puerto de Control escribiéndole un 0
  18. //para configurar sus opciones, controladas por cada uno de
  19. //sus bits:
  20. ///
  21.  Out32(Direccion_Base_Puerto_Paralelo+2, 0);
  22.  
  23. //Enviamos un valor entre 0 y 255 al puerto de Datos:
  24. ///
  25.  Out32(Direccion_Base_Puerto_Paralelo,   0xFF-0x00);
  26.  

Por si no se entiende el código, se puede ver cómo se escribió en tiempo real, carácter por carácter como en la programación original:
sJRbGohmA3M

>> Ver Tutorial Animado de Código de lpthandler.c <<
(http://devel.archefire.org/TextRecordings/Manejo del Puerto Paralelo.png) (http://devel.archefire.org/TextRecordings/Manejo del Puerto Paralelo.html#      Manejo del Puerto Paralelo/src/win32/lpthandler.c)




Lo primero son los binarios y el código fuente del driver de acceso general a bajo nivel:

inpout32_source_and_bins.zip [Mirror 1] (https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiS_cXd7PzLAhVIXR4KHdW9BgYQFggdMAA&url=http%3A%2F%2Fen.osdn.jp%2Fprojects%2Fsfnet_andresprogs%2Fdownloads%2FOldFiles%2Finpout32_source_and_bins.zip%2F&usg=AFQjCNGH5ybdR8uSPIeMkiXd-LH2jys90w)

inpout32_source_and_bins.zip [Mirror 2] (http://devel.archefire.org/programming/Windows/drivers/inpout32_source_and_bins.zip)


Después necesitamos saber qué direcciones de I/O tiene el puerto paralelo. Los puertos de I/O son como direcciones de memoria que van desde 0 hasta 65535. Cada una de esas posiciones podemos enviar 1, 2 o 4 bytes, o nosotros podemos recibir 1, 2 o 4 bytes. Por ahora solo vamos a enviar 1 byte a la vez.



El LPT1 está en el puerto (0x378, 378h)(888 decimal) o (0x3BC, 3BCh)(956 decimal).

El LPT2 está en el puerto (0x278, 278h)(632 decimal).

El LPT3 está en el puerto (0x3BC, 3BCh)(956 decimal).

El puerto paralelo es un periférico de 8 bits, así que usa 8 pines de datos para representar los 8 bits de cada byte (ya que usa datos y señales en paralelo, simultáneos), y esos son los pines que manipulamos con encendido o apagado cada vez que escribimos, por ejemplo, al puerto 0x378 (Los Pines Anaranjados, del 2 al 9):





Conector Hembra, en la Tarjeta Madre:
(http://devel.archefire.org/tmp/parallel__0000.png)




Ahora necesitamos usar void _stdcall Out32(short PortAddress, short data), que viene del driver inpout32.dll y hwinterface.sys.

Algo como esto:
Código:
Out32(378h, 255-0);




El código completo es el siguiente:
Código
  1. //NOTE: Compile with GCC under MinGW.
  2. //
  3. // gcc lpthandler.c -o lpthandler.exe
  4. //
  5. //Usage:
  6. // lpthandler.exe LPT_Port Byte_Bit_Data
  7. //
  8. // LPT_Port:
  9. //  - can be 3bc, 378 or 278
  10. //
  11. // Byte_Bit_Data:
  12. //  - can range from 00000000 to 11111111 (written like that, in binary).
  13. //    Every bit controls one of 8 LEDs.
  14. //
  15. // LEDs are connected between DATA and GROUND lines.
  16. // DATA to GROUND lines are connected like this, for pins:
  17. //
  18. // DATA is + and GROUND is -
  19. //
  20. //  2-18
  21. //  3-19
  22. //  4-20
  23. //  5-21
  24. //  6-22
  25. //  7-23
  26. //  8-24
  27. //  9-25
  28. //
  29. // Remember to set the parallel ports as Standard/Normal in the BIOS
  30. // to ensure proper working of the basics with this program.
  31. ///
  32.  
  33. #include <stdio.h>
  34. #include <windows.h>
  35.  
  36. typedef short _stdcall (*_Out32)(short portaddr, short value);
  37. typedef short _stdcall (*_Inp32)(short portaddr);
  38.  
  39. int main(int argc, char *argv[])
  40. {
  41. HINSTANCE INPOUT32_DLL_Handle;
  42. _Inp32 Inp32;
  43. _Out32 Out32;
  44.  
  45.  
  46. //Load the inpout32.dll library. It's also associated
  47. //with hwinterface.sys, but it should open it by itself:
  48. ///
  49.  INPOUT32_DLL_Handle=LoadLibrary("inpout32.dll");
  50.  if(INPOUT32_DLL_Handle == NULL)
  51.  {
  52.   printf("LoadLibrary failed for inpout32.dll...\n\n");
  53.   return -1;
  54.  }
  55.  
  56.  
  57. //Get access to the Out32/Inp32 functions from inpout32.dll:
  58. ///
  59.  Out32 = (_Out32)GetProcAddress(INPOUT32_DLL_Handle, "Out32");
  60.  Inp32 = (_Inp32)GetProcAddress(INPOUT32_DLL_Handle, "Inp32");
  61.  
  62. //NOTE: The following two lines are the actual logic of the program
  63. //      and are at the top of importance and the program's key logic.
  64. //      Everything else could be considered API noise:
  65.  
  66. //Configure the CONTROL Port with a 0 to sanitize the port state:
  67. ///
  68.  Out32(strtol(argv[1],NULL,16)+2, 0);  //Bit 0: Strobe
  69.                                        //Bit 1: Auto Line Feed
  70.                                        //Bit 2: Initialize Printer
  71.                                        //Bit 3: Select Printer
  72.                                        //Bit 4: Enable IRQ Via Ack Line
  73.                                        //Bit 5: Enable Bi-Directional Port
  74.                                        //Bit 6: Unused
  75.                                        //Bit 7: Unused
  76.  
  77.  
  78.  
  79. //Write the Data port with the desired 8-bit value:
  80. ///
  81.  Out32(strtol(argv[1],NULL,16), strtol(argv[2],NULL,2));
  82.  
  83.  
  84. //Unload our inpout32.dll library:
  85. ///
  86.  FreeLibrary(INPOUT32_DLL_Handle);
  87.  
  88. return 0;
  89. }
  90.  
  91.  


Título: Re: Programar el puerto paralelo en Windows con inpout32.dll y hwinterface.sys
Publicado por: ~ en 9 Abril 2016, 04:13 am
Programar el Puerto Paralelo en Windows, Parte 2

Este simplemente es la grabación en video de la grabación de texto para conveniencia y para anidar aquí mismo en los mensajes del foro la grabación, además de también mostrar unos pocos detalles extra durante y fuera de la grabación de texto:

Basics of Parallel Port Programming Under Windows, Part 2 of 2 (http://www.youtube.com/watch?v=zAxeCLuWZCk)
zAxeCLuWZCk


Título: Re: Programar el puerto paralelo en Windows con inpout32.dll y hwinterface.sys
Publicado por: Hason en 20 Abril 2016, 14:26 pm
Hola , saludos, estoy mirando esto, y no me queda claro , que puedo hacer con esto.

Haber, ¿con el puerto paralelo podria reflasear los drivers de la placa base  si no tengo acceso normalmente?

Agradeceria mayor información.

Un saludo.