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

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10
21  Programación / ASM / Manual de Programación del BIOS, Volumen 1 de 3 en: 8 Enero 2017, 01:31 am


Link de descarga del manual (384 páginas, 100 Megabytes de JPG):
http://archive.org/download/Phoenix_PC_BIOS_Books/1_System%20BIOS%20PC%20and%20EISA%202ndEd.zip

Con este libro aprenderemos a programar el BIOS base de todas las PC estándar. Necesitamos saber llamar a las funciones del BIOS con ensamblador de NASM, TASM o MASM, con Turbo C++ o con inline assembly de los diferentes compiladores. Es una adición importante a referencias como la de Ralf Brown ya que muestra cada campo y servicio del BIOS base de forma limpia, proveniente de un fabricante principal de BIOS (Phoenix).

Este video contiene la vista previa del video y el audio del texto completo (fue procesado a computadora con OCR de Lucion File Converter y leído a MP3 con Balabolka así que se oye exactamente lo que la computadora interpretó).

El video está pensado para poder oír cada detalle que el libro contiene y así decidir si hay información especial de interés, haciendo un esfuerzo mínimo para leerlo.
22  Programación / Programación General / Cómo funcionan las compuertas lógicas XOR, con código en javascript. en: 28 Diciembre 2016, 00:24 am


La explicación del funcionamiento de la función XOR a nivel de compuertas lógicas es bastante simple.

En principio, tenemos como mínimo una entrada de 2 bits distintos.

El circuito XOR nos devolverá un 1 como resultado siempre y cuando ambos bits sean diferentes.

En la entrada, necesitamos usar una compuerta OR de 2 entradas.

También necesitamos una compuerta AND de 2 entradas en la entrada, y frente a esta una compuerta de negación para invertir el resultado de dicha compuerta AND.

La primera pata de entrada de la compuerta OR va a la primera pata de entrada de la compuerta AND invertida, y la segunda pata de la compuerta OR de entrada va a la segunda pata de la compuerta AND invertida de entrada.

En otras palabras, queremos obtener el resultado del OR y del AND invertido para los dos bits iniciales de entrada.

Los dos bits de resultado obtenidos por la compuerta OR y AND invertida los haremos pasar por una compuerta AND final de dos entradas.

El resultado de esta última AND será el valor XOR.


La intención de este circuito es usar el OR para detectar la presencia de un 1 y devolver un 1 como resultado; y la intención de la AND invertida es detectar la presencia de un 0 y devolver un 1 como resultado.

Las compuertas OR están orientadas a devolver un 1 cuando hay por lo menos un 1 de entrada.

Las compuertas AND están orientadas a devolver un 0 cuando hay por lo menos un 0 de entrada. Con la compuerta de negación obtenemos un 1 de la AND cuando hay un 0 presente.


Así que con el OR detectamos si hay un 1 presente, y devolvemos 1.
Con el AND detectamos si hay un 0 presente, y en ese caso obtenemos un 0 que invertimos para obtener un 1 en la presencia de un 0 de entrada.

Ahora, si hay un 1 presente, el OR nos devolverá 1.
Y si hay un 0 presente, el AND invertido nos devolverá 1.


Tomemos como ejemplo 11 binario.
Cuando la compuerta OR lo procese, obtendremos 1, que significa que hay un 1 presente en la entrada.
Ahora, cuando la compuerta AND procese los dos bits de entrada originales a 1, también devolverá un 1, pero la compuerta de negación invertirá ese resultado de 1 a 0 para indicar que no había ningún 0 presente en la entrada.
Cuando el 1 del OR y el 0 del AND invertido ingresen a la compuerta AND final, obtendremos un 0 en respuesta de la entrada original 11 binario. Esto indicará que ambos bits tenían el mismo valor.

Es como si el circuito XOR fuera una pregunta.: ¿Son ambos bits de entrada diferentes? La respuesta será un 1 para indicar VERDADERO si realmente son diferentes.
Ahora podemos ver claramente que si ambos bits de entrada son iguales como en este caso con 11 binario, el resultado devuelto por la función XOR será 0.



