programmers resources
  http://www.intel-assembler.it/  (c)2017 intel-assembler.it   info@intel-assembler.it
 
Search :  
Lingua Italiana    English Language   
Index
 
just an empty assembly space
just an arrow Intel Platform
just an arrow Article & Guides
just an arrow Download Software


23/01/2009 Featured Article: How to remove Buzus Virus (permalink)




:::3313153:::
Bottone Scambio Directory Pubblicitaonline.it
Home Page | Articles & Guides | Download | Intel Platform | Contacts

Google
 


Bookmark and Share
Download 
Tell a friend



CMOS reader with C sources

Reads the CMOS memory decoding the info

(by piergiorgio d"ignazio)

This source program in C can read the CMOS memory and printout a few properties. It can also load and save the CMOS memory to a file. It show the use of I/O ports 0x70 and 0x71 and includes the definition record of the CMOS memory.
This article is online from 3502 days and has been seen 5211 times





/* Nel programma vengono effettuati accessi alla CMOS unicamente in lettura;
 * ricordando che č bene modificare le locazioni della stessa attraverso
 * l'uso del "Setup" del sistema, se si vuole comunque accedere in scrittura
 * ricordarsi di andare a modificare la checksum ai bytes 2eH-2fH,
 * ed eventualmente ai bytes 32H-33H nel caso il sistema sia un PS2 originale
 * IBM.
 */

#include <dos.h>
#include <stdio.h>
#include <conio.h>

#define CMOS_DATA 0x71 // porta dati della CMOS
#define CMOS_ADDRESS 0x70            // porta indirizzi della CMOS

typedef unsigned char byte;
typedef unsigned int uint;

typedef struct { byte secondi; // RTC: secondi
 byte secondi_a; // RTC: secondi dell'allarme
 byte minuti;   // RTC: minuti
 byte minuti_a; // RTC: minuti dell'allarme
 byte ore; // RTC: ore
 byte ore_a; // RTC: ore dell'allarme
 byte giorno_settimana; // RTC: 1=Domenica,2=Luned...
 byte giorno_mese; // RTC: 1..31
 byte mese;             // RTC: 1..12
 byte anno; // RTC: ultime due cifre dell'anno
 byte registro_a; // RTC: registo di stato A
 byte registro_b; // RTC: registo di stato B
 byte registro_c; // RTC: registo di stato C
 byte registro_d; // RTC: registo di stato D
 byte diag_post; // stato del diagnostico POST
 byte shutdown; // stato dello shutdown
 byte dischetti; // tipo dei floppy drives
 byte riservato1; // usato solo dai PS2
 byte harddisk; // per i tipi da 1 a 14
 byte riservato2; // riservato
 byte equip; // nų di drives, coprocessore ...
 uint bmem; // memoria di base
 uint emem; // memoria estesa
 byte harddiskc; // disco rigido 0
 byte harddiskd; // disco rigido 1
 byte riservato3[19]; // 19 bytes riservati
 uint checksum; // somma di controllo su 2 byte
 byte emem_low2;        // memoria estesa (low byte)
 byte emem_high2;       // memoria estesa (high byte)
 byte secolo; // secolo espresso in BCD
 byte top128info; // bit 7 settato indica 128K
 byte info[12];         // informazioni varie
 } CMOS;

void GetCmosData(byte *data) // preleva 64 bytes dalla memoria CMOS
{ byte datum,indice;
  for (indice = 0; indice < 64; indice++)
  { disable(); // disabilita le chiamate di interrupt per
outportb(CMOS_ADDRESS,indice);  // sicurezza
*data++ = inportb(CMOS_DATA);
enable(); // riabilita gli interrupt
  }
}

void Loadfile()
{ FILE *cmosfile;
  int i;
  char nome[13];
  byte datum;
  printf("\nUSARE CON CAUTELA !!\nNome del file da caricare in CMOS :");
  scanf("%s",&nome);
  if ((cmosfile=fopen(nome,"rb"))==NULL)
  printf("Impossibile leggere il file %s",nome);
  else { for (i = 0;i < 64;i++)
 { datum = fgetc(cmosfile);
   disable();
   outportb(CMOS_ADDRESS,i);
   outportb(CMOS_DATA,datum);
   enable();
  };
  fclose(cmosfile);
}
}

void Writefile(CMOS cmosdata)
{ int i;
  FILE *cmosfile;
  byte *cmosptr = (byte *)&cmosdata;
  char nome[13];
  printf("\nNome del file: ");
  scanf("%s",&nome);
  if((cmosfile=fopen(nome,"wb"))==NULL)
  printf("\nImpossibile creare il file");
  else
  { for(i = 0;i < 64;i++) fputc(*cmosptr++,cmosfile);
fclose(cmosfile);
printf("\nLa memoria CMOS Š stata registrata nel file %s",nome);
  }
}

void GetTime(CMOS cmosdata)
{ char *days[] = { "Domenica",
   "Luned",
   "Marted",
   "Mercoled",
   "Gioved",
   "Venerd",
   "Sabato"};
  printf("%s %x/%x/%x%x\t",days[cmosdata.giorno_settimana+1],
   cmosdata.giorno_mese,cmosdata.mese,
   cmosdata.secolo,cmosdata.anno);
  printf("%x:%x:%x\n",cmosdata.ore,cmosdata.minuti,cmosdata.secondi);
}

void GetDiskInfo(CMOS cmosdata)
{ int tipo_c,tipo_d;
  tipo_d = cmosdata.harddisk & 0x0f; // le operazioni di mascheratura e
  tipo_c = cmosdata.harddisk >> 4; // shift servono per separare i due
  if (tipo_c == 0) // nibbles relativi agli hard disks
printf("Hard Disk C assente\n");
else if (tipo_c == 0xf)
printf("Hard Disk C tipo: %d\n",cmosdata.harddiskc);
else printf("Hard Disk C tipo: %d\n",tipo_c);
  if (tipo_d == 0)
printf("Hard Disk D assente\n");
else if (tipo_d == 0xf)
printf("Hard Disk D tipo: %d\n",cmosdata.harddiskd);
else printf("Hard Disk D tipo: %d\n",tipo_d);
}

main()
{ CMOS cmos;
  byte *cmosptr = (byte *)&cmos;
  byte data;
  int i,j;
  char *coprocessore[] = { "non installato", "installato" };
  char *dischetti[] = { "non installato", "360k", "1.2M", "720K", "1.44M" };
  char *display[] = { "EGA",
"CGA a 40 colonne",
"CGA a 80 colonne",
"MDA" };
  char *status[] = { "OK", "Non OK" };
  char *diagnostico[] = { "Data",
  "Hard disk",
  "RAM",
  "Config.",
  "Checksum",
  "Batteria" };


  GetCmosData(cmosptr);          // realizza il dump della CMOS
  data = cmos.diag_post >> 2;
  clrscr();
  GetTime(cmos);
  printf("\tStatus del diagnostico POST\n");
  for (i = 0;i < 6;i++)
  { printf("\t%-9s : \t\t%s\n", diagnostico[i],status[data & 1]);
data = data >> 1;
  };
  getch();
  clrscr();
  printf("Informazioni hardware\n");
  GetDiskInfo(cmos);
  printf("Unit a: %s\t",dischetti[cmos.dischetti >> 4]);
  printf("Unit b: %s\n",dischetti[cmos.dischetti & 0xf]);
  printf("Coprocessore matematico %s\n",coprocessore[(cmos.equip >> 1) &am
p; 1]);
  printf("Display %s\n",display[(cmos.equip >> 4) & 3]);
  printf("Memoria di base %dK\t",cmos.bmem);
  printf("Memoria estesa %dK\n",cmos.emem);
  printf("Hex dump della memoria CMOS\n");
  for (i = 0;i < 8;i++)
  { for (j = 0;j < 8;j++)
printf("%-2x ",*cmosptr++);
printf("\n");
  };
  printf("\nSi desidera (S)alvare o (C)aricare il contenuto della CMOS in un fil
e ? (s/c)");
  switch(getch()){
case 's':
case 'S': Writefile(cmos);break;
case 'c':
case 'C': Loadfile();break;
default :;
};
  printf("\nPiergiorgio D'Ignazio per Computer Programming (1995)");
}




Top
Download 
Tell a friend
Bookmark and Share



Similar Articles

BIOS Information Leakage
A nice doc about cmos programming in asm
(by Endrazine)

CMOS Memory Map v1.23
CMOS memory bytes description
(by Padgett Peterson)

Sbunna 1.0
Cancella i dati in CMOS (con sorgenti BAS)
(by JES)

 Tags: cmos


webmaster jes
writers rguru, tech-g, aiguru, drAx

site optimized for IE/Firefox/Chrome with 1024x768 resolution

Valid HTML 4.01 Transitional


ALL TRADEMARKS ® ARE PROPERTY OF LEGITTIMATE OWNERS.
© ALL RIGHTS RESERVED.

hosting&web - www.accademia3.it

grossocactus
find rguru on
http://www.twitter.com/sicurezza3/
... send an email ...
Your name

Destination email

Message

captcha! Code