• Jueves 14 de Noviembre de 2024, 22:38

Autor Tema:  Leer La Temperatura Del Pc  (Leído 6595 veces)

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Leer La Temperatura Del Pc
« en: Miércoles 16 de Agosto de 2006, 21:12 »
0
Primero, hola a todos  :hola:

Hace ya mucho tiempo que comencé un hilo sobre este tema.... la posibilidad de leer la temperatura de la placa base (motherboard) mediante un programa en C.  Por lo que sé no es una simple curiosidad que yo tengo sino que hay bastante gente que le interesa esta información...  
Por aquel entonces quería hacer un proyecto para la universidad, ahora que ya estoy trabajando tengo más tiempo para perder en estas cositas, así que lo que fué un proyecto inacabado se ha convertido en un objetivo de pura cabezonería

Bueno, ultimamente he retomado mis indagaciones y parece que he conseguido lo imposible...  POR FIN LEO LAS TEMPERATURAS!!!!  :comp:

Bien, el tema es bastante espeso, así que iré posteando todas mis averiguaciones sobre este hilo, si a los moderadores no les importa.  :rolleyes:

Ahora mismo estoy peleandome con las lecturas de Voltajes y velocidades de los ventiladores...  Iré posteando todo lo que saco.

Antes de que nadie se alegre demasiado he de decir que tan sólo funciona con placas base que tengan el Super IO chip ITE8712... Mirad el manual de la placa base o bajaros algún programa que sondee el hardware de vuestro sistema para comprobar qué tipo de SuperIO chip teneis.

La idea de este hilo es que cada uno vaya haciendo averiguaciones con su propia placa (y su propio IO chip) y así lo que ha empezado siendo una cuestión de cabezonería se convierta en todo un proyecto...

Por internet no hay demasiada información al respecto, así que voy a contar todo lo que he logrado y sobre todo cómo lo he logrado... :smartass:
Al fin y al cabo compartir es vivir y si puedo arrojar luz sobre este tema tan oscuro pues mejor que mejor... :D


No tengo todo el tiempo que necesitaría para escribir todo así que voy a ir escribiendo poco a poco en distintos mensajes...

PASOS PREVIOS:
--------------------
- Primero y antes que nada debemos saber un par de cosas sobre cómo funcionan las placas base, sobre todo cómo son capaces de darnos esa información que aparece en la bios en la parte de hardware monitor:
   
En nuestra placa base hay una serie de sensores montados, miden la temperatura del micro, de la placa, del chipset, miden las revoluciones de los ventiladores y permiten modificar su velocidad mediante PWM (modulación por ancho de pulso), miden las temperaturas que llegan al micro... +5v, -5v, +12v, -12v, +3,3v...

Bueno pues todos estos elementos suelen estar conectados a un chip llamado SuperIO chip, que se encarga de además de realizar estas tareas manejar los puertos serie y paralelo, los infrarojos, lectura de tarjetas de memoria...
Esto es, se encargan de controlar todo lo que es IO (entradas/salidas) de nuestro PC.

- Una vez dicho esto, el segundo paso será conocer el tipo de SuperIO chip que tiene nuestra placa base (si es que lo tiene), hay bastantes marcas y cada marca tiene un monton de modelos distintos:
Ali,ITE,National Semi Conductor (NS), SIS, SMC, Winbond...

Los más conocidos sin duda son los ITE y los Winbond.  Si vuestra placa es de cierta calidad seguro que los llevan.

Para poder saber qué tipo de SuperIOchip teneis, lo mejor es o bien leer el manual de vuestra placa o bien bajaros un programa que os lo diga.
Os recomiendo que os bajeis el programa Speedfan está realizado por un tal Alfredo Milani y es gratuito.  Además os servirá para comprobar si el programa que hacemos hace las mediciones correctamente o no.


- Bueno pues los pasos previos están dados.... ahora queda sin duda lo más dificil...
¿¿¿ Cómo se accede a los registros de estos SuperIO chips ???? pues esta es la gran pregunta sin respuesta.... Hasta ahora. :P

