读写硬盘扇区的C语言程序知识讲解

合集下载

C语言常用函数

C语言常用函数

C语言的常用库函数函数1。

absread()读磁盘绝对扇区函数原形:int absread(int drive,int num,int sectnum,void *buf)功能:从drive指定的驱动器磁盘上,sectnum指定的逻辑扇区号开始读取(通过DOS中断0x25读取)num 个(最多64K个)扇区的内容,储存于buf所指的缓冲区中。

参数:drive=0对应A盘,drive=1对应B盘。

返回值:0:成功;-1:失败。

头文件:dos.h函数2。

abswrite()写磁盘绝对扇区函数原形:int abswrite(int drive,int nsects,int lsect,void *buffer)drive=0(A驱动器)、1(B驱动器)、nsects=要写的扇区数(最多64K个);lsect=起始逻辑扇区号;buffer=要写入数据的内存起始地址。

功能:将指定内容写入(调用DOS中断0x26)磁盘上的指定扇区,即使写入的地方是磁盘的逻辑结构、文件、FAT表和目录结构所在的扇区,也照常进行。

返回值:0:成功;-1:失败。

头文件:dos.h函数3。

atof()将字符串转换成浮点数的函数原形:double atof(const char *s)功能:把s所指向的字符串转换成double类型。

s格式为:符号数字.数字E符号数字返回值:字符串的转换值。

头文件:math.h、stdlib.h函数4。

atoi()将字符串转换成整型数的函数原形:int atoi(const char *s)功能:把s所指向的字符串转换成int类型。

s格式为:符号数字返回值:字符串的转换值。

若出错则返回0。

头文件:stdlib.h函数5。

atol()将字符串转换成长整型数的函数原形:long atol(const char *s)功能:把s所指向的字符串转换成long int类型。

s格式为:符号数字返回值:字符串的转换值。

单片机C语言 必知的数据存储与程序编写知识 附单片机应用编程知识介绍

单片机C语言 必知的数据存储与程序编写知识 附单片机应用编程知识介绍

一、五大内存分区内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

1、栈区(StaCk):FIFo就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。

里面的变量通常是局部变量、函数参数等。

2、堆区(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。

如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3、自由存储区:就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free 来结束自己的生命。

4、全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

5、常量存储区:这是一块比较特殊的存储区,它们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)code/data/stack内存主要分为代码段,数据段和堆栈。

代码段放程序代码,属于只读内存。

数据段存放全局变量,静态变量,常量等,堆里存放自己malloc或new出来的变量,其他变量就存放在栈里,堆栈之间空间是有浮动的。

数据段的内存会到程序执行完才释放。

调用函数先找到函数的入口地址,然后计算给函数的形参和临时变量在栈里分配空间,拷贝实参的副本传给形参,然后进行压栈操作,函数执行完再进行弹栈操作。

字符常量一般放在数据段,而且相同的字符常量只会存一份。

二、C语言程序的存储区域1、由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-连接三个阶段。

编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,连接过程则将各个源文件生成的二进制机器代码文件组合成一个文件。

2、C语言编写的程序经过编译-连接后,将形成一个统一文件,它由几个部分组成。

主引导扇区的读取流程

主引导扇区的读取流程

主引导扇区的读取流程主引导扇区(Master Boot Sector)是计算机硬盘上的第一个物理扇区,位于硬盘的最开始,是操作系统启动的关键。

如果主引导扇区损坏,计算机将无法启动,因此了解主引导扇区的读取流程对于计算机维护和修复非常重要。

主引导扇区的组成主引导扇区由三个主要结构组成:引导记录、主分区表和结束标志。

引导记录是主引导扇区中最重要的结构。

它包含了计算机启动所需的程序代码和数据,也称为启动代码。

主分区表(MBR)记录硬盘的分区信息,包括使用的文件系统和分区的大小等。

结束标志是一个特殊的标志位,用来结束主引导扇区。

主引导扇区的读取流程计算机启动时,BIOS(基本输入输出系统)将读取主引导扇区中的启动程序并加载到内存中,然后运行这个程序,以启动操作系统。

以下是主引导扇区读取的流程:1. BIOS自检计算机开机时,BIOS会自检硬件设备,并加载硬件设备的驱动程序。

自检完成后,BIOS将选择并加载引导程序所在的设备。

2. 搜索主引导扇区BIOS会搜索硬盘的第一个扇区(0号扇区),也就是主引导扇区。

它从0柱面、0磁头、0扇区开始检查,并向外逐个扇区的检查是否存在主引导扇区。

3. 检查主引导扇区可用性BIOS会检查主引导扇区的可用性。

如果主引导扇区有错误或损坏,则BIOS将无法继续运行。

4. 执行主引导扇区中的引导程序如果BIOS检测到主引导扇区可用,并且不损坏,则BIOS将执行主引导扇区中的引导程序,并将其加载到内存中。

引导程序是一段约446个字节大小的程序代码,它会查找分区表(MBR)中的有效分区并加载其中一个分区的引导扇区。

这样就可以启动操作系统。

5. 继续操作系统的加载引导扇区包含了操作系统的引导代码。

操作系统将继续从该代码中加载其他必要的文件和驱动程序,以完成操作系统的加载。

总结以上就是主引导扇区的读取流程,了解这个流程对于诊断和修复计算机存在问题非常重要。

在一些情况下,主引导扇区可能会损坏或变得无法读取。

读写硬盘扇区的C语言程序

读写硬盘扇区的C语言程序

读写硬盘的MBR和DBR扇区的程序。