Tomemos otro ejemplo, con 10 binario.
La compuerta OR toma ambos bits, 1 y 0, y devuelve 1 ya que hay por lo menos un 1 presente.
La compuerta AND toma ambos bits 1 y 0, y devuelve 0 ya que hay por lo menos un 0 presente.
Pero con la compuerta de negación que le sigue a esta AND obtenemos un 1, lo que indica que hay un 0 presente.

Ahora, el bit con valor 1 de resultado de la OR, y el bit con valor 1 de la AND invertida entran en la última AND, la AND de salida, y ya que ambos bits son 1, devolvemos 1.
Lo que indica esto es que la OR tomó el 1 y el 0 y detectó la presencia de un 1, devolviendo 1.
También indica que la AND invertida tomó el 1 y el 0 y detectó la presencia de un 0, devolviendo 1.
Ya que el circuito OR y AND invertido nos indican por su lado que hay tanto un 1 como un 0 presentes, devolvemos un 1 para la función XOR del circuito completo, para indicar que ambos bits eran diferentes.

Como vemos también, al nivel más fundamental siempre operamos las compuertas de 2 en 2, así que resolver será fácil. Incluso en la aritmética decimal normal operamos de 2 en 2 al nivel lógico más simple.

El siguiente código de javascript demuestra cómo se vería implementada como programa la función lógica del circuito XOR. Siempre que los 2 bits de entrada sean iguales, el programa devolverá 0. Si son diferentes, este devolverá 1.

Paso 1.: Necesitamos 2 variables de entrada de por lo menos 1 bit de tamaño.
Paso 2.: Aplicamos OR entre ambas variables de entrada.
Paso 3.: Aplicamos AND entre ambas variables, y negamos los valores de bits del resultado.
Paso 4.: Aplicamos AND al resultado del OR y del NAND. Este es el valor XOR.


La mayoría de lenguajes de programación y ensambladores tienen operadores o instrucciones XOR. Estas son especialmente útiles para generar código más breve que asigne 0 a una variable o registro al aplicarle XOR con su mismo valor. Como hemos visto, ya que todos los bits serán los mismos al usar el mismo registro del procesador o variable de memoria como primer y segundo operando para la XOR, todos los bits quedarán a cero para indicar que todos eran iguales.



Código:
javascript:

/* Paso 1: Necesitamos 2 variables de entrada de por lo menos 1 bit de tamaño. */
var bits_A = 1;
var bits_B = 1;

var OR_0        = bits_A|bits_B;     /* Paso 2: Aplicamos OR entre ambas variables de entrada. */
var NAND_0      = ~(bits_A&bits_B);  /* Paso 3: Aplicamos AND entre ambas variables, y negamos los valores de bits del resultado. */
var XOR_AND_OUT = OR_0&NAND_0;       /* Paso 4: Aplicamos AND al resultado del OR y del NAND. Este es el valor XOR. */

alert(XOR_AND_OUT);

void(0);

23  Foros Generales / Foro Libre / Curso de Verano para Repasar Física, Matemática y Técnicas de Estudio en: 24 Diciembre 2016, 11:02 am
http://archive.org/download/CursoAdmisionITCA/2016.html
http://archive.org/download/CursoAdmisionITCA/2016.html
http://archive.org/download/CursoAdmisionITCA/2016.html
http://archive.org/download/CursoAdmisionITCA/2016.html


Saludos.

Aquí mando un curso de admisión que acabo de estudiar para tratar de entrar a una carrera técnica y aprender de cómo implementar dispositivos de hardware para PC.

Es un repaso básico de Física, Matemática y Técnicas de Estudio, pero podría servir para volver a encender esos recuerdos y que ya no cuesten tanto.

También pienso poner el 100% de esa carrera en línea gratis en caso de que realmente logre estudiarla, así que voy a estar mandándote las clases de esa carrera para que también te quede una copia entera de esa carrera, en videos de YouTube, escaneos en el Archive.org y otros posibles sitios de recursos.

Me gustaría ver el contenido de otras carrera. Todos nos beneficiaríamos, Poner carreras enteras gratis parece no ser tan difícil pero parece ser algo nunca antes visto en internet, así que atraería mucha atención y ganancias.


Una cosa que vale la pena mencionar es que en Física siempre empezamos por estudiar las unidades de medida y la conversión de unidades.