Vale, pues para poder comunicarnos con estos SuperIOchips hace falta usar las instrucciones Inp() y Outp(), que permiten hacer lecturas/escrituras en puertos.

**1er problema, estas instrucciones a partir de windows NT son privilegiadas y tan sólo los programas con un nivel de privilegio adecuado pueden usarlas, así que si estais usando windows NT, 2000, xp la cosa se complica.  Pero no pasa nada...
Tan sólo los drivers pueden realizar llamadas a estas instrucciones.

SOLUCION:
Aqui hay varias soluciones...
Necesitamos una dll, que nos permita hacer llamadas a un .sys de nuestro sistema que se encargue de ofrecernos una serie de funciones para lectura/escritura de los puertos.

Yo he encontrado dos, ambas gratuitas siempre y cuando no vayamos a hacer negocio con ellas (como es mi caso).
La primera es la CanIO.dll y CanIO.sys.  De CanSOFT, bueno, son canadienses como se nota...  Esta dll era la que usaba el MBM (mother board monitor) creo, un pedazo de programa donde los haya que desgraciadamente ha dejado de ser actualizado.
La librería puede ser descargada de aqui.

La segunda posibilidad es la que yo he usado finalmente, se trata de una dll llamada io.dll, que se encarga de llamar al io.sys de nuestro sistema y nos ofrece un monton de funciones para lectura/escritura de los puertos.
La podeis descargar de aqui.
Además esta última cuenta con unos archivos para compilar junto con nuestro programa y que nos facilitan mucho las cosas... están en varios lenguajes....


Bueno, hasta aqui por hoy, que se me hace tarde.
El próximo día hablaré de cómo se inicia esta dll y de cómo se inician las comunicaciones con el SuperIOchip....


Para los que están muy interesados.... deberes para casa!!!!  :devil:
Buscad y rebuscad por internet las especificaciones de vuestro SuperIOchip, esta es la clave del éxito, no hay más....
Para los que teneis un SuperIO chip de ITE... aqui os dejo un enlace a los documentos necesarios para conseguir nuestro objetivo.  Seguramente que aunque vuestro chip no sea el mismo funcionará de forma parecida...

Por cierto mi placa base es una ASUS A8NSLI DELUXE, si la teneis, ya sabeis que SuperIO chip teneis.

Un saludo.  :lightsabre:
No hay tonto más molesto que el ingenioso.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #1 en: Miércoles 16 de Agosto de 2006, 22:37 »
0
Solo un comentario, IO.SYS no existe como driver del sistema en la rama NT y lo que hace esa DLL es una abominacion (habilitar el acceso a los puertos) que quiebra la seguridad del sistema.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Leer La Temperatura Del Pc
« Respuesta #2 en: Jueves 17 de Agosto de 2006, 04:36 »
0
temperatura del pc o del procesador nada mas?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #3 en: Jueves 17 de Agosto de 2006, 08:56 »
0
También se pueden controlar las rpm de los ventiladores mediante PWM y visualizar las medidas de tensión que llegan de la fuente de alimentación.
Además se puede configurar el chip para que varíe la velocidad del ventilador según la temperatura...
También se puede controlar la configuración de los puertos serie, paralelo, Irda...
En fin hay un sinfin de registros, depende de las posibilidades de cada chip...

Eternal Idol:

Se que el uso de las instrucciones de entrada/salida de puertos de esta manera no es demasiado correcta... por llamarlo de alguna forma... si conoces otro sistema que permita la utilización de estas instrucciones de forma más correcta, no dudes en comunicármelo.

Cuando vuelva a casa comentaré cómo leer los distintos registros del chip...
No hay tonto más molesto que el ingenioso.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #4 en: Jueves 17 de Agosto de 2006, 09:35 »
0
Cita de: "carmamezo"
Eternal Idol:

Se que el uso de las instrucciones de entrada/salida de puertos de esta manera no es demasiado correcta... por llamarlo de alguna forma... si conoces otro sistema que permita la utilización de estas instrucciones de forma más correcta, no dudes en comunicármelo.

