|
안녕하세요?
DOS 시절에는 CMOS 내의 RTC 정보를 읽으려면 아래의 ReadCMOS 함수에서와 같이 outportb()와 inportb()함수를 사용했습니다.
그런데 32bit의 운영체제에서는 이 함수들을 사용할 수 없다고 나오더군요.
그래서 찾던 중에 Windows API 함수인 DeviceIoControl()을 사용해야 한다는 정보를 얻었습니다.
그런데, 문제는 이 함수의 첫번째 매개변수로 들어가는 장치핸들을 만들어야 하는데 그것을 못하고 있다는 것입니다.
보통, 장치(파일)핸들을 만들려면 CreateFile() 함수를 사용하게 되고 첫번째 매개변수로 파일이름이나 장치이름을 지정해야 하는데 RTC의 장치 이름이 무엇인지 도무지 알 수가 없어서 어떻게 해볼 수가 없군요.
(Windows 95/98/Me에서는 VWIN32.VXD를 뜻하는 vwin32를 장치명에 지정하면 가능합니다만 NT계열에서는 이렇게 할 수가 없더군요)
제가 아예 다른 곳에서 헤매고 있는지도 모르겠군요.
여튼 하고 싶은 것은 Windows NT 계열의 운영체제에서 CMOS 내의 RTC 정보를 액세스(Read & Write)하는 것입니다.
도움을 구합니다.
감사합니다.
(혹시 그 장치이름이 나오지 않을까 해서 MSDN도 수차례 뒤져보았고 ,
그 장치이름은 유보된 파일이름이고 이미 존재하는 파일의 이름이므로 읽기 모드로 열면 열려야 하며 장치이름 지정 룰을 보니까 알파벳 3자리 또는 그에 숫자 1자리를 더한 것을 장치이름으로 사용할 수 있다고 해서 프로그램을 만들어 돌려보니까 AUX,COM1,CON,FHB1,LPT1,NUL,PRN,UVS1 장치밖에 없더군요. 제컴의 CMOS에 RTC가 없을리 만무한데도 말입니다.)
//---------------------------------------------------------------------------
void ReadCMOS(unsigned char val[])
{
const int PortIn=0x0071,PortOut=0x0070;
int i, address;
for(address=0 ;address<=127;address++)
{
outportb(PortOut,address);
val[address]=inportb(PortIn);
}
// if (memcmp(val+0,val+64,64)!=0) printf("\nThis system's BIOS has 128 bytes or more CMOS RAM.");
// else printf("\nThis system's BIOS has 64 bytes CMOS RAM.");
if((val[0x0b] & 0x04)==0) //if BCD/Binary mode is BCD, change BCD to binary.
{
for(i=0;i<10;i++) Bcd2Bin(val+i); // year, month, day
Bcd2Bin(val+0x32); //century
}
}
//---------------------------------------------------------------------------
// change BCD(Binary Coded Decimal) to binary.
void Bcd2Bin(unsigned char *val)
{
*val=(*val>>4)*10 + (*val&0x0f);
}
//---------------------------------------------------------------------------
|