/******************************************** Master Boot Record Programme: ** Backup the Master Boot Sector ** Fix the Master Boot Sector ** Change the Partition Table ** -- by Crystal.Mouse 04/30/99 -- ** Turboc 2.0 ********************************************/#include <ctype.h>#include <stdlib.h>#include <stdio.h>#include <bios.h>#include <io.h>#include <dos.h>#include <fcntl.h>#include <sys\stat.h>#include <conio.h>/* define the */char buff[512]; /*buffer for master boot sector *//* buffer1 backup for master boot sector */char buff1[512];/* This is the dos boot programme data */char sector2[512]={0xEB,0x3C,0x90,0x4D,0x53,0x57,0x49,0x4E,0x34,0x2E,0x31,0x00, 0x02,0x20,0x01,0x00,0x02,0x00,0x02,0x00,0x00,0xF8,0xC9,0x00,0x3F,0x00,0x40,0x00,0x3F,0x00,0x00,0x00,0x01,0x0A,0x19,0x00,0x80,0x00,0x29,0xDC,0x12,0x6F,0x04,0x30,0x34,0x32,0x36,0x39,0x39,0x20,0x20,0x20,0x20,0x20,0x46,0x41,0x54,0x31,0x36,0x20,0x20,0x20,0xFA,0x33,0xC9,0x8E,0xD1,0xBC,0xFC,0x7B,0x16,0x07, 0xBD,0x78,0x00,0xC5,0x76,0x00,0x1E,0x56,0x16,0x55,0xBF,0x22, 0x05,0x89,0x7E,0x00,0x89,0x4E,0x02,0xB1,0x0B,0xFC,0xF3,0xA4, 0x06,0x1F,0xBD,0x00,0x7C,0xC6,0x45,0xFE,0x0F,0x8B,0x46,0x18, 0x88,0x45,0xF9,0x38,0x4E,0x24,0x7D,0x22,0x8B,0xC1,0x99,0xE8, 0x77,0x01,0x72,0x1A,0x83,0xEB,0x3A,0x66,0xA1,0x1C,0x7C,0x66, 0x3B,0x07,0x8A,0x57,0xFC,0x75,0x06,0x80,0xCA,0x02,0x88,0x56, 0x02,0x80,0xC3,0x10,0x73,0xED,0x33,0xC9,0x8A,0x46,0x10,0x98, 0xF7,0x66,0x16,0x03,0x46,0x1C,0x13,0x56,0x1E,0x03,0x46,0x0E, 0x13,0xD1,0x8B,0x76,0x11,0x60,0x89,0x46,0xFC,0x89,0x56,0xFE, 0xB8,0x20,0x00,0xF7,0xE6,0x8B,0x5E,0x0B,0x03,0xC3,0x48,0xF7, 0xF3,0x01,0x46,0xFC,0x11,0x4E,0xFE,0x61,0xBF,0x00,0x07,0xE8, 0x23,0x01,0x72,0x39,0x38,0x2D,0x74,0x17,0x60,0xB1,0x0B,0xBE, 0xD8,0x7D,0xF3,0xA6,0x61,0x74,0x39,0x4E,0x74,0x09,0x83,0xC7, 0x20,0x3B,0xFB,0x72,0xE7,0xEB,0xDD,0xBE,0x7F,0x7D,0xAC,0x98, 0x03,0xF0,0xAC,0x84,0xC0,0x74,0x17,0x3C,0xFF,0x74,0x09,0xB4, 0x0E,0xBB,0x07,0x00,0xCD,0x10,0xEB,0xEE,0xBE,0x82,0x7D,0xEB, 0xE5,0xBE,0x80,0x7D,0xEB,0xE0,0x98,0xCD,0x16,0x5E,0x1F,0x66, 0x8F,0x04,0xCD,0x19,0xBE,0x81,0x7D,0x8B,0x7D,0x1A,0x8D,0x45, 0xFE,0x8A,0x4E,0x0D,0xF7,0xE1,0x03,0x46,0xFC,0x13,0x56,0xFE, 0xB1,0x04,0xE8,0xC1,0x00,0x72,0xD6,0xEA,0x00,0x02,0x70,0x00, 0xB4,0x42,0xEB,0x2D,0x60,0x66,0x6A,0x00,0x52,0x50,0x06,0x53, 0x6A,0x01,0x6A,0x10,0x8B,0xF4,0x74,0xEC,0x91,0x92,0x33,0xD2, 0xF7,0x76,0x18,0x91,0xF7,0x76,0x18,0x42,0x87,0xCA,0xF7,0x76, 0x1A,0x8A,0xF2,0x8A,0xE8,0xC0,0xCC,0x02,0x0A,0xCC,0xB8,0x01, 0x02,0x8A,0x56,0x24,0xCD,0x13,0x8D,0x64,0x10,0x61,0x72,0x0A, 0x40,0x75,0x01,0x42,0x03,0x5E,0x0B,0x49,0x75,0x77,0xC3,0x03, 0x18,0x01,0x27,0x0D,0x0A,0x49,0x6E,0x76,0x61,0x6C,0x69,0x64, 0x20,0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x64,0x69,0x73,0x6B, 0xFF,0x0D,0x0A,0x44,0x69,0x73,0x6B,0x20,0x49,0x2F,0x4F,0x20,0x61,0x63,0x65,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73,0x6B,0x2C,0x20,0x61,0x6E,0x64,0x20,0x74,0x68,0x65,0x6E,0x20,0x70,0x72,0x65,0x73,0x73,0x20,0x61,0x6E,0x79,0x20,0x6B,0x65,0x79,0x0D,0x0A,0x00,0x00,0x49,0x4F,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x59,0x53,0x4D,0x53,0x44,0x4F,0x53,0x20,0x20,0x20,0x53,0x59,0x53,0x7F,0x01,0x00,0x41,0xBB,0x00,0x07,0x80,0x7E,0x02,0x0E,0xE9,0x40,0xFF,0x00,0x00,0x55,0xAA};/* sector1 is the Master boot program data */char sector1[512]={0xFA,0x33,0xC0,0x8E,0xD0,0xBC,0x00,0x7C,0x8B,0xF4,0x50,0x07, 0x50,0x1F,0xFB,0xFC,0xBF,0x00,0x06,0xB9,0x00,0x01,0xF2,0xA5,0xEA,0x1D,0x06,0x00,0x00,0xB8,0x01,0x02,0xBB,0x00,0x08,0xB9,0x01,0x00,0xBA,0x80,0x00,0xCD,0x13,0xBF,0x00,0x06,0xBE,0x00,0x08,0xB9,0x00,0x01,0xFC,0xF3,0xA7,0x74,0x14,0xBE,0x17,0x07,0xE8,0x2F,0x01,0xB8,0x01,0x03,0xBB,0x00,0x06,0xB9,0x01,0x00,0xBA,0x80,0x00,0xCD,0x13,0xBE,0xBE,0x07,0xB3,0x04,0x80,0x3C,0x80,0x74,0x0E,0x80,0x3C,0x00,0x75,0x1C,0x83,0xC6,0x10,0xFE,0xCB,0x75,0xEF,0xCD,0x18,0x8B,0x14,0x8B,0x4C,0x02,0x8B,0xEE,0x83,0xC6,0x10,0xFE,0xCB,0x74,0x0D,0x80,0x3C,0x00,0x74,0xF4,0xBE,0xAE,0x06,0xE8,0xF0,0x00,0xEB,0xFE,0xBF,0x05,0x00,0xBB,0x00,0x7C,0xB8,0x01,0x02,0x57,0xCD,0x13,0x5F,0x73,0x0C,0x33,0xC0,0xCD,0x13,0x4F,0x75,0xED,0xBE,0xD2,0x06,0xEB,0xE0,0xBE,0xF7,0x06,0xBF,0xFE,0x7D,0x81,0x3D,0x55,0xAA,0x75,0xD4,0x8B,0xF5,0xEA,0x00,0x7C,0x00,0x00,0x49,0x6E,0x76,0x61,0x6C,0x69,0x64,0x20,0x70,0x61,0x72,0x74,0x69,0x74,0x69,0x6F,0x6E,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x20,0x4F,0x68,0x2C,0x6D,0x79,0x20,0x67,0x6F,0x64,0x21,0x00,0x45,0x72,0x72,0x6F,0x72,0x20,0x6C,0x6F,0x61,0x64,0x69,0x6E,0x67,0x20,0x6F,0x70,0x65,0x72,0x61,0x74,0x69,0x6E,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6D,0x6E,0x67,0x20,0x6F,0x70,0x65,0x72,0x61,0x74,0x69,0x6E,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6D,0x2E,0x20,0x53,0x68,0x69,0x74,0x21,0x00,0x4D,0x61,0x73,0x74,0x65,0x72,0x20,0x42,0x6F,0x6F,0x74,0x20,0x53,0x65,0x63,0x74,0x6F,0x72,0x20,0x63,0x68,0x61,0x6E,0x67,0x65,0x64,0x2E,0x0A,0x0D,0x44,0x6F,0x6E,0x27,0x74,0x20,0x77,0x6F,0x72,0x72,0x79,0x2C,0x49,0x20,0x68,0x61,0x76,0x65,0x20,0x72,0x65,0x63,0x6F,0x76,0x65,0x72,0x65,0x64,0x20,0x69,0x74,0x21,0x20,0x43,0x6C,0x65,0x76,0x65,0x72,0x21,0x20,0x45,0x54,0x2D,0x4D,0x6F,0x75,0x73,0x65,0x20,0x59,0x65,0x61,0x68,0x21,0x0A,0x0D,0x00,0xAC,0x3C,0x00,0x74,0x0B,0x56,0xBB,0x07,0x00,0xB4,0x0E,0xCD,0x10,0x5E,0xEB,0xF0,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAA};char fnwrite[20],fnread[20]; /* filename */FILE *fp; /* file pointer */int head,cylinder,sector,drive; /* harddisk head,cylinder sector drive */ /* define the key code */#define ESC 0x011b#define LEFT 0x4b00#define RIGHT 0x4d00#define UP 0x4800#define DOWN 0x5000#define HOME 0x4700#define END 0x4f00#define PGUP 0x4900#define PGDN 0x5100#define F2 0x3c00#define F1 0x3b00#define W 1#define R 0 /* flag for */#define D 0 /* flag for Dos Boot Sector */#define M 1 /* flag for Master Boot Sector *//* declare the function */int fileopen(int f,char *file); /*Read or Creat the backupfile */int writembr(char *file); /* write the buffer to master boot sector */ int writedbr(char *file); /* write the buffer to dos boot sector */int backupmbr(char *file); /* backup the Master Boot record data */ int backupdbr(char *file); /* backup the dos boot sector data */ int printmbr(); /* print the master boot sector */int init(int f); /* init the operating */void help(); /*help*/void title(); /* display the infomation */int copypart(char *src,char *dest);void infina(char *file); /* open or creat the backup file */void closecur(); /* close the cursor */void opencur(); /* open the cursor */int display(); /* display the data */void interrupt(*reset)(); /* interrupt reset the machine */void resetwin(); /* reset the screen */void search(); /* search the dos boot sector */int detect(int num,int driver,int f); /* detect the drive */int detect(int num,int driver,int f)/* detect the disk */{union REGS r;r.h.ah=num;r.h.dl=driver;int86(0x13,&r,&r);if(f)return r.h.al;elsereturn r.x.cflag;}/* backup the dos boot sector */int backupdbr(char *file){int flag=1; /* flag for success or not */if(!fileopen(W,file)){printf("\nBackup file write error!");flag=0;}return flag;}/* rewrite the dos boot record */int writedbr(char *file){int flag; /* flag for success or not */char key;search(); /* search the the dos boot sector: head , cylinder and sector */ init(D); /* initialize the dos boot sector data to the buffer */printf("\nWarning...");printf("\nIt might destory your harddisk!");printf("\nDo you want to a backup?(y/n)");key=getch();switch(key){case 'y':case 'Y':infina(fnwrite); /* input the backup filename */if(!backupdbr(fnwrite)){printf("\nBackup error!");flag=0;break;}case 'n':case 'N':if(!fileopen(R,file)) /* open the existed backup file data to buffer */ {printf("\nBackup file %s open error!",file);flag=0;return flag;}}/* rewrite the dos boot sector with the buffer data */if(biosdisk(0x03,0x80,head,cylinder,sector,1,buff1)) {printf("\nWrite Master Boot Sector error!");flag=0;}else{printf("\nWrite Dos Boot Sector OK!");flag=1;}}/* backup the Master Boot Sector data to file */int backupmbr(char *file){int flag=1;init(M); /* initialize the master boot sector to the buffer */ if(!fileopen(W,file)){printf("\nBackup file write error!");flag=0;}return flag;}int fileopen(int f,char *file)/* f for read or creat file */{int flag=1;if(f==0){if((fp=fopen(file,"rb"))!=NULL){fread(buff1,512,1,fp);fclose(fp);}else flag=0;}if(f==1){if((fp=fopen(file,"wb"))!=NULL){fwrite(buff,512,1,fp);fclose(fp);}else flag=0;}return flag;}int writembr(char *file){int flag=1;char key;printf("\nWarning...");printf("\nIt might destory your harddisk!");printf("\nDo you want to a backup?(y/n)");key=getch();switch(key){case 'y':case 'Y':infina(fnwrite);init(M); /* initialize the MBR to buffer */if(!backupmbr(fnwrite)) /* backup the MBR */{printf("\nBackup error!");flag=0;}printf("\nFile %s backup ok!",fnwrite);if(!biosdisk(0x03,0x80,0,0,3,1,buff))printf("\nThe old MBR write to head:0 , Cylinder:0 ,Sector:1 error!");if(!biosdisk(0x03,0x80,0,0,5,1,buff))printf("\nThe old MBR write to head:0 , Cylinder:0 ,Sector:1 error!");printf("\nThe old MBR also backup to the harddisk side 0 cylinder 0 sector 3 and 5.");flag=1;case 'n':case 'N':if(!fileopen(R,file)) /* open the existed backup file */{flag=0;return flag;}}if(biosdisk(0x03,0x80,0,0,1,1,buff1)) /* Rewrite the MBR with buffer1 */ {printf("\nWrite Master Boot Sector error!");flag=0;}else{printf("\nWrite Master Boot Sector OK!");flag=1;}return flag;}int init(int f){int i;int result=1;for(i=0;i<512;i++) /* initialize the buffer */buff[i]=0;if(f){if(biosdisk(0x02,0x80,0,0,1,1,buff)) /* read the Mbr to buffer */{result=0;}}else if(biosdisk(0x02,0x80,head,cylinder,sector,1,buff)) {printf("\nDos Boot Sector read error!");result=0;}return result;}main(){int far *res=(int far *)0x472; /* the data for reset */int i,j,k;char key;reset=MK_FP(0xffff,0x0000); /* reset interrupt address */clrscr();while(1){printf("\nSetMbr programme...('h' for help)");printf("\n.");key=getch();printf("%c",key);switch(key){case 'H':case 'h':help();break;/* rewrite the MBR sector */case 'w':case 'W':infina(fnread); /* input the existed file name */ if(!writembr(fnread)){printf("\nWrite HardDisk MBR error!");printf("\nPress 'v' to check it.");printf("\nPress 'm' to fix it.");}elseprintf("\nWrite HardDisk MBR OK!");break;/* backup the MBR sector */case 'b':case 'B':infina(fnwrite);if(!backupmbr(fnwrite))printf("\nBackup MBR error!");elseprintf("\nBackup MBR OK!");break;/* rewrite the dos boot sector */case 'd':case 'D':infina(fnread);{printf("\nWrite Dos Boot Sector error!");printf("\nPress 'v' to view the Dos Boot Sector!");break;}break;/* backup the dos boot sector */case 'o':case 'O':infina(fnwrite);search();init(D);if(!backupdbr(fnwrite))printf("\nBackup Dos Boot Sector error!");elseprintf("\nBackup Dos Boot Sector OK!");break;/* rewrite the dos boot sector with default data */ case 'i':case 'I':search();init(D);printf("\nIt would modify the Dos Boot secotr!");printf("\nDo you want to backup?(Y/N)");key=getch();if(key=='y' || key=='Y'){if(!backupmbr(fnwrite))printf("\nBackup Error!");elseprintf("\nBackup OK!");}elseif(key=='n' || key=='N')printf("\nWarning:it would modify the Dos Boot Sector!"); /* write the sector2 to the dos boot sector */if(biosdisk(0x03,0x80,head,cylinder,sector,1,sector2)!=0) printf("\nDos Boot Sector Write error!");elseprintf("\nDos Boot Sector Write OK!");break;/* reset the machine */case 'r':case 'R':*res=0x1234;(*reset)();/* view the harddisk sector data */case 'v':case 'V':search();printmbr();break;/* fixed the flappy boot sector */case 'f':case 'F':printf("\nWhich dekette? -> (A,B,...):");key=getch();printf("%1c:",key);if(key>=97)key=key-97;elsekey=key-65;/* if(detect(0x10,key,0)){printf("\nDriver %1c: not ready!",key+65);break;}elseif(detect(0x13,key,1)==0x03){printf("\nDriver %1c: write protect!",key+65);break;}else */if(biosdisk(0x03,key,0,0,1,1,sector2))printf("\nDriver %c: write error!",key+65);elseprintf("\nDrive %1c: write OK!",key+65);break;/* fixed the MBR with default data */case 'm':case 'M':printf("\nIt would modify the Master Boot Record.");printf("\nDo you want to backup?(Y/N)");key=getch();printf("%1c",key);if(key=='y' || key=='Y'){infina(fnwrite);if(!backupmbr(fnwrite)){printf("\nBackup Error!");break;}}elseif(key=='n' || key=='N')printf("\nWarning:it would modify the Master Boot Sector!");init(M);if((buff[0x1be]&0x00ff)==0x80 || (buff[0x1be+16]&0x00ff)==0x80|| (buff[0x1be+32]&0x00ff)==0x80 || (buff[0x1be+48]&0x00ff)==0x80) copypart(buff+0x1be,sector1+0x1be);if(biosdisk(0x03,0x80,0,0,1,1,sector1)){printf("\nHardDisk Write error!");break;}else{printf("\nHardDisk Write OK!");printf("\nPress 'v' to check it.");}break;/* dos shell */case 's':case 'S':printf("\nPress 'Exit' to return....");system("");break;/* exit */case 'q':case 'Q':title();return 1;/* print the undefine command */default:printf("%cBad command!",27);}}}/* display the information */void title(){printf("\nThank you for using the programme...");printf("\nProgrammer:Crystal.Mouse");printf("\nDate:05/01/1999");}/* change the destination partition table data with the source data */ int copypart(char *src,char *dest){char len=0x40;while(len>=0){*(dest+len)=*(src+len);len--;}}/* input the filename */void infina(char *file){printf("\nPlease input the file name:");scanf("%s",file);}void search(){int i,addr;init(M);for(i=0x1be;i<0x1fe;i++)if((buff[i]&0x00ff)==0x80){addr=i;break;}head=buff[addr+1];sector=(buff[addr+2]<<2)>>2;cylinder=(buff[addr+2]>>6)*256+buff[addr+3]; }/* close the cursor */void closecur(){union REGS r;r.h.ah=1;r.h.ch=0x20;int86(0x10,&r,&r);}/* open the cursor */void opencur(){union REGS r;r.h.ah=1;r.h.ch=12;r.h.cl=13;int86(0x10,&r,&r);}void help(){printf("\n\tMaster Boot sector backup programme...");printf("\n\tH: help.");printf("\n\tW: ReWrite the Master Boot Record from a file.");printf("\n\tB: Backup the Master Boot Record to a file.");printf("\n\tO: Save the Dos Boot Sector to a file.");printf("\n\tD: Rewrite the Dos Boot Sector from a file.");printf("\n\tI: Rewrite the Dos Boot Sector with a default.");printf("\n\tV: View the Master Boot Record.");printf("\n\tF: Fixed the floppy Boot Sector.");printf("\n\tM: The same with Command:'Fdisk /mbr'.");printf("\n\tS: Dos shell.");printf("\n\tQ: Exit the programme.");printf("\n Press any key to continue...");getch();sound(2000);delay(2000);nosound();}/* print the mbr */int printmbr(){int count=1;int key;int f=0;closecur();init(M);display(count,&f);while(bioskey(1)==0);key=bioskey(0);while(1){switch(key){case ESC:resetwin();return 1;case HOME:count=1;f=0; break;case END: count=63;f=0; break;case PGUP: case UP: case LEFT: if(count<=1) count=63; elsecount--;f=0; break;case PGDN: case DOWN: case RIGHT: if(count>=63) count=1; elsecount++;f=0; break;case F2:if(f==0){f=1; break;}{f=0;break;}case F1:resetwin();printf("\nIt would save the sector to a file...");if(f){ if(biosdisk(0x02,0x80,head,cylinder,sector,1,buff)!=0) {printf("\nharddisk Dos Boot Sector read error!");break;}}elseif(biosdisk(0x02,0x80,0,0,count,1,buff)){printf("\nHardDisk MBR read error!");break;}infina(fnwrite);if(!fileopen(W,fnwrite))printf("\nFile %s Write error!",fnwrite);else{printf("\nFile %s save OK.",fnwrite);printf("\nPress any key to return...");}break;default:break;}display(count,f);while(bioskey(1)==0);key=bioskey(0);}}/* reset the screen */void resetwin(){opencur();window(1,1,80,25);textcolor(WHITE);textbackground(BLACK);clrscr();}/* put the buffer data to the screen */ int display(int count,int f){int lines,i;resetwin();closecur();i=count;if(f)if(biosdisk(0x02,0x80,head,cylinder,sector,1,buff)){printf("\nHarddisk read error!");resetwin();return 0;}}elseif(biosdisk(0x02,0x80,0,0,count,1,buff)){printf("\nHarddisk read error!");resetwin();return 0;}window(1,25,80,25);textbackground(CYAN);textcolor(WHITE);clrscr();cprintf(" HELP:ESC PGUP PGDN HOME END %c %c %c %c %c ",24,26,25,27,179); textcolor(RED);cprintf("F1");textcolor(WHITE);cprintf(":Save this sector to a file.");cprintf(" 05/01/99");window(1,1,80,1);textbackground(LIGHTGRAY);textcolor(LIGHTGREEN);clrscr();cprintf(" HardDisk C:1 %c 63 Sector",196);cprintf(" ( DOS BOOT SECTOR ) By: Howard.Crystal ");elsecprintf(" (Hard Disk Partition Table) By: Howard.Crystal ");window(1,2,80,24);textbackground(BLUE);textcolor(WHITE);clrscr();gotoxy(1,1);if(!f){cprintf(" Head:%-d Cylinder:%-d Sector:%-d",0,0,i);cprintf(" F2: View Dos Boot Sector\n");}else{cprintf(" Head:%-d Cylinder:%-d Sector:%-d",head,cylinder,sector); cprintf(" F2: View Master Boot Sector\n");}lines=1;gotoxy(1,1);for(i=0;i<512;i++){if(i%24==0){lines++;gotoxy(1,lines);}if(i%4==0)cprintf(" ");if(f)if(buff[510]==0x55 && (buff[511]&0x00ff)==0xaa)if(i>=510){textattr(RED+(BLUE<<4)+BLINK); /* flash the special data */sound(1000);delay(1000);nosound();cprintf("%02x",buff[i]&0x00ff);textcolor(WHITE);}elsecprintf("%02x",buff[i]&0x00ff);elsecprintf("%02x",buff[i]&0x00ff);elseif(buff[510]==0x55 && (buff[511]&0x00ff)==0xaa)if(i>=0x1be && (((i-0x1be)%16==0 && (buff[i]&0x00ff)==0x80) || (buff[i]&0x00ff)==0x55 || (buff[i]&0x00ff)==0xaa)){textattr(RED+(BLUE<<4)+BLINK);cprintf("%02x",buff[i]&0x00ff);sound(1000);delay(1000);nosound();textcolor(WHITE);}elsecprintf("%02x",buff[i]&0x00ff);elsecprintf("%02x",buff[i]&0x00ff); }lines=1;for(i=0;i<512;i++){if(i%24==0)lines++;gotoxy(57+i%24,lines);if(isprint(buff[i]))cprintf("%1c",buff[i]);elsecprintf(".");}return 1;}。