Cuando vuelva a casa comentaré cómo leer los distintos registros del chip...
http://geekhideout.com/iodll.shtml

Desconfio de lo que dice esa pagina, para empezar quieren dar la sensacion de que su codigo no va a ser interrumpido y eso es FALSO. Cualquier proceso esta todo el tiempo siendo interrumpido para darle tiempo de ejecucion a otro.

To further the insult, you are at the whim of the operating system. If it has tasks which it believes are of higher priority than your lowly call to your driver, it will perform them, making precise timing nearly impossible.

Lo que quiero decir es que eso no se soluciona dando acceso a los puertos, seguis estando en un proceso comun y corriente y Windows NT no es un S.O. en tiempo real.

Due to the very minor overhead involved in dynamically linking to IO.DLL, and the optimized functions contained within, access to I/O ports is nearly as fast as if it was written in raw assembler and inlined in your application

Si, teniendo en cuenta que no soluciona lo de arriba. Lo que si hace es proveer una interfaz homogenea para 9x y NT (obviamente no puedo juzgar su calidad ya que nunca lo probe).

Before moving on, it is probably prudent to mention that the technique employed in IO.DLL for releasing the ports to the application level isn't, strictly speaking, the proper way to do things. The proper way is to have a virtual device driver for Windows 95/98 and a kernel mode driver for Windows NT/2000/XP.

La manera correcta es esa pero obviamente no es la mas simple ni mas comoda.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

x.cyclop

  • Miembro de PLATA
  • *****
  • Mensajes: 1039
  • Nacionalidad: mx
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #5 en: Jueves 17 de Agosto de 2006, 19:12 »
0
¿Se puede saber la temperatura de cada "dispositivo" (monitor, regulador...) del pc o solamente del procesador? :blink:

- Great works aren't produced on the first try. [Ernest Hemingway]
- Be ambitious, yet realistic in your dreams. Do something that makes a positive impact. Don’t let the nay-sayers get you down. [Bjarne Stroustrup]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Leer La Temperatura Del Pc
« Respuesta #6 en: Jueves 17 de Agosto de 2006, 19:19 »
0
Normalmente de solo el procesador hasta donde se, por eso hice mi pregunta anterior...

porque de ser asi cada fabricante de seguro provee de librerias, drivers o lo que sea para consultar esa informacion, de hecho intel lo hace y sino estoy mal tiene tambien soporte para la temperatura de la board desde que sea una board intel.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #7 en: Jueves 17 de Agosto de 2006, 19:41 »
0
En el caso de mi placa se puede saber la temperatura del procesador y de la placa base.
No hay tonto más molesto que el ingenioso.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #8 en: Jueves 17 de Agosto de 2006, 21:32 »
0
Que yo sepa los fabricantes de placas base no aportan ninguna librería ni driver para conseguir esta información, dan programas que hacen lecturas pero no dicen cómo consiguen esos programas la información....  Yo he tenido que leer mucha información para linux, en concreto el programa lmsensors y sus códigos fuentes para poder ir sacando información...

Bueno, finalizando con el tema.

El SuperIO chip ITE funciona de la siguiente manera:
- El chip dispone de dos registros, el primero se encuentra en la posición 0x05h + base de direcciones, el segundo se encuentra en la 0x06h + la base de direcciones.

- Vale, la base de direcciones cambia según qué parámetros queramos leer/escribir, pero para acceder a los registros base (los primeros...) es una única y está localizada en la dirección 0x29h.

Por tanto los registros donde leer/escribir al comienzo son los siguientes:
0x29+0x05=0x2e
0x29+0x06=0x2f

Un ejemplo, si queremos leer el registro 0x12h del ITE al comienzo, tendremos que hacer lo siguiente:
Código: Text
  1.  
  2. PortOut(0x2e,0x12);//le indicamos que queremos realizar algo con el registro 0x12
  3. res=PortIn(0x2f);//el chip nos deja el registro solicitado en la dirección contigua para que hagamos con él lo que queramos, en este caso leerlo
  4.  
  5.  