También cabe mencionar que para quien sea programador, estudiar ayudándose como mínimo de programas en javascript e interfaces HTML para calcular y hacer herramientas para automatizar y usar las diferentes fórmulas y conceptos, es una gran ventaja.
24  Programación / Programación General / Curso - Calculando el Calendario Mentalmente (Semana 4) en: 21 Octubre 2016, 12:16 pm
Semana 4
Parte 4 - Documentos Originales de la Creación del Método (Año 2000)




Citar
http://archive.org/download/MentalCalendar/calendarcalc.zip

Este video contiene una referencia a los documentos originales en donde se explica este método para calcular el calendario mentalmente, el cual fue creado allá en el año 2000. También contiene un documento adicional que explica adicionalmente cómo calcular cualquier fecha, y que fue creado el 2014 en Español e Inglés.
25  Programación / Programación General / Re: Curso - Calculando el Calendario Mentalmente en: 17 Octubre 2016, 11:04 am
Semana 3
Parte 3 - Programa para Obtener el Primer Día de Semana, y el Número de Días de Ese Año



Citar
http://archive.org/download/MentalCalendar/yearinit.html

Este es un programa HTML pensado para correr en un navegador web de una computadora de escritorio, teléfono, tablet o Palm.

Este es un programa HTML pensado para correr en un navegador web de una computadora de escritorio, teléfono, tablet o Palm.

Solo necesitamos especificar el número del año y con eso obtendremos el nombre del primer día de semana de ese año y el número de días de ese año para saber si es bisiesto (366 días) o no (365 días).

Junto con nuestras técnicas de cálculo mental del calendario, esto es todo lo que necesitamos para calcular cualquier día de cualquier año de la historia.

Tambíén podríamos implementar como programa las técnicas puramente mentales, para calcular los valores de cualquier año para una aplicación o applet de calendario.

26  Programación / Programación General / Curso - Calculando el Calendario Mentalmente (Semana 2) en: 8 Octubre 2016, 05:27 am
Parte 2
Semana 2




Calculando el Calendario Mentalmente.
Calculando Libremente para Cualquier Mes.

Citar
Debemos recordar el primer día de semana del año, si es bisiesto, y la siguiente secuencia de números a continuación. Si el año no es bisiesto, debemos calcular normalmente la secuencia de principio de mes y luego restar 1, y esto aplica a partir de Febrero.

Esta secuencia aplica con 0 para Enero ya que es el punto inicial, y luego desde Febrero hasta el primer día del siguiente año.

Para saber manualmente si el año es bisiesto, simplemente necesitamos ver si Febrero es de 29 días. Si es de 28 días, entonces no es bisiesto.

También en general, si el año es exactamente divisible entre 4 entonces es bisiesto. Esto puede no aplicar para todos los años existentes, pero es la consideración mínima que podemos determinar calculando solo mentalmente de forma simple.

Debemos aprender la siguiente secuencia de números para poder calcular el día inicial para cualquiera de los meses. Cada uno de estos números corresponde a cada uno de los meses del año, desde Enero a Diciembre, y el último número individual corresponde al primer día del siguiente año:

0, 3, 5, 1.
3, 6, 1, 4.
7, 2, 5, 7.
3.

Ejemplos de años bisiestos son 2000, 2004, 2008, etc.

Podríamos aprender:
- El número de un año especial específico. Por ejemplo 1984.
- El primer día de semana de ese año. Domingo en este caso.
- Y si es bisiesto al ver si Febrero tiene 29 días. En este caso sí.

Solo con eso y con nuestras técnicas hasta ahora podemos ahora calcular cualquier día de ese año.



Ahora trata de determinar el primer día de Noviembre y el 2 de Noviembre del 2016. 2016 empezó en Viernes, es bisiesto porque Febrero tiene 29 días. 2016 es divisible exactamente entre 4.

Para Noviembre corresponde avanzar 5 días y como es bisiesto tenemos que avanzar esos 5 días en lugar de 4 días, para reflejar que el 29 de Febrero está presente. Así que como empezamos en el primer día del año:

Viernes.

Si avanzamos 5 días después, desde el día inicial del año, tenemos:

Viernes, Sábado, Domingo, Lunes, Martes.
Así que el 1 de Noviembre del 2016 cae en Martes, y obviamente el 2 de Noviembre cae en Miércoles.