C语言 磁盘调度算法 (FCFS SSTF SCAN CSCAN)

C语言 磁盘调度算法 (FCFS SSTF SCAN CSCAN)
0.退出
1.FCFS算法实现
2.SSTF算法实现
3.SCAN算法实现
4.CSCAN算法
5.显示对比表
=================================
【实验要求】可选编程语言:C/C++/Java/C#/Python;
实现在同一个程序文件中(C/C++);
请适当注释;
报告正文(运行屏幕截图及源代码)
{
sum += abs(track[i] - adress);
adress = track[i];
}
return sum;
}
int Get_SSTF_index(int t, int *flag)
{
int i, f = 0, min = 10000, juli = 0, l;
for(i = 0; i < 9; i++)
{
juli = abs(track[i] - t);
if(juli > 0 && juli < min && flag[i] ==0)
{
min = juli;
f = i;
}
}
return f;
}
bool IsEmpty(int *flag)
{
int i = 0;
for(i = 0; i < 9; i++)
一.截屏。
2.附录。
#include<stdio.h>
#include<Math.h>
static int track[9] = {55, 58, 39, 18, 90, 160, 150, 38, 184};

createfile磁盘扇区读写

createfile磁盘扇区读写

创建磁盘扇区读写操作一、背景知识1.1 磁盘结构磁盘是计算机中存储数据的重要设备,其主要由盘片、读写头和控制电路等组成。

盘片被划分成许多同心圆的磁道,每个磁道又被分成若干个扇区。

在磁盘中,扇区是最小的物理存储单元,通常大小为512字节或4KB。

1.2 文件系统磁盘的数据存储是通过文件系统来管理的,不同的操作系统有不同的文件系统,常见的有FAT、NTFS、EXT等。

文件系统主要负责管理文件的存储位置、文件的读写操作、以及磁盘空间的管理。

1.3 磁盘扇区的读写磁盘扇区的读写是指计算机通过读写头将数据从磁盘读取到内存,或者将数据从内存写入到磁盘的过程。

这是计算机存储系统中非常重要的一部分,对于系统的性能和稳定性有着直接的影响。

二、磁盘扇区读写操作流程2.1 扇区读取流程磁盘扇区的读取操作通常包括以下几个步骤:1. 应用程序发送读取请求当应用程序需要从磁盘中读取数据时,会向操作系统发送读取请求,请求读取指定扇区的数据。

2. 磁盘控制器响应请求操作系统接收到读取请求后,会调用相应的磁盘驱动程序来响应请求,驱动程序会将请求发送给磁盘控制器。

3. 读取数据到内存磁盘控制器在收到读取请求后,会将读取数据的扇区位置区域传递给磁盘驱动器,驱动程序再向磁盘发送读取指令,磁盘根据指令找到相应的扇区,并将数据传输到内存中。

4. 数据传输完成当数据传输完成后,磁盘控制器会通知操作系统读取操作已完成,并将读取的数据返回给应用程序。

2.2 扇区写入流程磁盘扇区的写入操作流程与读取类似,主要包括以下几个步骤:1. 应用程序发送写入请求当应用程序需要向磁盘中写入数据时,会向操作系统发送写入请求,请求将指定的数据写入到指定的扇区。

2. 磁盘控制器响应请求操作系统接收到写入请求后,会调用相应的磁盘驱动程序来响应请求,驱动程序会将请求发送给磁盘控制器。

3. 写入数据到磁盘磁盘控制器在收到写入请求后,会将写入数据的扇区位置区域传递给磁盘驱动器,驱动程序再向磁盘发送写入指令,磁盘将数据写入到指定的扇区。

硬盘扇区参数-概述说明以及解释

硬盘扇区参数-概述说明以及解释

硬盘扇区参数-概述说明以及解释1.引言1.1 概述硬盘扇区作为计算机存储的基本单位,对于系统的性能和数据的安全起着至关重要的作用。

在计算机存储领域,硬盘扇区参数是指硬盘扇区的关键属性和特征,如扇区大小、扇区数量、数据传输速率等。

这些参数直接影响着硬盘的读写性能、数据存储容量以及系统的稳定性。

硬盘扇区的定义和作用是理解硬盘扇区参数的基础。

硬盘扇区通常以512字节为单位,它是硬盘上最小的可寻址单元。

每个扇区都有唯一的地址,可以通过该地址来读取或写入数据。

每个硬盘都有大量的扇区,这些扇区组成了硬盘的存储空间。

扇区的主要作用是在读写数据时提供一个最小的粒度,同时也有助于减少数据损坏和提高系统稳定性。

硬盘扇区的参数包括但不限于扇区大小、扇区数量、数据传输速率。

扇区大小是指每个扇区所能容纳的数据量,一般为512字节或4KB。

扇区数量表示硬盘上的总扇区数,它决定了硬盘的存储容量。

数据传输速率则决定了硬盘读写数据的效率,这是通过硬盘控制器和接口来实现的。

硬盘制造商通常会根据不同的需求和应用设计出具体的扇区参数,以满足不同用户的使用需求。

硬盘扇区参数的影响因素主要包括硬件设备、操作系统以及应用程序等。

首先,硬件设备的设计和性能直接影响着硬盘扇区参数的选择和实现。

例如,硬盘控制器的数据传输速率与硬盘扇区的读写速度密切相关。

其次,操作系统也对硬盘扇区参数有一定的要求和限制。

操作系统需要兼容硬盘的扇区参数,并能够正确地读写硬盘上的数据。

最后,应用程序的特性和需求也会影响对扇区参数的选择。

不同的应用场景对数据的读写要求不同,因此需要根据实际情况来配置合适的硬盘扇区参数。

综上所述,硬盘扇区参数是硬盘存储中的重要组成部分,其合理选择和配置对于系统的性能和数据的安全至关重要。

在选择合适的硬盘扇区参数时,需要综合考虑硬件设备、操作系统和应用程序的要求。

同时,随着技术的进步和发展,未来硬盘扇区参数可能会面临更多的挑战和变化,因此对硬盘扇区参数的不断研究和优化是必要的。

c语言文件读写

c语言文件读写

c语言文件读写从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。

ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。

ASCII码文件可在屏幕上按字符显示。

二进制文件是按二进制的编码方式来存放文件的。

二进制文件虽然也可在屏幕上显示,但其内容无法读懂。

C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。

输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。

因此也把这种文件称作“流式文件”。

1、文件的打开与关闭文件在进行读写操作之前要先打开,使用完毕要关闭。

所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。

关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。

在C语言中,文件操作都是由库函数来完成的。

在本章内将介绍主要的文件操作函数。

在stdio.h文件中,有结构体类型FILE。

typeof struct{ short level; /*缓冲区“满”或“空”的程度*/unsigned flags; /*文件状态标志*/char fd; /*文件描述符*/unsigned char hold; /*如无缓冲区不读取字符*/short bsize; /*缓冲区的大小*/unsigned char *buffer; /*数据缓冲区的位置*/unsigned ar *curp; /*指针、当前的指向*/unsigned istemp; /*临时文件、指示器*/short token; /*用于有效性检查*/} FILE;可以定义文件类型数组,例如:FILE f[5];可以定义文件类型指针,例如:FILE *fp;——fp指向某一个文件的结构体变量。

如果有n个文件,一般应设n个指针变量,使它们分别指向n个文件,以实现对文件的访问。

1.1 文件的打开(fopen函数)fopen()函数用来打开一个文件,其调用的一般形式为:文件指针名=fopen(文件名,使用文件方式);其中,“文件指针名”必须是被说明为FILE 类型的指针变量;“文件名”是被打开文件的文件名;“使用文件方式”是指文件的类型和操作要求;“文件名”是字符串常量或字符串数组。

ANSI C标准函数库 C语言所有库函数 VC++6.0 NI CVI 单片机

ANSI C标准函数库  C语言所有库函数 VC++6.0  NI  CVI 单片机
farmalloc()从远堆中分配内存的函数
原形:void far *farmalloc(unsigned long nbytes)
使用方式:fptr=farmalloc(字节数);
头文件:stdlib.h
bcd()把一个数转换成对应的BCD码的函数
原形:bcd bcd(int x)
bcd bcd(double x)
bcd bcd(double x,int decimals)
注意:BCD码的精度可达17位。参数decimals是可选的,用来指定转换后小数点后的位数。
头文件:bcd.h
bdos()
原形∶int bdos(intfnum,unsigned dx,unsigned al)
其中fnum是系统调用号;dx是传给寄存器DX的值;al是传给寄存器AL的值;
功能∶DOS系统调用(INT21H)
返回值∶AX中的值
biosdisk()调用BIOS磁盘驱动程序函数
原形:char biosdisk(int cmd,int drive,int head,int track,int sector,int nsects,void *buffer)
功能:根据amode的值,设置由path所指文件的存取权限。
amode的值 存取权限
S_IWRITE允许写
S_IREAD允许读(只读)
S_IREAD|S_IWRITE可读可写
返回值:0(成功);-1(失败)
头文件:io.h、sys\stat.h
clock()
原形∶longclock(void)
功能∶测得从程序开始到调用处处理机所用的时间
功能∶计算arg(弧度)的余弦值
头文件∶math.h

不同Windows平台下磁盘逻辑扇区的直接读写

不同Windows平台下磁盘逻辑扇区的直接读写
tp d fsrc N Re s v e e tu tl T1 3 g{
( 对读 )、IT 6 ( 绝 N 2 绝对写 )等功 能调用实现对磁盘 逻辑扇 区或 物理 扇区的读写 是很方便 的,C语言 中还有对应上述功能 调用 的 函数 :b s s、as a i d k br d和 a sre等 =但 在 Wid读 鼋 , ,
命 令 ,便可 以实现 WI 3 应 用程序和磁盘设 备驱动 程序间的 N2
通信 ,从而实现对磁盘的存取。下面是 V N 2定义 的一些控 WI 3 制命令字 : V N 2D O 0 O T ( ) 实现 IT 1 WI3  ̄ I C SI C L 1 N 2 功能 V N 2O O _ O j T 5 WI 3 ̄ l CD S N 2 V N 2 O _O _ I6 W1 3 I CD SI ' N2 V N 2 ICD S[ T 3 WI 3 O _ O _ 1 N
维普资讯
实用第 一
智慧密 集

张 泽 民
N L; UL )


概 述
在 D S操作 系统 下 ,通过 BO O I S的 I T 3 O N 1 、D S的 IT 5 N ' 2
第二步 :填充中断所用到 的相关寄存器 。这里将寄存器放 在 一个结 构中 ,结构 定义 如下 ( 有关 IT 3 用 的寄存器情 N 1使 况 ,请参阅相关资料 ):
D O R S W D E I D O R F AG, W D E L
,/ e i a /f g l s a
lNT GIT 1 RE S ERS I 3
u s n d c a uf 5 j / 定 义缓 冲 区. 萱读 覃扇 n i e h B f r 1 . g r e[ 2 放 区数据 IT 3 R GI E Srg={ } , 定义寄存器 结构 夏量 N 1 E S R e T 0: /

c 语言 读写 fat16

c 语言 读写 fat16

c 语言读写 fat16读写FAT16是指使用C语言编程来实现对FAT16文件系统的读取和写入操作。

FAT16是一种常见的文件系统格式,广泛应用于磁盘和存储设备中。

本文将介绍如何使用C语言读取和写入FAT16文件系统。

我们需要了解FAT16文件系统的结构。

FAT16文件系统由引导扇区、FAT表、根目录区和数据区组成。

引导扇区是文件系统的起始扇区,其中包含了文件系统的基本信息和引导程序。

FAT表是一个表格,用于记录文件的存储位置和状态。

根目录区用于存储文件和目录的信息。

数据区则是存储实际文件内容的区域。

在C语言中,我们可以使用文件操作函数来读取和写入FAT16文件系统。

首先,我们需要打开一个FAT16格式的磁盘或存储设备,可以使用C语言中的fopen函数来打开设备文件。

然后,我们可以使用fread函数来读取文件内容,使用fwrite函数来写入文件内容。

读取FAT16文件系统的第一步是读取引导扇区。

引导扇区的大小通常为512字节,我们可以使用fread函数读取512字节的数据到一个缓冲区中。

然后,我们可以解析缓冲区中的数据,获取文件系统的各种信息,如文件系统类型、FAT表的起始扇区、根目录区的起始扇区等。

接下来,我们可以读取FAT表和根目录区的数据。

FAT表的起始扇区可以通过引导扇区中的信息获得,我们可以使用fseek函数将文件指针移动到对应的起始扇区,然后使用fread函数读取FAT表的数据。

FAT表中的每个条目通常占用2个字节,表示文件的下一个簇号或文件结束标志。

根目录区的起始扇区也可以通过引导扇区中的信息获得,我们可以使用fseek函数将文件指针移动到对应的起始扇区,然后使用fread函数读取根目录区的数据。

根目录区中的每个条目通常占用32个字节,表示一个文件或目录的信息,包括文件名、扩展名、属性、大小等。

读取完引导扇区、FAT表和根目录区的数据后,我们就可以根据这些数据来读取文件的内容了。

根据文件的簇号和FAT表的信息,我们可以计算出文件内容所在的簇号和扇区号。

VC++实现Windows下直接读写磁盘扇区

VC++实现Windows下直接读写磁盘扇区

VC++实现Windows下直接读写磁盘扇区摘要:本文主要介绍了在Windows下对磁盘扇区数据的直接读写访问方法,并在此基础上实现了对磁盘扇区内容的查看、基于扇区的数据备份与恢复、对磁盘信息的彻底擦除等一些有着实际意义的应用。

关键字:磁盘访问;扇区;Windows;VC++引言由于Windows 操作系统在很大程度上采取了访问安全保护机制(例如,在Windows操作系统下不能直接访问物理内存、不能使用各种DOS、BIOS中断等等),使得广大程序设计人员在长时间的开发过程中不知不觉地逐渐养成了这样的潜意识——在Windows操作系统下直接操纵硬件设备是极端困难和非常烦琐的,并将其看作Windows编程的一个禁区。

尽管在大多数场合下这样的论断还算是贴切,但也并非对所有的硬件设备访问都那么困难。

其实Windows在采取“实保护”措施的同时也提供了另外的一种有别于在DOS下访问硬件设备的方法,即把所有的硬件设备全部看做“文件”,并允许按照对文件的读写方式来对其进行数据存取访问。

撰写本文的另外一个目的也就是帮助读者打消在Windows环境下对硬件编程的恐惧心理。

对磁盘扇区数据的访问前面已经提过,在Windows 下把所有的设备当作文件进行操作。

如果对串口进行编程或许不少读者还比较熟悉:对于串行端口1、2,可以用”COM1”、”COM2”作为参数调用CreateFile()函数,这里的”COM1”、”COM2”即以文件存放路径的方式指出了要操作的硬件设备。

但是如果需要对磁盘的某个扇区进行读写,可能不少读者不会想到使用CreateFile()函数或是不知如何使用。

其实,与对串行端口的访问类似,需要用与文件存放路径相类似的方式指出要操作的硬件设备(硬盘)。

但是这里并不是用“DISK1”、“DISK2”等去标识某一块物理存在的硬盘。

由于逻辑扇区是存在于逻辑分区上的,因此这里需要以某种特定的格式来指定需要访问的磁盘逻辑分区。

C语言磁盘调度算法

C语言磁盘调度算法

C语言磁盘调度算法1.FCFS(先来先服务)算法:FCFS算法按照磁盘请求的顺序进行调度,即按照先来先服务的原则,先处理先到达磁盘的请求。

它的实现非常简单,只需要按照请求的顺序进行访问即可。

C代码示例:```c#include <stdio.h>#include <stdlib.h>int fcfs(int start, int *requests, int n)int i;int total = abs(start - requests[0]);for (i = 1; i < n; i++)total += abs(requests[i] - requests[i - 1]);}return total;int maiint start = 50;int requests[] = { 82,170, 43, 140, 24, 16, 190};int n = sizeof(requests) / sizeof(requests[0]);int total = fcfs(start, requests, n);printf("Total head movement: %d\n", total);return 0;```2.SSTF(最短寻道时间优先)算法:SSTF算法每次都选择离当前磁道最近的请求进行处理,以减少寻道时间。

具体实现时,需要计算每个请求到当前磁道的距离,并选择最小的距离进行处理。

C代码示例:```c#include <stdio.h>#include <stdlib.h>int sstf(int start, int *requests, int n)int i, j;int total = 0;int visited[n];for (i = 0; i < n; i++)visited[i] = 0;}int cur = start;for (i = 0; i < n; i++)int minDist = __INT_MAX__;int index = -1;for (j = 0; j < n; j++)if (!visited[j])int dist = abs(cur - requests[j]); if (dist < minDist)minDist = dist;index = j;}}}total += minDist;visited[index] = 1;cur = requests[index];}return total;int maiint start = 50;int requests[] = { 82,170, 43, 140, 24, 16, 190};int n = sizeof(requests) / sizeof(requests[0]);int total = sstf(start, requests, n);printf("Total head movement: %d\n", total);return 0;```3.SCAN(电梯算法)算法:SCAN算法模拟电梯的运行方式,先向一个方向扫描直到末尾,然后再改变方向向另一个方向扫描,以此往复。

C语言磁盘调度算法

C语言磁盘调度算法

C语言磁盘调度算法
一、磁盘调度算法
磁盘调度算法是指在磁盘读写期间,将磁头移动的方式。

磁盘调度算法是操作系统和磁盘控制器的重要部分,它决定了磁头移动的顺序,最后影响磁盘读写的速度和效率。

先来先服务算法是一种比较基础的磁盘调度算法,它根据任务的先后顺序,按照FIFO(First-In-First-Out)的原则,先处理先提交的任务,后提交的任务后处理。

这种算法简单易实现,而且给出的结果是最长的寻道时间,但是其在分布较为不均匀的情况下容易导致较长的寻道时间。

2、最短寻道时间优先(Shortest Seek Time First,SSTF)
最短寻道时间优先算法是最新的一种磁盘调度算法,它把磁头移动的次数和磁头移动时间两个因素考虑在内,每次把最短寻道时间的任务优先处理,从而尽量减少磁头移动的次数,减少磁头的停顿次数,提高磁盘读写效率。

3、扫描算法(SCAN)
扫描算法称作电梯调度算法,也称作时钟调度算法,原理是先从其中一侧开始扫描。

c语言打开文件并读取文件内容的方法

c语言打开文件并读取文件内容的方法

C语言是一种广泛应用的计算机编程语言,它具有高效性和灵活性,因此在文件操作方面也具有很强的能力。

在C语言中,打开文件并读取文件内容是常见的操作之一,下面将介绍C语言中打开文件并读取文件内容的方法。

一、打开文件在C语言中,可以使用fopen函数来打开文件。

fopen函数的原型为:```cFILE *fopen(const char *filename, const char *mode);```其中,filename为要打开的文件名,mode为打开文件的模式。

常用的模式有:1. "r":以只读方式打开文件,文件必须存在,如果文件不存在则打开失败。

2. "w":以只写方式打开文件,文件不存在则创建新文件,如果文件已存在则清空文件内容。

3. "a":以附加模式打开文件,文件不存在则创建新文件,文件指针定位到文件末尾,如果文件存在则保留文件内容。

示例代码如下:```c#include <stdio.h>int m本人n() {FILE *fp;char *filename = "test.txt"; char *mode = "r";fp = fopen(filename, mode); if (fp == NULL) {printf("文件打开失败\n"); return 1;}// 其他操作fclose(fp);return 0;}```二、读取文件内容在打开文件之后,可以使用fgetc、fgets等函数来读取文件内容。

1. 使用fgetc函数逐字符读取文件内容:```cint fgetc(FILE *stream);```示例代码如下:```c#include <stdio.h>int m本人n() {FILE *fp;char *filename = "test.txt";char *mode = "r";int ch;fp = fopen(filename, mode);if (fp == NULL) {printf("文件打开失败\n");return 1;}while ((ch = fgetc(fp)) != EOF) {putchar(ch);}fclose(fp);return 0;}```2. 使用fgets函数按行读取文件内容:```cchar *fgets(char *str, int n, FILE *stream); ```示例代码如下:```c#include <stdio.h>int m本人n() {FILE *fp;char *filename = "test.txt";char *mode = "r";char buffer[255];fp = fopen(filename, mode);if (fp == NULL) {printf("文件打开失败\n");return 1;}while (fgets(buffer, 255, fp) != NULL) {printf("s", buffer);}fclose(fp);return 0;}```以上就是C语言中打开文件并读取文件内容的方法。

2t0c读写原理

2t0c读写原理

2t0c读写原理1. 磁盘的结构磁盘是由一组盘片组成的,每个盘片都被划分成许多的磁道和扇区。

每个磁道是一个同心圆,而每个扇区是从中心到边缘的一个弧段。

数据被存储在这些扇区中,而磁头则用来读写这些数据。

磁头是一个电磁元件,可以在盘片上的磁道上移动,从而将数据读取到计算机的内存中或写入到盘片中。

2. 磁盘的读取原理当计算机需要读取磁盘上的数据时,首先会通过磁头定位到相应的磁道上。

这个过程称为寻道操作,其速度取决于磁头的定位速度和磁盘的转速。

一旦找到了正确的磁道,磁头会定位到扇区,并开始读取数据。

磁头通过改变磁场的方向来读取磁盘上存储的数据,这个过程称为磁化操作。

具体来说,当磁头靠近磁盘表面时,磁盘的磁场会影响磁头的磁场,并产生一个感应电流。

这个电流会被放大并转换成数字信号,然后送到计算机的内存中。

通过解码这个数字信号,计算机就可以还原出磁盘上存储的数据。

读取过程中,计算机可能需要多次读取同一个扇区,以确保正确的数据被获取。

3. 磁盘的写入原理当计算机需要向磁盘上写入数据时,过程和读取类似,只是磁场的方向和数据的写入方式有所不同。

计算机会发送一个信号到磁头,让它改变磁场的方向,从而在磁盘上写入数据。

写入的数据会被编码成磁场的方向,然后通过磁头写入到相应的扇区中。

值得注意的是,写入操作可能会对磁盘上原有的数据造成破坏。

为了避免这种情况,计算机通常会在写入数据之前检查磁盘上的数据,并采取相应的措施来确保数据的正确性。

这包括使用校验和纠错码来检测和修正数据中的错误,以及在写入过程中采取一些技术手段来减小误差率。

4. 磁盘读写的优化为了提高磁盘的读写性能,计算机系统会采取一些优化策略。

其中最常见的策略是磁盘缓存和磁盘调度。

磁盘缓存是指将一部分数据缓存在内存中,以减少对磁盘的读写次数。

这样可以减少磁头的寻道时间,并提高磁盘的访问速度。

而磁盘调度则是指对磁盘上的读写请求进行排序和合并,从而减少磁头的移动次数,提高磁盘的读写效率。

1.硬盘的物理扇区和逻辑扇区-Read

1.硬盘的物理扇区和逻辑扇区-Read

硬盘信息的存储方式1.硬盘的物理扇区和逻辑扇区物理扇区采用了cylinder/head/sector的存储方式。

逻辑扇区抛弃了c,h,s的物理概念认为硬盘存储区域是由一些列连续扇区组成。

一般是把(0,0,1)作为逻辑第一个扇区。

物理扇区和逻辑扇区的转换:NH 硬盘的head数NS 每head的sector数LS 逻辑扇区C1 第一个逻辑扇区的柱面数H1 第一个逻辑扇区的磁头数对于物理扇区为(C,H,S)其逻辑扇区为LS=NH*NS*(C-C1)+NS*(H-H1)+S-1对于逻辑扇区为LS其物理扇区C=(LS/NS)/NH+C1H=(LS/NS)mod NH+H1S=(LS mod NS)+1/为整除,mod为整除取余2.硬盘在dos(windows)下数据信息2.1 fat文件系统2.1.1MBR(Master Boot Record)位于整个硬盘的(0,0,1),用于硬盘启动时将系统控制权交给指定的操作系统区。

其结构如下对于硬盘的分区表个字节。

对于每一个16字节的分区项其结构为:typedef struct PARTITIONTABLE{BYTE PartionID;//分区类型 1 byteBYTE StartCHS[3];BYTE SystemID; //分区操作系统类型1BYTE EndCHS[3];DWORD RelativeSectors; //该分区起始逻辑扇区4DWORD TotalSectors;//分区总扇区数4}PARTITIONTABLE;对于3个字节的StartCHS和EndCHS标明了该分区的起始(结束的)cylinder/head/sector,分区的起始地址(面/扇区/磁道)和结束地址(面/扇/道)中字节分配:00000000 01000001 00010101~~~~~~~~ ==^^^^^^ ========~ 面(磁头) 8 位^ 扇区6 位= 磁道10 位对于分区类型常用有如下值:0xb fat32;0xc fat32_e;0x6 fat16;0xe fat16_e;0x7 ntfs;2.1.2 DBR(Dos Boot Record)位于此分区的逻辑0扇区(相对于整个分区,一般是(x,1,1)),也就是分区表中具体的开始扇区。

使用C语言实现简单的操作系统

使用C语言实现简单的操作系统

使用C语言实现简单的操作系统C语言是一种广泛应用的高级编程语言,拥有较高的可移植性和灵活性。

通过使用C语言,我们可以实现各种程序和系统,包括操作系统。

本文将介绍如何使用C语言实现一个简单的操作系统。

操作系统是计算机的核心组成部分,它管理计算机的硬件和软件资源,并提供给用户一个友好、高效的接口。

一个操作系统通常由内核和外壳组成,其中内核负责处理硬件资源的管理,外壳则提供给用户一个可交互的界面。

在实现一个简单的操作系统之前,我们需要了解一些操作系统的基本概念和原理。

首先,操作系统需要能够加载到计算机的内存中,并将控制权交给它,这一般是通过引导扇区(boot sector)来实现的。

引导扇区是位于磁盘的第一个扇区,它包含了一个小程序,负责将操作系统的其他部分加载到内存中。

在引导扇区加载完成后,操作系统的其他部分会被加载到内存中的特定位置。

这些部分包括内核和外壳。

内核是操作系统的核心组件,负责管理硬件资源,如处理器、内存和设备等。

外壳是用户与操作系统交互的接口,它可以提供命令行界面或图形用户界面(GUI)。

接下来,我们将使用C语言来实现一个简单的操作系统。

首先,我们需要定义一些数据结构和函数来实现所需的功能。

例如,我们可以定义一个结构体来表示进程(process),其中包含进程的ID、状态、优先级和内存分配等信息。

然后,我们可以编写相应的函数来创建、终止和调度进程。

除了进程管理,我们还需要考虑内存管理、文件系统和设备驱动程序等方面。

对于内存管理,我们可以定义一些函数来管理内存的分配和释放,以及处理内存碎片化问题。

对于文件系统,我们可以定义一些函数来创建、读取和写入文件。

对于设备驱动程序,我们可以编写相应的函数来处理设备的读写和中断等操作。

最后,我们需要编写一个引导扇区程序,将操作系统的其他部分加载到内存中,并将控制权交给操作系统。

引导扇区程序可以使用汇编语言来编写,以便直接控制硬件。

在编写完成所有必要的代码后,我们可以使用相关的编译器将C代码编译成可执行文件。

STC_EEPROM延长使用寿命的大数据记录C程序详解

STC_EEPROM延长使用寿命的大数据记录C程序详解

STC_EEPROM延长使用寿命的大数据记录C程序在我们华清士科技公司的产品研发中,使用很多远程传感器的记录方案,在单片机编程的时候,觉得以下程序切实提高了STC单片机的EEPROM使用灵活性和寿命。

特此分享出来,期待可以抛砖引玉。

原理是这样的:STC-eeprom一个字节的写入,只能将1的状态写成0。

这样一个字节就可以被写8次,记录8个状态(分别是0xFE 0XFB 0XF8 0XE0 0XB0 0X80 0X00)。

当然其实还有一个状态是0XFF ,这是扇区被整个擦写后的状态。

我们就每记录一个数据,就在检索区加写1/8个字节,作为记录次数标识。

这样一组数据(示例之中为6个字节)所占用的空间实际上是6+1/8字节。

以此我们可以根据STC单片机型号的不同,将策划好的扇区数填入程序函数里面,每一次加电重启,都有一个程序来读取检索区的记忆次数,顺便,记录区的地址,都会有了。

(EEPROM_start0-EEPROM_start1 作为次数记录区,总共记录EEPROM_mu_MAX组数据。

)(x_ready_ok,x_ready_out,x_eeprom_need为该示例eeprom的标志)这个程序我们已经上机演示调试成功。

类似的应用也在华清士公司的几种除湿模块产品上得到广泛使用。

效果良好。

写此文是希望为我们钟爱的STC单片机开发做一些支持。

希望也得到广大工程师的交流沟通,共同提高。

下面是该C语言的程序。

应该在STC公司的IAP型号上面都可以调试成功。

当然在别的型号上面,比如STC12F04XE等上面,程序之中的起始扇区当然是1了,因为eeprom记录地址是从0x00(第一个扇区)开始的。

20170504_STC_EEPROM连续存储示例.c//------------------------------------------------------------------// 程序开始宏定义硬件接口定义//------------------------------------------------- ----------------#include "STC15F2K60S2.h"#include "intrins.h"//#include "absacc.h"//#include "math.h"#define _Nop() _nop_()//STC15W413AS -TSSOP20 单片机封装//该程序为演示程序20170508 ——演示EEPROM 13k 空间的自动分配以及多次记录数据检索//原始目的:利用STC-eeprom读写规则,尽量减少擦写次数,以延长EEPROM使用寿命。

c语言基础教程-第十章------文件和读写函数

c语言基础教程-第十章------文件和读写函数

C语言基础教程文件和文件指针1.文件一般说来,文件是有序数据的集合。

程序文件是程序代码的有序集合,数据文件是一组数据的有序集合。

文件是被存放在外部存储设备中的信息。

对文件的处理过程就是面向文件的输入和输出过程。

文件的输入过程是从文件中读出信息,文件的输出过程是往文件中写入信息,文件的输入的过程使用读函数,实现文件输出的过程使用写函数。

文件的读写函数是实现文件操作的主要函数,本章将用大量篇幅来讲述文件的读写函数。

C语言文件被称为流式文件,其特点是不分记录或块,将文件看成是信息"流"或看成是一个字符流(文本文件),或看成是一个二进制流(二进制文件).文件的存取是以字符(字节)为单位的,读写数据流的开始和结束受程序控制。

任何一个文件都是以EOF结束,最简单的文件是只有结束符的空文件。

C语言文件包含有设备文件和磁盘文件,例如,键盘是一种输入信息的文件,显示器屏幕和打印机是输出信息的文件它们都属于设备文件。

将内存的信息放到磁盘上保存,需要时再从磁盘上装入内存,这就要使用磁盘文件,磁盘文件是计算机中常用的文件nC语言文件按存放设备分设备文件和磁盘文件;按数据的组织形式分为文本文件(ASCII码文件)和二进制文件。

文本文件是按一个字节存放一个字符的ASCII码来存放的;二进制文件是按数据在内存中的存储形式放到磁盘上的。

例如,有一个整数10000,在内存中按二进制形式存放,占2个字节,将它放在磁盘上如按文本文件形式存放,占5个字节,每个数位占一个字节。

两种存放方式各有利弊。

以文本文件形式输出便于对字符进行处理,也便于输出字符,但是占用存储空间较多,并且要花费转换时间。

以二进制文件形式输出可节省存储空间和转换时间,但是不能直接输出字符形式。

2.文件指针文件指针是一种用来指向某个文件的指针。

如果说某个文件指针指向某个文件,则是该文件指针指向某个文件存放在内存中的缓冲区的首地址。

每一个被使用的文件都要在内存中开辟一个区域,用来存放的有关信息,包括文件名字、文件状态和文件当前位置等。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

读写硬盘扇区的C语言程序读写硬盘的MBR和DBR扇区的程序。

/******************************************* * Master Boot Record Programme: ** Backup the Master Boot Sector ** Fix the Master Boot Sector ** Change the Partition Table ** -- by Crystal.Mouse 04/30/99 -- ** Turboc 2.0 ********************************************/ #include <ctype.h>#include <stdlib.h>#include <stdio.h>#include <bios.h>#include <io.h>#include <dos.h>#include <fcntl.h>#include <sys\stat.h>#include <conio.h>/* define the */char buff[512]; /*buffer for master boot sector *//* buffer1 backup for master boot sector */char buff1[512];/* This is the dos boot programme data */char sector2[512]={0xEB,0x3C,0x90,0x4D,0x53,0x57,0x49,0x4E,0x34,0x2E,0x31,0x00, 0x02,0x20,0x01,0x00,0x02,0x00,0x02,0x00,0x00,0xF8,0xC9,0x00,0x3F,0x00,0x40,0x00,0x3F,0x00,0x00,0x00,0x01,0x0A,0x19,0x00,0x80,0x00,0x29,0xDC,0x12,0x6F,0x04,0x30,0x34,0x32,0x36,0x39,0x39,0x20,0x20,0x20,0x20,0x20,0x46,0x41,0x54,0x31,0x36,0x20,0x20,0x20,0xFA,0x33,0xC9,0x8E,0xD1,0xBC,0xFC,0x7B,0x16,0x07,0xBD,0x78,0x00,0xC5,0x76,0x00,0x1E,0x56,0x16,0x55,0xBF,0x22,0x05,0x89,0x7E,0x00,0x89,0x4E,0x02,0xB1,0x0B,0xFC,0xF3,0xA4,0x06,0x1F,0xBD,0x00,0x7C,0xC6,0x45,0xFE,0x0F,0x8B,0x46,0x18,0x88,0x45,0xF9,0x38,0x4E,0x24,0x7D,0x22,0x8B,0xC1,0x99,0xE8,0x77,0x01,0x72,0x1A,0x83,0xEB,0x3A,0x66,0xA1,0x1C,0x7C,0x66,0x3B,0x07,0x8A,0x57,0xFC,0x75,0x06,0x80,0xCA,0x02,0x88,0x56,0x02,0x80,0xC3,0x10,0x73,0xED,0x33,0xC9,0x8A,0x46,0x10,0x98,0xF7,0x66,0x16,0x03,0x46,0x1C,0x13,0x56,0x1E,0x03,0x46,0x0E,0x13,0xD1,0x8B,0x76,0x11,0x60,0x89,0x46,0xFC,0x89,0x56,0xFE, 0xB8,0x20,0x00,0xF7,0xE6,0x8B,0x5E,0x0B,0x03,0xC3,0x48,0xF7, 0xF3,0x01,0x46,0xFC,0x11,0x4E,0xFE,0x61,0xBF,0x00,0x07,0xE8, 0x23,0x01,0x72,0x39,0x38,0x2D,0x74,0x17,0x60,0xB1,0x0B,0xBE, 0xD8,0x7D,0xF3,0xA6,0x61,0x74,0x39,0x4E,0x74,0x09,0x83,0xC7, 0x20,0x3B,0xFB,0x72,0xE7,0xEB,0xDD,0xBE,0x7F,0x7D,0xAC,0x98, 0x03,0xF0,0xAC,0x84,0xC0,0x74,0x17,0x3C,0xFF,0x74,0x09,0xB4, 0x0E,0xBB,0x07,0x00,0xCD,0x10,0xEB,0xEE,0xBE,0x82,0x7D,0xEB, 0xE5,0xBE,0x80,0x7D,0xEB,0xE0,0x98,0xCD,0x16,0x5E,0x1F,0x66, 0x8F,0x04,0xCD,0x19,0xBE,0x81,0x7D,0x8B,0x7D,0x1A,0x8D,0x45, 0xFE,0x8A,0x4E,0x0D,0xF7,0xE1,0x03,0x46,0xFC,0x13,0x56,0xFE, 0xB1,0x04,0xE8,0xC1,0x00,0x72,0xD6,0xEA,0x00,0x02,0x70,0x00, 0xB4,0x42,0xEB,0x2D,0x60,0x66,0x6A,0x00,0x52,0x50,0x06,0x53, 0x6A,0x01,0x6A,0x10,0x8B,0xF4,0x74,0xEC,0x91,0x92,0x33,0xD2, 0xF7,0x76,0x18,0x91,0xF7,0x76,0x18,0x42,0x87,0xCA,0xF7,0x76, 0x1A,0x8A,0xF2,0x8A,0xE8,0xC0,0xCC,0x02,0x0A,0xCC,0xB8,0x01, 0x02,0x8A,0x56,0x24,0xCD,0x13,0x8D,0x64,0x10,0x61,0x72,0x0A, 0x40,0x75,0x01,0x42,0x03,0x5E,0x0B,0x49,0x75,0x77,0xC3,0x03, 0x18,0x01,0x27,0x0D,0x0A,0x49,0x6E,0x76,0x61,0x6C,0x69,0x64,0x20,0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x64,0x69,0x73,0x6B,0xFF,0x0D,0x0A,0x44,0x69,0x73,0x6B,0x20,0x49,0x2F,0x4F,0x20,0x65,0x72,0x72,0x6F,0x72,0xFF,0x0D,0x0A,0x52,0x65,0x70,0x6C,0x61,0x63,0x65,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73,0x6B,0x2C,0x20,0x61,0x6E,0x64,0x20,0x74,0x68,0x65,0x6E,0x20,0x70,0x72,0x65,0x73,0x73,0x20,0x61,0x6E,0x79,0x20,0x6B,0x65,0x79,0x0D,0x0A,0x00,0x00,0x49,0x4F,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x59,0x53,0x4D,0x53,0x44,0x4F,0x53,0x20,0x20,0x20,0x53,0x59,0x53,0x7F,0x01,0x00,0x41,0xBB,0x00,0x07,0x80,0x7E,0x02,0x0E,0xE9,0x40,0xFF,0x00,0x00,0x55,0xAA};/* sector1 is the Master boot program data */char sector1[512]={0xFA,0x33,0xC0,0x8E,0xD0,0xBC,0x00,0x7C,0x8B,0xF4,0x50,0x07, 0x50,0x1F,0xFB,0xFC,0xBF,0x00,0x06,0xB9,0x00,0x01,0xF2,0xA5,0xEA,0x1D,0x06,0x00,0x00,0xB8,0x01,0x02,0xBB,0x00,0x08,0xB9,0x01,0x00,0xBA,0x80,0x00,0xCD,0x13,0xBF,0x00,0x06,0xBE,0x00,0x08,0xB9,0x00,0x01,0xFC,0xF3,0xA7,0x74,0x14,0xBE,0x17,0x07,0xE8,0x2F,0x01,0xB8,0x01,0x03,0xBB,0x00,0x06,0xB9,0x01,0x00,0xBA,0x80,0x00,0xCD,0x13,0xBE,0xBE,0x07,0xB3,0x04,0x80,0x3C,0x80,0x74,0x0E,0x80,0x3C,0x00,0x75,0x1C,0x83,0xC6,0x10,0xFE,0xCB,0x75,0xEF,0xCD,0x18,0x8B,0x14,0x8B,0x4C,0x02,0x8B,0xEE, 0x83,0xC6,0x10,0xFE,0xCB,0x74,0x0D,0x80,0x3C,0x00,0x74,0xF4, 0xBE,0xAE,0x06,0xE8,0xF0,0x00,0xEB,0xFE,0xBF,0x05,0x00,0xBB, 0x00,0x7C,0xB8,0x01,0x02,0x57,0xCD,0x13,0x5F,0x73,0x0C,0x33, 0xC0,0xCD,0x13,0x4F,0x75,0xED,0xBE,0xD2,0x06,0xEB,0xE0,0xBE, 0xF7,0x06,0xBF,0xFE,0x7D,0x81,0x3D,0x55,0xAA,0x75,0xD4,0x8B, 0xF5,0xEA,0x00,0x7C,0x00,0x00,0x49,0x6E,0x76,0x61,0x6C,0x69, 0x64,0x20,0x70,0x61,0x72,0x74,0x69,0x74,0x69,0x6F,0x6E,0x20, 0x74,0x61,0x62,0x6C,0x65,0x2E,0x20,0x4F,0x68,0x2C,0x6D,0x79, 0x20,0x67,0x6F,0x64,0x21,0x00,0x45,0x72,0x72,0x6F,0x72,0x20, 0x6C,0x6F,0x61,0x64,0x69,0x6E,0x67,0x20,0x6F,0x70,0x65,0x72, 0x61,0x74,0x69,0x6E,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6D, 0x2E,0x20,0x57,0x68,0x79,0x3F,0x00,0x4D,0x69,0x73,0x73,0x69, 0x6E,0x67,0x20,0x6F,0x70,0x65,0x72,0x61,0x74,0x69,0x6E,0x67, 0x20,0x73,0x79,0x73,0x74,0x65,0x6D,0x2E,0x20,0x53,0x68,0x69, 0x74,0x21,0x00,0x4D,0x61,0x73,0x74,0x65,0x72,0x20,0x42,0x6F, 0x6F,0x74,0x20,0x53,0x65,0x63,0x74,0x6F,0x72,0x20,0x63,0x68, 0x61,0x6E,0x67,0x65,0x64,0x2E,0x0A,0x0D,0x44,0x6F,0x6E,0x27, 0x74,0x20,0x77,0x6F,0x72,0x72,0x79,0x2C,0x49,0x20,0x68,0x61,0x76,0x65,0x20,0x72,0x65,0x63,0x6F,0x76,0x65,0x72,0x65,0x64,0x20,0x69,0x74,0x21,0x20,0x43,0x6C,0x65,0x76,0x65,0x72,0x21,0x20,0x45,0x54,0x2D,0x4D,0x6F,0x75,0x73,0x65,0x20,0x59,0x65,0x61,0x68,0x21,0x0A,0x0D,0x00,0xAC,0x3C,0x00,0x74,0x0B,0x56,0xBB,0x07,0x00,0xB4,0x0E,0xCD,0x10,0x5E,0xEB,0xF0,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAA};char fnwrite[20],fnread[20]; /* filename */FILE *fp; /* file pointer */int head,cylinder,sector,drive; /* harddisk head,cylinder sector drive *//* define the key code */#define ESC 0x011b#define LEFT 0x4b00#define RIGHT 0x4d00#define UP 0x4800#define DOWN 0x5000#define HOME 0x4700#define END 0x4f00#define PGUP 0x4900#define PGDN 0x5100#define F2 0x3c00#define F1 0x3b00#define W 1#define R 0 /* flag for */#define D 0 /* flag for Dos Boot Sector */#define M 1 /* flag for Master Boot Sector */ /* declare the function */int fileopen(int f,char *file); /*Read or Creat the backupfile */int writembr(char *file); /* write the buffer to master boot sector */ int writedbr(char *file); /* write the buffer to dos boot sector */int backupmbr(char *file); /* backup the Master Boot record data */ int backupdbr(char *file); /* backup the dos boot sector data */ int printmbr(); /* print the master boot sector */int init(int f); /* init the operating */void help(); /*help*/void title(); /* display the infomation */int copypart(char *src,char *dest);void infina(char *file); /* open or creat the backup file */void closecur(); /* close the cursor */void opencur(); /* open the cursor */int display(); /* display the data */void interrupt(*reset)(); /* interrupt reset the machine */void resetwin(); /* reset the screen */void search(); /* search the dos boot sector */int detect(int num,int driver,int f); /* detect the drive */int detect(int num,int driver,int f)/* detect the disk */{union REGS r;r.h.ah=num;r.h.dl=driver;int86(0x13,&r,&r);if(f)return r.h.al;elsereturn r.x.cflag;}/* backup the dos boot sector */int backupdbr(char *file){int flag=1; /* flag for success or not */ if(!fileopen(W,file)){printf("\nBackup file write error!"); flag=0;}return flag;}/* rewrite the dos boot record */int writedbr(char *file){int flag; /* flag for success or not */char key;search(); /* search the the dos boot sector: head , cylinder and sector */ init(D); /* initialize the dos boot sector data to the buffer */printf("\nWarning...");printf("\nIt might destory your harddisk!");printf("\nDo you want to a backup?(y/n)");key=getch();switch(key){case 'y':case 'Y':infina(fnwrite); /* input the backup filename */if(!backupdbr(fnwrite))printf("\nBackup error!");flag=0;break;}case 'n':case 'N':if(!fileopen(R,file)) /* open the existed backup file data to buffer */ {printf("\nBackup file %s open error!",file);flag=0;return flag;}}/* rewrite the dos boot sector with the buffer data */if(biosdisk(0x03,0x80,head,cylinder,sector,1,buff1)){printf("\nWrite Master Boot Sector error!");flag=0;else{printf("\nWrite Dos Boot Sector OK!");flag=1;}}/* backup the Master Boot Sector data to file */int backupmbr(char *file){int flag=1;init(M); /* initialize the master boot sector to the buffer */ if(!fileopen(W,file)){printf("\nBackup file write error!");flag=0;}return flag;}int fileopen(int f,char *file)/* f for read or creat file */{int flag=1;if(f==0){if((fp=fopen(file,"rb"))!=NULL) {fread(buff1,512,1,fp);fclose(fp);}else flag=0;}if(f==1){if((fp=fopen(file,"wb"))!=NULL) {fwrite(buff,512,1,fp);fclose(fp);}else flag=0;}return flag;}int writembr(char *file){int flag=1;char key;printf("\nWarning...");printf("\nIt might destory your harddisk!"); printf("\nDo you want to a backup?(y/n)"); key=getch();switch(key){case 'y':case 'Y':infina(fnwrite);init(M); /* initialize the MBR to buffer */if(!backupmbr(fnwrite)) /* backup the MBR */{printf("\nBackup error!");flag=0;}printf("\nFile %s backup ok!",fnwrite);if(!biosdisk(0x03,0x80,0,0,3,1,buff))printf("\nThe old MBR write to head:0 , Cylinder:0 ,Sector:1 error!");if(!biosdisk(0x03,0x80,0,0,5,1,buff))printf("\nThe old MBR write to head:0 , Cylinder:0 ,Sector:1 error!");printf("\nThe old MBR also backup to the harddisk side 0 cylinder 0 sector 3 and 5."); flag=1;case 'n':case 'N':if(!fileopen(R,file)) /* open the existed backup file */{printf("\nBackup file %s open error!",file);flag=0;return flag;}}if(biosdisk(0x03,0x80,0,0,1,1,buff1)) /* Rewrite the MBR with buffer1 */ {printf("\nWrite Master Boot Sector error!");flag=0;}else{printf("\nWrite Master Boot Sector OK!");flag=1;}return flag;}int init(int f){int result=1;for(i=0;i<512;i++) /* initialize the buffer */buff[i]=0;if(f){if(biosdisk(0x02,0x80,0,0,1,1,buff)) /* read the Mbr to buffer */ {printf("\nMaster boot record read error!");result=0;}}else if(biosdisk(0x02,0x80,head,cylinder,sector,1,buff)){printf("\nDos Boot Sector read error!");result=0;}return result;}{int far *res=(int far *)0x472; /* the data for reset */int i,j,k;char key;reset=MK_FP(0xffff,0x0000); /* reset interrupt address */ clrscr();while(1){printf("\nSetMbr programme...('h' for help)");printf("\n.");key=getch();printf("%c",key);switch(key){case 'H':case 'h':help();break;/* rewrite the MBR sector */case 'w':case 'W':infina(fnread); /* input the existed file name */ if(!writembr(fnread)){printf("\nWrite HardDisk MBR error!");printf("\nPress 'v' to check it.");printf("\nPress 'm' to fix it.");}elseprintf("\nWrite HardDisk MBR OK!");break;/* backup the MBR sector */case 'b':case 'B':infina(fnwrite);if(!backupmbr(fnwrite))printf("\nBackup MBR error!");elseprintf("\nBackup MBR OK!");break;/* rewrite the dos boot sector */case 'd':case 'D':infina(fnread);if(!writedbr(fnread)){printf("\nWrite Dos Boot Sector error!");printf("\nPress 'v' to view the Dos Boot Sector!"); break;}break;/* backup the dos boot sector */case 'o':case 'O':infina(fnwrite);search();if(!backupdbr(fnwrite))printf("\nBackup Dos Boot Sector error!");elseprintf("\nBackup Dos Boot Sector OK!");break;/* rewrite the dos boot sector with default data */ case 'i':case 'I':search();init(D);printf("\nIt would modify the Dos Boot secotr!"); printf("\nDo you want to backup?(Y/N)");key=getch();if(key=='y' || key=='Y'){infina(fnwrite);if(!backupmbr(fnwrite))printf("\nBackup Error!");printf("\nBackup OK!");}elseif(key=='n' || key=='N')printf("\nWarning:it would modify the Dos Boot Sector!"); /* write the sector2 to the dos boot sector */if(biosdisk(0x03,0x80,head,cylinder,sector,1,sector2)!=0) printf("\nDos Boot Sector Write error!");elseprintf("\nDos Boot Sector Write OK!");break;/* reset the machine */case 'r':case 'R':*res=0x1234;(*reset)();/* view the harddisk sector data */case 'v':search();printmbr();break;/* fixed the flappy boot sector */case 'f':case 'F':printf("\nWhich dekette? -> (A,B,...):"); key=getch();printf("%1c:",key);if(key>=97)key=key-97;elsekey=key-65;/* if(detect(0x10,key,0)){printf("\nDriver %1c: not ready!",key+65);break;}if(detect(0x13,key,1)==0x03){printf("\nDriver %1c: write protect!",key+65);break;}else */if(biosdisk(0x03,key,0,0,1,1,sector2))printf("\nDriver %c: write error!",key+65);elseprintf("\nDrive %1c: write OK!",key+65); break;/* fixed the MBR with default data */case 'm':case 'M':printf("\nIt would modify the Master Boot Record.");printf("\nDo you want to backup?(Y/N)");key=getch();printf("%1c",key);if(key=='y' || key=='Y'){infina(fnwrite);if(!backupmbr(fnwrite)){printf("\nBackup Error!");break;}}elseif(key=='n' || key=='N')printf("\nWarning:it would modify the Master Boot Sector!");init(M);if((buff[0x1be]&0x00ff)==0x80 || (buff[0x1be+16]&0x00ff)==0x80|| (buff[0x1be+32]&0x00ff)==0x80 || (buff[0x1be+48]&0x00ff)==0x80) copypart(buff+0x1be,sector1+0x1be);if(biosdisk(0x03,0x80,0,0,1,1,sector1)){printf("\nHardDisk Write error!");break;}else{printf("\nHardDisk Write OK!"); printf("\nPress 'v' to check it."); }break;/* dos shell */case 's':case 'S':printf("\nPress 'Exit' to return...."); system("");break;/* exit */case 'q':case 'Q':title();return 1;/* print the undefine command */default:printf("%cBad command!",27);}}}/* display the information */void title(){printf("\nThank you for using the programme...");printf("\nProgrammer:Crystal.Mouse");printf("\nDate:05/01/1999");}/* change the destination partition table data with the source data */ int copypart(char *src,char *dest){char len=0x40;while(len>=0){*(dest+len)=*(src+len);len--;}}/* input the filename */void infina(char *file){printf("\nPlease input the file name:"); scanf("%s",file);}void search(){int i,addr;init(M);for(i=0x1be;i<0x1fe;i++)if((buff[i]&0x00ff)==0x80){addr=i;break;}head=buff[addr+1];sector=(buff[addr+2]<<2)>>2;cylinder=(buff[addr+2]>>6)*256+buff[addr+3]; }/* close the cursor */void closecur(){union REGS r;r.h.ah=1;r.h.ch=0x20;int86(0x10,&r,&r);}/* open the cursor */void opencur(){union REGS r;r.h.ah=1;r.h.ch=12;r.h.cl=13;int86(0x10,&r,&r);}void help(){printf("\n\tMaster Boot sector backup programme...");printf("\n\tH: help.");printf("\n\tW: ReWrite the Master Boot Record from a file."); printf("\n\tB: Backup the Master Boot Record to a file.");printf("\n\tO: Save the Dos Boot Sector to a file.");printf("\n\tD: Rewrite the Dos Boot Sector from a file.");printf("\n\tI: Rewrite the Dos Boot Sector with a default."); printf("\n\tV: View the Master Boot Record.");printf("\n\tF: Fixed the floppy Boot Sector.");printf("\n\tM: The same with Command:'Fdisk /mbr'.");printf("\n\tS: Dos shell.");printf("\n\tQ: Exit the programme.");printf("\n Press any key to continue...");getch();sound(2000);delay(2000);nosound(); }/* print the mbr */int printmbr(){int count=1;int key;int f=0;closecur();init(M);display(count,&f);while(bioskey(1)==0); key=bioskey(0);while(1){switch(key){case ESC:return 1;case HOME: count=1;f=0;break;case END: count=63; f=0;break;case PGUP: case UP:case LEFT: if(count<=1) count=63; elsecount--;f=0;break;case DOWN: case RIGHT: if(count>=63) count=1;elsecount++;f=0;break;case F2:if(f==0){f=1;break;}if(f==1){f=0;break;}case F1:resetwin();printf("\nIt would save the sector to a file...");if(f){ if(biosdisk(0x02,0x80,head,cylinder,sector,1,buff)!=0) {printf("\nharddisk Dos Boot Sector read error!");break;}}elseif(biosdisk(0x02,0x80,0,0,count,1,buff)){printf("\nHardDisk MBR read error!");break;}infina(fnwrite);if(!fileopen(W,fnwrite))printf("\nFile %s Write error!",fnwrite); else{printf("\nFile %s save OK.",fnwrite); printf("\nPress any key to return..."); getch();}break;default:break;}display(count,f);while(bioskey(1)==0);key=bioskey(0);}}/* reset the screen */void resetwin(){window(1,1,80,25);textcolor(WHITE);textbackground(BLACK);clrscr();}/* put the buffer data to the screen */int display(int count,int f){int lines,i;resetwin();closecur();i=count;if(f){if(biosdisk(0x02,0x80,head,cylinder,sector,1,buff)) {printf("\nHarddisk read error!");resetwin();}}elseif(biosdisk(0x02,0x80,0,0,count,1,buff)){printf("\nHarddisk read error!");resetwin();return 0;}window(1,25,80,25);textbackground(CYAN);textcolor(WHITE);clrscr();cprintf(" HELP:ESC PGUP PGDN HOME END %c %c %c %c %c ",24,26,25,27,179); textcolor(RED);cprintf("F1");textcolor(WHITE);cprintf(":Save this sector to a file.");cprintf(" 05/01/99");window(1,1,80,1);textbackground(LIGHTGRAY);textcolor(LIGHTGREEN);clrscr();cprintf(" HardDisk C:1 %c 63 Sector",196);if(f)cprintf(" ( DOS BOOT SECTOR ) By: Howard.Crystal "); elsecprintf(" (Hard Disk Partition Table) By: Howard.Crystal "); window(1,2,80,24);textbackground(BLUE);textcolor(WHITE);clrscr();gotoxy(1,1);if(!f){cprintf(" Head:%-d Cylinder:%-d Sector:%-d",0,0,i);cprintf(" F2: View Dos Boot Sector\n");}else{cprintf(" Head:%-d Cylinder:%-d Sector:%-d",head,cylinder,sector); cprintf(" F2: View Master Boot Sector\n");}lines=1;gotoxy(1,1);for(i=0;i<512;i++){if(i%24==0){lines++;gotoxy(1,lines);}if(i%4==0)cprintf(" ");if(f)if(buff[510]==0x55 && (buff[511]&0x00ff)==0xaa)if(i>=510){textattr(RED+(BLUE<<4)+BLINK); /* flash the special data */sound(1000);delay(1000);nosound();cprintf("%02x",buff[i]&0x00ff);textcolor(WHITE);}elsecprintf("%02x",buff[i]&0x00ff);elsecprintf("%02x",buff[i]&0x00ff);elseif(buff[510]==0x55 && (buff[511]&0x00ff)==0xaa)if(i>=0x1be && (((i-0x1be)%16==0 && (buff[i]&0x00ff)==0x80) || (buff[i]&0x00ff)==0x55 || (buff[i]&0x00ff)==0xaa)){textattr(RED+(BLUE<<4)+BLINK);cprintf("%02x",buff[i]&0x00ff);delay(1000);nosound();textcolor(WHITE);}elsecprintf("%02x",buff[i]&0x00ff);elsecprintf("%02x",buff[i]&0x00ff); }lines=1;for(i=0;i<512;i++){if(i%24==0)lines++;gotoxy(57+i%24,lines);if(isprint(buff[i]))cprintf("%1c",buff[i]);else}return 1; }。

相关文档
最新文档