음.
NT커널시스템을 가진 윈도우(NT,2000,XP,2003)등은
메모리,IO포트접근을 APP레벨에서의 접근을 못합니다.(물론 95,98는 됩니다. IO포트만)
특정포트의 값을 읽고,쓸려면 드라이브 레벨에서 가능한데요.
DeviceIoControl()함수는 드라이브와 통신을 할수 있는 함수이죠...
직접 IO접근드라이브을 제작할려면 머리아프니 하제소프트에서 제공하는 메모리,IO포트접근 드라이브와
예제가 있읍니다.
참고하시면 문제를 쉽게 해결할수 있겠네요...
(
http://www.hajesoft.com/) 자료실:기본입출력과 메모리접근을 허용하는 예제(공짜드라이브을 아직도 주는지 ?)
(
http://www.zap.pe.kr/) 여기도 괜찮은 사이트 , 여기에 가시면 더 상세한 자료가 있지요.(강력추천),모두공짜
이성회 님이 쓰신 글 :
: 안녕하세요?
:
: 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);
: }
: //---------------------------------------------------------------------------