Si lo que queremos es escribir en el registro 0x12h un valor:
Código: Text
  1.  
  2. PortOut(0x2e,0x12);
  3. PortOut(0x2f,valor);
  4.  
  5.  
Pues una vez que sabemos cómo funciona la comunicación... lo demás es seguir el manual...

PASO 1: INICIALIZAR LAS COMUNICACIONES.

Para inicializar las comunicaciones con el chip hay que enviar una serie de bytes al primer registro antes comentado:
Código: Text
  1.  
  2. //Inicializacion del ITE
  3. PortOut(0x2e,0x87);
  4. PortOut(0x2e,0x01);
  5. PortOut(0x2e,0x55);
  6. PortOut(0x2e,0x55);
  7.  
  8.  
Esto no es cosa mia... biene en el manual.  Y no se debe olvidar acabar las comunicaciones al final del programa enviando un dos a la misma dirección:
Código: Text
  1.  
  2. //Finalizar ITE
  3. PortOut(0x2e,0x02);
  4.  
  5.  


PASO 2: COMPROBAR QUE EL CHIP ES UN ITE8712.

Ningún problema, el fabricante deja un par de registros de lectura, el 0x20 y el 0x21 donde se encuentran dos valores hexadecimales:
0x20 contiene un 0x87
y
0x21 contiene un 0x12
Justamente los números de nuestro chip.

Pues vamos a realizar la comprobación, y ya de paso creo un par de funciones genéricas para leer y escribir bytes en registros del ITE (ya vereis por qué las hago genéricas (con la base variable) más adelante):
Código: Text
  1.  
  2. unsigned char LeeITE8712(unsigned short base, unsigned char registro)
  3. {
  4. PortOut(base+0x05,registro);
  5. return PortIn(base+0x06);
  6. }
  7.  
  8.  
  9. void EscribeITE8712(unsigned short base, unsigned char registro, unsigned char valor)
  10. {
  11. PortOut(base+0x05,registro);
  12. PortOut(base+0x06,valor);
  13. }
  14.  
  15.  
  16. //ahora comprobamos si el chip es un ITE
  17. int CompruebaITE8712()
  18. {
  19. if(LeeITE8712(0x29,0x20)==0x87 && LeeITE8712(0x29,0x21)==0x12)
  20. return 1;
  21. else
  22. return 0;
  23. }
  24.  
  25.  
Pues ya está, si la función nos devuelve un 1, es que el chip es un ITE8712.


PASO 3: LEER/ESCRIBIR REGISTROS.

Antes que nada hay que saber que este chip tiene una serie de LDNs, y la mayoría de registros sólo pueden ser accedidos desde el LDN adecuado.  
LDN (cualquiera) : podemos acceder a los registros comunes como el ID del chip (0x20 y 0x21), al configuration select (0x07)...
LDN 0: aqui están los registros del controlador del floppy disk
LDN 1: puerto serie 1
LDN 2: puerto serie 2
LDN 3: puerto paralelo
LDN 4: registros del environment
LDN 5: keyboard
LDN 6: mouse
LDN 7: configuracion GPIO
LDN 8: puerto MIDI
LDN 9: puerto de juegos
LDN 10: IR

Hay que leer el manual y consultar en qué LDN está el registro que me interesa.  En este caso todos los registros relacionados con el "environment" (temperaturas, fans, vins...) están en el LDN 4.  Y ¿qué significa esto? pues que la dirección base 0x29 ya no nos sirve, por eso antes hice las funciones con la base variable.
En la dirección 0x29 están los registros básicos para comenzar a usar el chip. Pero no los verdaderamente interesantes.

Para poder seleccionar otro LDN hay que escribir el valor del LDN deseado en el registro 0x07 aún con la base inicial 0x29 (claro, sino menudo negocio).
Luego se debe comprobar que está activado realizando una lectura del registro 0x30 y si este registro vale 1, es que nuestro chip tiene iniciado el servicio que queremos (en este caso el environment):
Código: Text
  1.  
  2. //Cambiamos el LDN al 4 escribiendo un 4 en el registro 7
  3. EscribeITE8712(0x29,0x07,0x04);
  4. //Ahora comprobamos si ese servicio está activo
  5. if(LeeITE8712(0x29,0x30)==0)
  6. printf("La cagamos... El servivio no está activo");
  7. else
  8. printf("Vamos bien.");
  9.  
  10.  
