1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
找到一个读写CMOS的C代码!! [ 2006-10-27
| 作者:马大哈 | 来自:本站原创 ]
这人牛的.....不过这代码也老了点,不知道现在的NT内核系统能不能使用.
看代码是使用C内嵌ASM完成的,说不定编译后就会被报病毒........^_^
以下是CMOS.C文件内容:
/********************************************************/
/* 程序名称: CMOS.C 1.0 */
/* 作 者: 董占山 */
/* 完成日期: 1995-10-17 */
/* 用 途: 读、写、修改CMOS内存信息 */
/* 编译方法: 用下列命令编译连接可以得到CMOS.COM: */
/* tcc -mt cmos */
/* tlink c:\tc\lib\c0t+cmos,cmos,,c:\tc\lib\cs\lib /t */
/********************************************************/
#include
#include
#include
struct hdinfo { /* 硬盘物理参数结构体 */
unsigned int Cylinder; /* 硬盘柱体数 */
unsigned char Head; /* 面数 */
unsigned int WP;
unsigned int LZ;
unsigned char Sector; /* 扇区数 */
};
struct TCMOSStruc /* CMOS RAM信息结构体 */
{
unsigned char Seconds; /* 实时钟秒数 */
unsigned char SecondAlarm; /* 秒报警 */
unsigned char Minutes; /* 实时钟分数 */
unsigned char MinuteAlarm; /* 分报警 */
unsigned char Hours; /* 实时钟小时数 */
unsigned char HourAlarm; /* 时报警 */
unsigned char DayOfWeek; /* 周几 */
unsigned char DayOfMonth; /* 号数 */
unsigned char Month; /* 月份 */
unsigned char Year; /* 年份 */
unsigned char StatusRegA; /* 状态寄存器A */
unsigned char StatusRegB; /* 状态寄存器B */
unsigned char StatusRegC; /* 状态寄存器C */
unsigned char StatusRegD; /* 状态寄存器D */
unsigned char DiagStatus; /* 诊断状态 */
unsigned char ShutDownStatus; /* 关机状态 */
struct {
unsigned FloppyDrive2 : 4;/* 第二软驱的类型 */
unsigned FloppyDrive1 : 4;/* 第一软驱的类型 */
} fd;
unsigned char Reserved1; /* 保留 */
struct {
unsigned FixedDrive2 : 4; /* 第二硬盘的类型 */
unsigned FixedDrive1 : 4; /* 第一硬盘的类型 */
} hd;
unsigned char Reserved2; /* 保留 */
struct {
unsigned diskdrv : 1; /* 磁盘驱动器 */
unsigned mpu : 1; /* 数学处理器 */
unsigned : 2; /* 保留 */
unsigned videotype : 2; /* 当前显示类型 */
unsigned numdrive : 2; /* 磁盘驱动器的数目 */
} equipment;
unsigned int RAM; /* 基本内存KB数 */
unsigned int XMS; /* 扩充内存KB数 */
unsigned char FixedDriveType1; /* 驱动器C扩展字节 */
unsigned char FixedDriveType2; /* 驱动器D扩展字节 */
unsigned int Reserved3; /* 保留 */
struct hdinfo hd1; /* 硬盘C的物理参数 */
struct hdinfo hd2; /* 硬盘D的物理参数 */
unsigned char Sys; /* 系统字节 */
unsigned int CheckSum; /* 校验和 */
unsigned int XMS1; /* 扩展内存KB数 */
unsigned char DateCentury; /* 世纪的BCD值 */
unsigned char InfoFlags; /* 信息标志 */
unsigned char Reserved4 ; /* 保留 */
unsigned char password ; /* 口令字节 */
};
struct TCMOSStruc CMOSRec;
/* 获取文件名函数 */
char *getfilename()
{
char ch,flnm ;
printf("\nPlease input the drive name (A/B/C/D): ");
while ((ch=getchar())=='\n');
printf("\n");
flnm =ch;
flnm ='\0';
strcat(flnm,":\\CMOS.DAT");
return flnm;
}
/* 从文件(CMOS.DAT)中读出信息 */
void ReadFile()
{
FILE *f1;
char flnm ;
strcpy(flnm,getfilename());
if ((f1 = fopen(flnm,"rb"))==NULL) { /* 打开一个二进制文件 */
printf("File not found !");
exit(0);
}
fread(&CMOSRec,sizeof(CMOSRec),1,f1); /* 从文件中读CMOS内存信息 */
fclose(f1);
}
/* 将从CMOS内存中读出的信息写入文件 */
void WriteFile()
{
FILE *f1;
char flnm ;
strcpy(flnm,getfilename());
if ((f1 = fopen(flnm,"wb"))==NULL) { /* 建立一个二进制文件 */
printf("File does not opened !");
exit(1);
}
fwrite(&CMOSRec,sizeof(CMOSRec),1,f1); /* 写CMOS内存信息记录到文件 */
fclose(f1);
}
/* 从CMOS内存中读信息 */
void ReadCMOS()
{
asm mov di,offset CMOSRec
asm mov cx,0x40
asm mov ah,0
asm mov bx,0
asm mov dx,0x70 /* CMOS口地址 */
l1:
asm mov al,ah
asm out dx,al
asm inc dx
asm in al,dx
asm mov BYTE PTR [di+BX],al
asm inc ah
asm inc bx
asm dec dx
asm loop l1
}
/* 向CMOS内存写入信息 */
void WriteCMOS()
{
asm mov di,offset CMOSRec
asm MOV CX,0x40
asm MOV AH,0
asm MOV BX,0
asm MOV DX,0x70
_L1:
asm MOV AL,AH
asm OUT DX,AL
asm MOV AL,BYTE PTR [di+BX]
asm INC DX
asm OUT DX,AL
asm INC AH
asm INC BX
asm DEC dX
asm loop _L1
}
/* 显示软盘信息 */
void DisplayFloppyDrive(FloppyDriveType,Order)
unsigned char FloppyDriveType,Order;
{
if (FloppyDriveType != 0) {
printf("\nFloppy Drive %d : ",Order);
switch (FloppyDriveType) {
case 1 : printf("360KB 5.25'");break;
case 2 : printf("1.2MB 5.25'");break;
case 4 : printf("1.44MB 3.5'");break;
case 6 : printf("720KB 3.5'");break;
}
}
}
/* 显示硬盘信息 */
void DisplayHardDiskInfo(HDType,HDInfoRec,Order)
unsigned char HDType;
struct hdinfo HDInfoRec;
unsigned char Order;
{
printf("\nFixed Drive %d: %d",Order,HDType);
printf("\n Cylinder : %d",HDInfoRec.Cylinder);
printf("\n Head : %d",HDInfoRec.Head);
printf("\n Sector: %d",HDInfoRec.Sector);
printf("\n LZ: %d",HDInfoRec.LZ);
printf("\n WP: %d",HDInfoRec.WP);
}
/* 显示CMOS内存信息 */
void DisplayCMOS()
{
int i;
printf("\nCMOS RAM information:");
printf("\nDate(MM-DD-YY): %d%d-%d%d-%d%d",CMOSRec.Month>>4,CMOSRec.Month & 0xf,
CMOSRec.DayOfMonth>>4,CMOSRec.DayOfMonth & 0xf,
CMOSRec.Year>>4,CMOSRec.Year & 0xf);
printf("\nTime(HH:MM:SS): %d%d:%d%d:%d%d",CMOSRec.Hours>>4,CMOSRec.Hours & 0xf,
CMOSRec.Minutes>>4,CMOSRec.Minutes & 0xf,
CMOSRec.Seconds>>4,CMOSRec.Seconds & 0xf);
printf("\nConventional Memory: %d KB",CMOSRec.RAM);
printf("\nExtended Memory: %d KB",CMOSRec.XMS);
if (CMOSRec.hd.FixedDrive1 != 0) DisplayHardDiskInfo(CMOSRec.FixedDriveType1,CMOSRec.hd1,1);
if (CMOSRec.hd.FixedDrive2 != 0) DisplayHardDiskInfo(CMOSRec.FixedDriveType2,CMOSRec.hd2,2);
DisplayFloppyDrive(CMOSRec.fd.FloppyDrive1,1);
DisplayFloppyDrive(CMOSRec.fd.FloppyDrive2,2);
printf("\nScan code of password:");
for (i=0;i<8;++i) printf(" %d",CMOSRec.password[i]);
printf("\nThe number of disk drives : %d",CMOSRec.equipment.numdrive);
printf("\nVideo Type : %d",CMOSRec.equipment.videotype);
printf("\nMath co-processor present :");
if (CMOSRec.equipment.mpu==1) printf("YES"); else printf("NO");
printf("\nDisk drives : %d",CMOSRec.equipment.diskdrv);
}
/* 修改硬盘信息 */
void ModifyHDParam(HDType,HDInfoRec,Order)
unsigned char *HDType;
struct hdinfo *HDInfoRec;
unsigned char Order;
{
int i,j;
printf("\nType of Fixed Disk %d : (%d) : ",Order,*HDType);
scanf("%d",HDType);
printf("\n Cylinder (%d) : ",HDInfoRec->Cylinder);
scanf("%d",&HDInfoRec->Cylinder);
printf("\n Head (%d) : ",HDInfoRec->Head);
scanf("%d",&i);
HDInfoRec->Head = i;
printf("\n Sector (%d) : ",HDInfoRec->Sector);
scanf("%d",&j);
HDInfoRec->Sector = j;
printf("\n LZ (%d) : ",HDInfoRec->LZ);
scanf("%d",&HDInfoRec->LZ);
printf("\n WP (%d) : ",HDInfoRec->WP);
scanf("%d",&HDInfoRec->WP);
}
/* 修改软盘信息 */
void ModifyFDParam(FloppyDriveType,Order)
unsigned char FloppyDriveType,Order;
{
unsigned char i;
printf("\nFloppy Drive %d (",Order);
switch (FloppyDriveType) {
case 1 : printf("1---360KB 5.25') :");break;
case 2 : printf("2---1.2MB 5.25') :");break;
case 4 : printf("4---1.44MB 3.5') :");break;
case 6 : printf("6---720KB 3.5') :");break;
}
while ((i=getchar())=='\n');
if (Order==1)
CMOSRec.fd.FloppyDrive1=i;
else
CMOSRec.fd.FloppyDrive2=i;
}
/* 修改协处理器信息 */
void ModifyMPU()
{
char ch;
printf("Is there a math co-processor (Y/N) :");
while ((ch=getchar())=='\n');
if ((ch=='Y') || (ch=='y'))
CMOSRec.equipment.mpu=1;
else
CMOSRec.equipment.mpu=0;
}
/* 修改CMOS内存信息 */
void ModifyCMOS()
{
unsigned int i;
unsigned char *data,temp;
data = &CMOSRec;
printf("\nPlease input CORRECT CMOS information !!!\n");
printf("\nConventional Memory (%d KB) : ",CMOSRec.RAM);
scanf("%d",&CMOSRec.RAM);
printf("\nExtended Memory (%d KB) : ",CMOSRec.XMS);
scanf("%d",&CMOSRec.XMS);
if (CMOSRec.hd.FixedDrive1 != 0) ModifyHDParam(&CMOSRec.FixedDriveType1,&CMOSRec.hd1,1);
if (CMOSRec.hd.FixedDrive2 != 0) ModifyHDParam(&CMOSRec.FixedDriveType2,&CMOSRec.hd2,2);
if (CMOSRec.FixedDriveType1!=0) CMOSRec.hd.FixedDrive1 = 0xf;
if (CMOSRec.FixedDriveType2!=0) CMOSRec.hd.FixedDrive2 = 0xf;
ModifyFDParam(CMOSRec.fd.FloppyDrive1,1);
ModifyFDParam(CMOSRec.fd.FloppyDrive2,2);
ModifyMPU();
CMOSRec.CheckSum = 0;
for (i=16;i<46;++i) CMOSRec.CheckSum+=data[i]; /* 计算校验和 */
temp = data ;
data = data ;
data = temp;
}
/* 显示程序帮助信息 */
void help()
{
printf("Syntex:\n");
printf(" CMOS /R --- read information from CMOS RAM \n");
printf(" and write it to CMOS.DAT file \n");
printf(" CMOS /W --- read configuration information from CMOS.DAT\n");
printf(" and write it to CMOS RAM\n");
printf(" CMOS /M --- modify CMOS information and save it\n");
printf("Floppy Drive Type:\n");
printf(" 1 : 360KB 5.25'\n");
printf(" 2 : 1.2MB 5.25'\n");
printf(" 4 : 1.44MB 3.5'\n");
printf(" 6 : 720KB 3.5'");
}
/* 主程序 */
main(argn,argc)
char *argc[];
int argn;
{
char ch;
char *temp;
printf("CMOS Proctector 1.00, Copyright (c) 1995 Dong Zhanshan\n");
if (argn == 2)
{
temp = argc ;
ch = toupper(temp );
switch (ch) {
case 'R' : ReadCMOS(); /* 读CMOS内存信息,并写入文件 */
DisplayCMOS();
WriteFile();
break;
case 'W' : ReadFile(); /* 从文件中读CMOS信息,并写入CMOS内存中 */
DisplayCMOS();
WriteCMOS();
break;
case 'M' : ReadCMOS(); /* 读CMOS内存读取信息,并进行修改, */
ModifyCMOS();/* 然后再写回CMOS内存 */
DisplayCMOS();
WriteFile();
WriteCMOS();
break;
default : help();
}
}
else help();
return 0;
}[本日志由 马大哈 于 2006-10-27 09:11 PM 编辑]
sanxia 于 2007-02-01 11:43 AM 发表评论:
悠悠的云里有淡淡的诗,淡淡的诗里有绵绵的喜悦,绵绵的喜悦里有我轻轻的问候,wow gold 祝您新春大吉.