27  Programación / Programación General / Curso - Calculando el Calendario Mentalmente en: 1 Octubre 2016, 20:23 pm
Semana 1 - Calculando el Calendario Mentalmente.
Aprendiendo la Secuencia de los Días 1-31.




Este es un curso corto sobre un algoritmo para calcular el calendario usando solo cálculos mentales de aritmética simple.

Actualmente solo hay un video para la Semana 1, pero eso debería dar suficiente tiempo para entender cada parte del curso de una forma realmente detallada.

El algoritmo es muy liviano así que es adecuado para permitir su uso y cálculos mentales con este, así que también debería ser extremadamente simple, optimizado y ligero si se usa para implementar una aplicación de administración de fecha, por ejemplo en un BIOS de código abierto o en un kernel.

No se trata de calcular un timestamp sino que de los números en cuestión 1-31 y sus nombres de día de semana correspondientes.
Citar
Calculando el Calendario Mentalmente.
Aprendiendo la Secuencia de Días del 1 al 31.



La primera cosa que necesitamos aprender para calcular el calendario mentalmente, es aprender la secuencia de los días en orden vertical. Esto nos permitirá alcanzar todas las semanas rápidamente para cualquier día, también nos permitirá obtener todos los números de días para cada día de la semana.

La única otra cosa que nunca debemos olvidar es el nombre de día de semana en el que comienza el mes, y también el número de días de ese mes. Simplemente debemos memorizar eso, y normalmente es suficiente memorizar eso para el mes actual. A medida pase el tiempo, nos resultará más rutinario recordar esos detalles.

Tenemos meses con 28, 29, 30 y 31 días, pero si aprendemos la secuencia de 31 días podremos calcular cualquier día de meses más cortos.

La siguiente es la secuencia verbal que necesitamos aprender. Una única línea es la secuencia para un único día de semana. El mes puede iniciar en cualquier día, así que la secuencia para el día 1 o el resto de días puede caer en cualquier día de semana:

1, 8,  15, 22, 29.
2, 9,  16, 23, 30.
3, 10, 17, 24, 31.
4, 11, 18, 25.
5, 12, 19, 26.
6, 13, 20, 27.
7, 14, 21, 28.

Simplemente memoriza los números anteriores y mira si puedes luego inspeccionar el calendario para el mes actual y hacer concordar esta secuencia con la secuencia para el mes en cuestión en que estás interesado. Solo hay 7 días de la semana, así que esta lista solo puede empezar en 7 formas diferentes, pero esta misma secuencia se usa siempre para las 7 combinaciones.

Ahora mira si puedes determinar el primer día de semana sin ver el calendario, y también el último día. Practica con otros días a medida que los necesites.


Determinando el Último Día.

Tenemos meses con 28, 29, 30 y 31 días.
Los meses de 28 días terminan el día de semana antes del que empezaron.
Los meses de 29 días terminan el día de semana en el que empezaron.
Los meses de 30 días terminan el siguiente día de semana del que empezaron.
Los meses de 31 días terminan dos días de semana después del que empezaron.

El primer día del siguiente mes es simplemente el siguiente día de semana para cualquiera de los últimos días de semana que acabamos de describir.

Ahora mira si puedes calcular el último día de semana para este mes y luego el primer día de semana para el siguiente mes al avanzar al siguiente día de semana.

Ahora también trata de calcular el día de semana de varios cumpleaños o días de semana de fechas en las que necesites terminar o pagar algo. También trata de calcular los días de semana para el Sábado o Domingo siguientes.

28  Informática / Hardware / Re: Programar el puerto paralelo en Windows con inpout32.dll y hwinterface.sys 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
29  Informática / Hardware / Programar el puerto paralelo en Windows con inpout32.dll y hwinterface.sys en: 9 Abril 2016, 04:06 am
Programar el puerto paralelo en Windows

Descargar 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:

>> Ver Tutorial Animado de Código de 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]

inpout32_source_and_bins.zip [Mirror 2]


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:





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.  
30  Programación / Programación C/C++ / SQLite3 Amalgamation y C: Visor de Archivos y URLs al Azar en: 4 Abril 2016, 21:07 pm
filesopen Espera_aleatoria_minima Espera_aleatoria_maxima Nombre_base_de_datos Numero_de_fila_de_configuracion