Se puede escribir también este registro, asi que si el servicio no está iniciado supongo que se podrá iniciar escribiendo un 1 en el registro 0x30...

Pues si hemos tenido éxito, ya podremos conseguir nuestro propósito, que no es más que conocer la dirección base de todos los registros de la función de environment.

Para ello lo único que hay que hacer es leer un registro concreto, bueno, mejor dicho dos registros...  Las direcciones de los dispositivos de este tipo son de 16bits... Para saber la nueva dirección base hay que leer los registros 0x60 y 0x61 y generar con ellos una dirección.  Se podría hacer una función como las anteriores encargada de leer dos bytes, pero bueno:
Código: Text
  1.  
  2. //actualizamos la base de direcciones
  3. nueva_dir_base=LeeITE8712(0x29,0x60)<<8 | LeeITE8712(0x29,0x61);
  4.  
  5.  
Y ya está, ya tenemos la nueva dirección base, una vez que tenemos esta dirección a leer/escribir los registros que nos interesan del LDN 4.

Un ejemplo para finalizar, se trata de un programa completo usando las funciones de la io.dll que comenté en el primer post para realizar la tarea de leer las tres temperaturas que este chip puede leer:
Código: Text
  1.  
  2. #include <windows.h>
  3. #include <stdio.h>
  4.  
  5. //llamamos a la librería creada por el amigo del IO
  6. #include "io.h"
  7.  
  8.  
  9. //creamos una funcion que lee registros del IT8712
  10. unsigned char LeeIT8712(unsigned short base,unsigned char registro)
  11. {
  12.   PortOut(base+0x05,registro);
  13.   return ( PortIn(base+0x06) );
  14. }
  15.  
  16. //creamos una función que lee dos registros contiguos del IT8712
  17. unsigned short LeeWordIT8712(unsigned short base,unsigned char registro)
  18. {
  19.   return( LeeIT8712(base,registro)<<8 | LeeIT8712(base,registro+1) );
  20. }
  21.  
  22. //creamos una función que escribe bytes en registros del IT8712
  23. void EscribeIT8712(unsigned short base,unsigned char registro, unsigned char valor)
  24. {
  25.     PortOut(base+0x05,registro);
  26.     PortOut(base+0x06,valor);
  27. }
  28.  
  29. //creamos una función que escribe dos bytes en registros contiguos del IT8712
  30. void EscribeWordIT8712(unsigned short base,unsigned char registro, unsigned short valor)
  31. {
  32.   EscribeIT8712(base,registro,(unsigned char)(valor>>8));
  33.   EscribeIT8712(base,registro+1,(unsigned char)(valor&0xff));
  34. }
  35.  
  36.  
  37. //creamos una función que nos finaliza la comunicación
  38. void FinalizaIT8712(void)
  39. {
  40.   PortOut(0x2e,0x02);
  41. }
  42.  
  43.  
  44. //creamos una función que nos inicia y comprueba el chip
  45. int IniciaIT8712()
  46. {
  47.   PortOut(0x2e,0x87);//estos datos vienen predefinidos en el data sheet
  48.   PortOut(0x2e,0x01);
  49.   PortOut(0x2e,0x55);
  50.   PortOut(0x2e,0x55);
  51.  
  52.   //nos garantizamos el fin de las comunicaciones con el chip al terminar
  53.   atexit(FinalizaIT8712);
  54.  
  55.   if(LeeIT8712(0x29,0x20)==0x87 && LeeIT8712(0x29,0x21)==0x12)
  56.     return 1;
  57.   else
  58.     return 0;
  59. }
  60.  
  61.  
  62. void main()
  63. {
  64.   unsigned short dir_base=0x29;
  65.   int res,i;
  66.  
  67.  
  68.  
  69.   if(LoadIODLL() == 0 && IsDriverInstalled()==0)
  70.   {
  71.     printf("\n\t\aERROR inicializando driver.");
  72.     getch();
  73.     exit(1);
  74.   }
  75.  
  76.   //iniciamos el IT8712
  77.   if(IniciaIT8712()==0)
  78.   {
  79.     printf("\n\t\aEl chip IT8712 no se encuentra instalado.");
  80.     getch();
  81.     exit(2);
  82.   }
  83.  
  84.  
  85.   //cambiamos el LDN a 4
  86.   EscribeIT8712(dir_base,0x07,0x04);
  87.  
  88.   //comprobamos que el servicio está activo
  89.   if (LeeIT8712(dir_base,0x30)==0)
  90.     //si no está activo lo activamos
  91.     EscribeIT8712(dir_base,0x30,0x01);
  92.  
  93.   //leemos la nueva dirección base
  94.   dir_base=LeeWordIT8712(dir_base,0x60);
  95.  
  96.   //Ya estamos, a leer las 3 temperaturas que en este caso están en
  97.   //los registros 0x29,0x30 y 0x31 respectivamente
  98.  
  99.    while(!_kbhit())
  100.    {
  101.      system("Cls");
  102.      for(i=0;i<3;i++)
  103.        printf("\n\tTemp %d: %d",i+1,LeeIT8712(dir_base,0x29+(unsigned char)i));
  104.  
  105.      //hacemos una pausa de 1s pq las temperaturas tardan en actualizarse
  106.      Sleep(1000);
  107.    }
  108. }
  109.  
  110.  
  111.  

Pues nada más que añadir, espero que os sirva de mucha ayuda, sabed que yo he dedicado muchas horas de mi amada vida para conseguir esta miguita de información así que aprobecharla bien.

Por cierto, para los que esto les parezca poco, también se pueden hacer lecturas de la temperatura de los discos duros.... aprobechando la función SMART que tienen ahora, pero esto es mucho más sencillo, se puede realizar mediante llamadas a las rutinas de la API de windows....

Un saludo a todos  :lightsabre:

 :hola:
No hay tonto más molesto que el ingenioso.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Leer La Temperatura Del Pc
« Respuesta #9 en: Viernes 18 de Agosto de 2006, 00:07 »
0
Cita de: "carmamezo"
Pues nada más que añadir, espero que os sirva de mucha ayuda, sabed que yo he dedicado muchas horas de mi amada vida para conseguir esta miguita de información así que aprobecharla bien.
Esto es compartir información :D. Gracias por el dato, no lo he leído a fondo (ya he usado la IO.dll y algunas cosillas), a ver si en un par de meses le puedo sacar provecho :).

Nuevamente, gracias.

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #10 en: Viernes 18 de Agosto de 2006, 11:26 »
0
No me habia percatado de que cobra 1000 dolares por el codigo  :lol:  :lol:  :lol:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #11 en: Sábado 19 de Agosto de 2006, 01:48 »
0
:D  :D  :D  :D  :D  :D



je je je je je muy buena informacion ...
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]


Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #12 en: Domingo 20 de Agosto de 2006, 15:42 »
0
Estuve investigando un poquito como habilitar el acceso a los puertos I/O, es relativamente simple de conseguir y termine con un modulo de modo Kernel que habilita el acceso a todos los procesos que se vayan ejecutando. Si se lo carga en boot todos los procesos del sistema (desde smss.exe que es el primero) podran usar in's y out's sin problemas.

En fin, no se si le interesara a alguien ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Leer La Temperatura Del Pc
« Respuesta #13 en: Lunes 21 de Agosto de 2006, 23:15 »
0
¿La información al respecto se encuentra en la documentación de Microsoft (MSDN)? ¿O es algo externo? Necesitaré leer al respecto (los privilegios y demás relacionados con servicios en Windows), a mi me interesa :D.

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #14 en: Martes 22 de Agosto de 2006, 08:17 »
0
No, la informacion no esta en la MSDN y no esta documentada por Microsoft en ningun lado que yo sepa. Es mas, las funciones del Kernel necesarias estan exportadas pero no definidas en el DDK, esto quiere decir que tenemos que prototiparlas nosotros mismos.

Por cierto esto no tiene nada que ver con los privilegios que pueda tener un proceso o con servicios, al menos no con lo que comunmente se conoce como privilegios, esto es algo totalmente indocumentado que no se deberia hacer nunca mientras que los privilegios estan perfectamente documentados y son utilizados sin ningun problema.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

RobinHook

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #15 en: Martes 22 de Agosto de 2006, 17:45 »
0
Muy interesante toda la información que comparten y esto motiva a que la tecnología y el conocimiento avancen más rapido, en particular yo tengo el problema de acceder a los puertos para aplicaciones de robótica, pero que tienen en común el uso de acceso a puertos desde NT/2000/XP, y es necesario los driver intermedios como el IO.dll que comentan.

Al respecto Eternal Idol ha investigado sobre esto:
Estuve investigando un poquito como habilitar el acceso a los puertos I/O, es relativamente simple de conseguir y termine con un modulo de modo Kernel que habilita el acceso a todos los procesos que se vayan ejecutando. Si se lo carga en boot todos los procesos del sistema (desde smss.exe que es el primero) podran usar in's y out's sin problemas.

Me gustaria si pudiera detallar mas sobre el asunto, ya que me interesa demasiado, ya que soy investigador nato

Saludos :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #16 en: Martes 22 de Agosto de 2006, 22:26 »
0
Cita de: "RobinHook"
necesario los driver intermedios como el IO.dll que comentan.

En realidad la IO.dll es justamente una DLL, un modulo de modo Usuario, que lleva embedido un driver (es la misma tecnica usada para los recursos de tipo version por ejemplo). Este driver se encarga, mediante un par de funciones indocumentadas, de habilitar el acceso a los puertos de I/O para un determinado proceso (aunque la mascara de los puertos que se habilitan o no es global se puede habilitar o no por proceso, lo que no se puede es dar determinados puertos a unos procesos y otros puertos a otros procesos).

Cita de: "RobinHook"
Me gustaria si pudiera detallar mas sobre el asunto, ya que me interesa demasiado, ya que soy investigador nato

Basicamente lo que hago es establecer una rutina de callback para la creacion de procesos y en esta llamar a las funciones que habilitan los puertos, con lo cual todos los procesos que se vayan ejecutando en la maquina tendran la posibilidad de acceder. Para hacer cualquier tipo de intento con esto hay que tener el DDK, conocimientos sobre Windows NT y modulos de modo Kernel.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

RobinHook

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #17 en: Jueves 24 de Agosto de 2006, 18:24 »
0
Gracias Eternal Idol por la información
He seguido investigando mas sobre estas DLL que llevan internamente el driver que se comunica con los puertos. He encontrado el codigo fuente del Inpout32.dll en la web www.logix4u.net/inpout32.htm, pero necesito mas información detallada de las funciones indocumentadas para sacarle el maximo provecho a estas dll y optimizarlas a aplicaciones propias.

Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer La Temperatura Del Pc
« Respuesta #18 en: Jueves 24 de Agosto de 2006, 18:40 »
0
Cita de: "RobinHook"
Gracias Eternal Idol por la información
He seguido investigando mas sobre estas DLL que llevan internamente el driver que se comunica con los puertos. He encontrado el codigo fuente del Inpout32.dll en la web www.logix4u.net/inpout32.htm, pero necesito mas información detallada de las funciones indocumentadas para sacarle el maximo provecho a estas dll y optimizarlas a aplicaciones propias.

Gracias
De nada.
Esta parece ser otra DLL que funciona de manera bastante diferente, cada vez que queres acceder a un puerto se comunica con el driver mediante DeviceIoControl y este es el que realmente accede al hardware.
Las funciones indocumentadas que hago mencion no te servirian para nada ya que no se pueden llamar desde ninguna DLL (modulo de modo Usuario) sino que tienen que ser llamadas desde el Kernel.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.