Aquí tengo un programa de consola que escribí, que abre automáticamente y al azar archivos locales o URLs tomadas de una base de datos SQLite3 la cual maneja por sí misma usando la librería de Amalgamación de SQLite3.

Está completamente escrita en C y funciona bajo Windows (aunque tal vez pueda funcionar bajo Wine).

Aquí está el binario compilado:
FILESOPEN.EXE

Aquí se puede ver y aprender a escribir un programa en C básico para manejar una base de datos SQLite3:
>> Grabación de Texto para el Visor Aleatorio de Archivos y URLs <<

La estructura documentada y el uso de la base de datos está contenido en dicha grabación de la escritura del código.

Se puede hacer una prueba del funcionamiento con la siguiente base de datos que contiene más de 2 millones de nombres de dominio provenientes de la lista diaria de 1 millón de sitios más importantes de Alexa:
domains_alexaranks.db

Para correr el programa, solo se necesita el siguiente comando:
Código:
filesopen 1 1 domains_alexaranks.db 1



Aquí está el código principal (compilado bajo MinGW):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include "SQLite3-Amalgamation-3.12.0/sqlite3.h"
  5. #include "SQLite3-Amalgamation-3.12.0/sqlite3.c"
  6. #include "SQLite3-Amalgamation-3.12.0/sqlite3ext.h"
  7. #include <windows.h>
  8.  
  9. const char sqlite3_version[] = SQLITE_VERSION;
  10.  
  11. //Set default values for the number of table rows and for the current column
  12. //this last one will be selected at random:
  13. ///
  14. int SQLite3_Row_Ctr=1;
  15. int SQLite3_Current_Row=1;
  16.  
  17. sqlite3      *SQLite3_DB_Obj;
  18. sqlite3_stmt *SQLite3_State;
  19. int           SQLite3_DB_Res_Handle;
  20. char         *SQL_String;
  21. char         *SQLite3_ErrorMsg=NULL;
  22. char         *SQLite3_zTail_String;
  23.  
  24.  
  25.  
  26. //These are the default minimum and maximum number of minutes to wait
  27. //before trying to open other file/directory entry:
  28. ///
  29. int minwait=1;
  30. int maxwait=1;
  31.  
  32.  
  33. long minmax_rand(long min, long max)
  34. {
  35. return rand()%((max+1) - min) + min;
  36. }
  37.  
  38.  
  39. char *config_tablename;
  40. char *config_datarowname;
  41. char *config_idrowname;
  42. char *config_fileprotocol;
  43.  
  44. static int SQLite3_Callback_config(void *NotUsed, int argc, char **argv, char **azColName)
  45. {
  46. config_tablename=malloc(512);
  47. config_datarowname=malloc(512);
  48. config_idrowname=malloc(512);
  49. config_fileprotocol=malloc(512);
  50.  
  51. sprintf(config_tablename,"%s",argv[0]);
  52. sprintf(config_datarowname,"%s",argv[1]);
  53. sprintf(config_idrowname,"%s",argv[2]);
  54. sprintf(config_fileprotocol,"%s",argv[3]);
  55.  
  56.  
  57. printf("Getting database configuration...\n");
  58. printf("tablename=%s\ndatarowname=%s\nidrowname=%s\nfileprotocol=%s\n\n", config_tablename, config_datarowname, config_idrowname, config_fileprotocol);
  59.  
  60.  
  61. return 0;
  62. }
  63.  
  64.  
  65. static int SQLite3_Callback(void *NotUsed, int argc, char **argv, char **azColName)
  66. {
  67. int x=0;
  68. int requiredSize=0;
  69. int   openstrlen=0; char *cmd=NULL;
  70. char *cmd2=NULL;
  71. char *openstr="open";
  72. char *openstrW;
  73. char *explorerstr="C:\\WINDOWS\\explorer.exe";
  74. char *explorerstrW;
  75.  
  76. int   execres=0;
  77.  
  78. openstrW=malloc(131072);
  79. explorerstrW=malloc(131072);
  80. cmd=malloc(131072);
  81. cmd2=malloc(131072);
  82.  
  83. MultiByteToWideChar(
  84.                     (UINT)CP_UTF8,
  85.                     (DWORD)0,
  86.                     (LPCSTR)explorerstr,
  87.                     (int)-1,
  88.                     (LPWSTR)explorerstrW,
  89.                     (int)131072
  90.                    );
  91.  
  92. MultiByteToWideChar(
  93.                     (UINT)CP_UTF8,
  94.                     (DWORD)0,
  95.                     (LPCSTR)openstr,
  96.                     (int)-1,
  97.                     (LPWSTR)openstrW,
  98.                     (int)131072
  99.                    );
  100.  
  101.  
  102.  
  103.  
  104. for(x=0; x<argc; x++)
  105. {
  106.  snprintf(cmd,131072,"\"%s%s\"",config_fileprotocol,argv[x]);
  107.  
  108. /*
  109. int MultiByteToWideChar(
  110.   _In_      UINT   CodePage,
  111.   _In_      DWORD  dwFlags,
  112.   _In_      LPCSTR lpMultiByteStr,
  113.   _In_      int    cbMultiByte,
  114.   _Out_opt_ LPWSTR lpWideCharStr,
  115.   _In_      int    cchWideChar
  116. );
  117. */
  118.  MultiByteToWideChar(
  119.                      (UINT)CP_UTF8,
  120.                      (DWORD)0,
  121.                      (LPCSTR)cmd,
  122.                      (int)-1,
  123.                      (LPWSTR)cmd2,
  124.                      (int)131072
  125.                     );
  126.  
  127.  printf("%ld: %s\n\n", SQLite3_Current_Row, cmd);
  128.  
  129. /*
  130. HINSTANCE ShellExecute(
  131.   _In_opt_ HWND    hwnd,
  132.   _In_opt_ LPCTSTR lpOperation,
  133.   _In_     LPCTSTR lpFile,
  134.   _In_opt_ LPCTSTR lpParameters,
  135.   _In_opt_ LPCTSTR lpDirectory,
  136.   _In_     INT     nShowCmd
  137. );
  138.  
  139. */
  140.  
  141.  execres=(int)ShellExecuteW(
  142.                (HWND)0,
  143.                (LPCWSTR)openstrW,
  144.                (LPCWSTR)explorerstrW,
  145.                (LPCWSTR)cmd2,
  146.                (LPCWSTR)NULL,
  147.                (INT)SW_SHOWNORMAL
  148.               );
  149.  
  150.  
  151.  switch(execres)
  152.  {
  153.   case 0:
  154.   printf("exec: 0");
  155.   break;
  156.  
  157.   case ERROR_BAD_FORMAT:
  158.    printf("exec: ERROR_BAD_FORMAT");
  159.   break;
  160.  
  161.   case SE_ERR_ACCESSDENIED:
  162.    printf("exec: SE_ERR_ACCESSDENIED");
  163.   break;
  164.  
  165.   case SE_ERR_ASSOCINCOMPLETE:
  166.    printf("exec: SE_ERR_ASSOCINCOMPLETE");
  167.   break;
  168.  
  169.   case SE_ERR_DDEBUSY:
  170.    printf("exec: SE_ERR_DDEBUSY");
  171.   break;
  172.  
  173.   case SE_ERR_DDEFAIL:
  174.    printf("exec: SE_ERR_DDEFAIL");
  175.   break;
  176.  
  177.   case SE_ERR_DDETIMEOUT:
  178.    printf("exec: SE_ERR_DDETIMEOUT");
  179.   break;
  180.  
  181.   case SE_ERR_DLLNOTFOUND:
  182.    printf("exec: SE_ERR_DLLNOTFOUND");
  183.   break;
  184.  
  185.   case SE_ERR_FNF:
  186.    printf("exec: SE_ERR_FNF");
  187.   break;
  188.  
  189.   case SE_ERR_NOASSOC:
  190.    printf("exec: SE_ERR_NOASSOC");
  191.   break;
  192.  
  193.   case SE_ERR_OOM:
  194.    printf("exec: SE_ERR_OOM");
  195.   break;
  196.  
  197.   case SE_ERR_SHARE:
  198.    printf("exec: SE_ERR_SHARE");
  199.   break;
  200.  }
  201.  
  202.  
  203.  sleep(60*(int)minmax_rand(minwait,maxwait));
  204. }
  205.  
  206. free(cmd);
  207. free(cmd2);
  208. free(openstrW);
  209. free(explorerstrW);
  210.  
  211.  
  212. return 0;
  213. }
  214.  
  215.  
  216. static int SQLite3_Callback2(void *NotUsed, int argc, char **argv, char **azColName)
  217. {
  218. SQLite3_Row_Ctr=atol(argv[0]);
  219. return SQLite3_Row_Ctr;
  220. }
  221.  
  222.  
  223.  
  224. void clear_state()
  225. {
  226. //NOTE: This is for the good practice of not leaving
  227. //      freeing of resources or other default operations
  228. //      at their default state but accelerate and ensure
  229. //      the global sanity of the environment and the program
  230. //      by specifying every operation exactly as we want it:
  231. ///
  232. sqlite3_finalize(SQLite3_State);
  233. sqlite3_close(SQLite3_DB_Obj);
  234. free(SQL_String);
  235.  
  236. }
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243. int main(int argc, char *argv[])
  244. {
  245. atexit(clear_state);
  246. SQL_String=malloc(4096);
  247.  
  248.  
  249.  
  250. if(argc>=5)
  251. {
  252.  if(!(minwait=atoi(argv[1])))minwait=1;
  253.  if(!(maxwait=atoi(argv[2])))maxwait=1;
  254. }
  255.  else
  256.  {
  257.   printf("Usage: filesopen min_minutes max_minutes SQLITE3_Database_Path Database_Config_ID\n\n");
  258.   return -2;
  259.  }
  260.  
  261.  
  262. //Open the database and see if it was successful. If not, just exit the program:
  263. ///
  264.  SQLite3_DB_Res_Handle=sqlite3_open(argv[3], &SQLite3_DB_Obj);
  265.  
  266.  if(SQLite3_DB_Res_Handle!=SQLITE_OK)
  267.  {
  268.   printf("Error opening database\n\n");
  269.   return -1;
  270.  }
  271.  
  272.  
  273.  //Get the configuration of the database to use the proper table and field names,
  274.  //as well as basic formatting for the data:
  275.  ///
  276.   snprintf(SQL_String, 4096, "SELECT tablename,datarowname,idrowname,fileprotocol FROM config WHERE configid=%s LIMIT 1", argv[4]);
  277.   SQLite3_DB_Res_Handle=sqlite3_exec(
  278.                                      SQLite3_DB_Obj,
  279.                                      SQL_String,
  280.                                      SQLite3_Callback_config,
  281.                                      SQLite3_zTail_String,
  282.                                      &SQLite3_ErrorMsg
  283.                                     );
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291. //Get all columns for the first time to count them.
  292. //Its callback will return the count in SQLite3_Row_Ctr:
  293. ///
  294.  snprintf(SQL_String, 4096, "SELECT COALESCE(MAX(%s)+1, 0) FROM %s", config_idrowname, config_tablename);
  295.  SQLite3_DB_Res_Handle=sqlite3_exec(
  296.                                     SQLite3_DB_Obj,
  297.                                     SQL_String,
  298.                                     SQLite3_Callback2,
  299.                                     SQLite3_zTail_String,
  300.                                     &SQLite3_ErrorMsg
  301.                                    );
  302.  
  303. printf("Cycling through %ld files...\n", SQLite3_Row_Ctr);
  304.  
  305.  
  306. while(1)
  307. {
  308.  //Go to next row (selected randomly):
  309.  ///
  310.   SQLite3_Current_Row=minmax_rand(1, SQLite3_Row_Ctr);
  311.  
  312.  
  313.  //Get random files to open:
  314.  ///
  315.   snprintf(SQL_String, 4096, "SELECT %s FROM %s WHERE %s=%ld LIMIT 1", config_datarowname, config_tablename, config_idrowname, SQLite3_Current_Row);
  316.   SQLite3_DB_Res_Handle=sqlite3_exec(
  317.                                      SQLite3_DB_Obj,
  318.                                      SQL_String,
  319.                                      SQLite3_Callback,
  320.                                      SQLite3_zTail_String,
  321.                                      &SQLite3_ErrorMsg
  322.                                     );
  323.  
  324.  
  325.  //If there was a database error or fault, just end:
  326.  ///
  327.   if(SQLite3_ErrorMsg)return 0;
  328. }
  329.  
  330.  
  331. return 0;
  332. }
  333.  
  334.  
Páginas: 1 2 [3] 4 5 6 7 8 9 10
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines