当前位置:天才代写 > tutorial > C语言/C++ 教程 > 用C语言成立多个PRI DOS分区

用C语言成立多个PRI DOS分区

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:330

一、引言

在DOS系统下,在计较机应用培训中因培训要求差异, 对软件的要求也差异,由于学员的误操纵,存放在硬盘上的软件和重要数据容易被犯科删除或受到损坏。对此,笔者通过对硬盘打点的深入阐明和实践,总结出了在硬盘上备份、掩护重要数据和软件的一种新的行之有效的要领:成立多个PRI DOS 分区, 差异的培训要求利用差异的PRI DOS分区,在利用时同时只有一个PRI DOS 分区可供利用, 其余PRI DOS分区均被隐含。

二、分区表布局

众所周知,DOS操纵系统下,一个硬盘可以分为PRI DOS分区和扩展分区两大部门,而扩展分区中又可进一步成立多个逻辑分区。这些PRI DOS分区和逻辑分区都可象单独的物理硬盘一样利用。那么DOS是奈何实现对这些分区的打点和利用的呢?DOS 打点硬盘的奥秘是两个表:硬盘分区表链。系统在启动进程中,DOS 按照硬盘分区表链及分区表提供的分区信息成立了各个分区的磁盘参数表(BPB表),而磁盘参数表是DOS会见硬盘的基本。 因此分区表链及分区表在硬盘存取中具有很是重要的职位。

分区表链存于硬盘上,一般由一个主引导结点和多个普通结点组成。主引导结点同PRI DOS分区对应,为硬盘的0柱面0头1扇区,是硬盘主引导记录扇区。在头结点扇区中,从开始到0DAH的218 字节是一段主引导措施;从0DBH到1BDH共228字节为00H;从1BEH到1FDH处64字节是硬盘的主分区表,共四个表项,每个表项16字节,个中前两个表项别离指示主分区和扩展分区在硬盘中的信息,后两个表项一般不消,全为00H;;扇区最后两个字节是竣事符号55H、AAH。

表项的数据布局如下:
相对偏移 长度(BYTE) 寄义
0 1 激活符号
1 3 分区起始位置(柱、头、扇)
4 1 分区范例
5 3 分区终止位置(柱、头、扇)
8 4 分区起始扇区的相对序号
12 4 分区巨细
表项布局中的激活符号在激活时为80H(不然为00H),所谓起始位置,对付天职区表项而言,是该分区的起始柱1头1扇区;对付扩展表项而言指的是相应的扩展分区的起始柱0头1扇区。分区范例常见值有1、4、6、5等。1暗示12位FAT的分区,4暗示16位FAT的分区,6 暗示容量大于32M的分区,5暗示扩展分区。分区巨细便是各相应分区从起始扇区到终止扇区的扇区数,对付天职区表项,此值不含隐含扇区,对付扩展表项此值包括隐含扇区,而对PRI DOS 分区里的扩展表项,此值便是各逻辑分区所有扇区包罗隐含扇区之和。所谓起始扇区的相对应序号,其相对起点分三种环境:对付天职区表项,序号是相对付该分区的起始柱0头1扇区;对付扩展表项,若是PRI DOS的扩展分区,则相对付PRI DOS分区的主引导记录扇区;若是逻辑分区的扩展, 则一律相对付整个扩展分区的起点,此起点一般就是第一逻辑分区的起始柱0头1扇区。

三、成立多个PRI DOS分区

从上面的阐明中我们清楚了分区表由四个表项构成(尽量一般最多只利用两项),而且主分区表的第一表项指向PRI DOS分区,第二个表项指向扩展分区。假如凭据正常的利用要领,完全没有须要配置四个表项,既然如此配置,必有其利用的目标。由于主分区表中的扩展表项中的某些项包括了所有扩展分区的有关信息,为此我先用 FDISK成立只有一个逻辑分区的扩展分区。然后将该扩展分区表项的分区范例由5改为6,再将其激活符号由00H改为80H(留意必需同时将原先的PRI DOS分区的激活符号由80H改为00H)。 然后必需从头用软盘启动呆板并名目化C盘,则就可用新成立的PRI DOS分区启动呆板( 原先的PRI DOS分区的盘符变为D)。这样就成立了两个PRI DOS分区。

四、隐含分区的配置和规复

我们已经知道硬盘主引导记录扇区中从0DBH到1BDH共228 个字节为00H,在成立了多个PRI DOS分区之后,就可操作这228 个字节的最后64个字节来生存四个表项有内容。选定一个PRI DOS分区, 然后将四个表项中的其它所有分区范例为非扩展分区的表项的内容全部改为00H。这样在硬盘上就只有一个PRI DOS分区,其它被隐含起来。

如要将隐含分区规复正常,只需将其生存在主硬盘主引导扇区中的内容从头写入到该表项即可。

五、源措施

下面给出源措施:PDOS.CPP。该源措施在编译情况TURBOC++ 3.0下在兼容机上编译。利用要领为在DOS提示符下键入:[D:] [ PATH]
PDOS <C/S/R/1/2/3/4>(S:成立PRI DOS分区;S:对PRI DOS分区表项举办备份;R:收复PRI DOS分区表项;1:只保存PRI DOS分区表项的第一项,其余均隐含;2:只保存PRI DOS分区表项的第二项;3: 只保存PRI DOS分区表项的第三项;4:只保存PRI DOS分区表项的最后一项)。

以下为PDOS.CPP措施清单:

#p#分页标题#e#

#include<dos.h>
#include<bios.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
struct HSC
{char hd,sc,cy;};
struct PartitionTable
{char Flag; /* 激活符号 */
HSC begin; /* 开始位置 */
char TYpe; /* 分区范例 */
HSC end; /* 竣事位置 */
long id; /* 开始扇区的相对序号 */
long size; /* 分区巨细 */
};
struct note /* 结点布局 */
{char boot1[366];
PartitionTable PT[1];
PartitionTable PT1[4];
PartitionTable PT2[4]; /* 主DOS分区表项 */
char f[2];
}dosboot;
void create_pri_dos(); /* 成立(将扩展分区修改成)主DOS分区 */
void set_hidde_dos(); /* 对主DOS分区表项举办备份 */
void recall_dos(); /* 规复主DOS分区表项 */
void change_dos(char n); /* 只保存一个主DOS分区,其余均隐含 */
main(int argc,char *argv[])
{
char n;
if (argc!=2)
{ printf("Bad connamd !");
return 0;
};
strlwr(argv[1]); /* 将参数中的大写字母转换成小写字母 */
while((*(argv[1]++))==0); /* 搜寻第一个非空格字符 */
n=*(–argv[1]);
switch(n){
case ‘c’:
create_pri_dos();
break;
case ‘s’:
set_hidde_dos();
break;
case ‘r’:
recall_dos();
break;
case ‘1’: /* 只保存主DOS分区表项中的第一项,其余主DOS分区表项均隐含 */
change_dos(n);
break;
case ‘2’: /* 只保存主DOS分区表项中的第二项 */
change_dos(n);
break;
case ‘3’: /* 只保存主DOS分区表项上的第三项 */
change_dos(n);
break;
case ‘4’: /* 只保存主DOS分区表项上的第四项 */
change_dos(n);
break;
default:
return 0;
};
return 0;
}
void create_pri_dos()
{int i;
biosdisk(2,0×80,0,0,1,1,&dosboot);
for (i=0;i<4;i++)
{if ((dosboot.PT2[i].TYpe!=0)&&(dosboot.PT2[i].TYpe!=5))
{dosboot.PT2[i].Flag=0x00;};
if (dosboot.PT2[i].TYpe==5)
{dosboot.PT2[i].TYpe=6;
dosboot.PT2[i].Flag=0x80;};
};
biosdisk(3,0×80,0,0,1,1,&dosboot);
return;
};

void set_hidde_dos()
{
int i;
biosdisk(2,0×80,0,0,1,1,&dosboot);
for(i=0;i<4;i++)
{if ((dosboot.PT2[i].TYpe!=0)&&(dosboot.PT2[i].TYpe!=5))
{dosboot.PT1[i]=dosboot.PT2[i];};
};
biosdisk(3,0×80,0,0,1,1,&dosboot);
return;
};
void recall_dos()
{
int i;
biosdisk(2,0×80,0,0,1,1,&dosboot);
for (i=0;i<4;i++)
{if (dosboot.PT1[i].TYpe!=’0′)
{
dosboot.PT2[i]=dosboot.PT1[i];
dosboot.PT1[i]=dosboot.PT[0];
};
};
biosdisk(3,0×80,0,0,1,1,&dosboot);
return;
};

void change_dos(char n)
{
int i,m;
m=n-49;
biosdisk(2,0×80,0,0,1,1,&dosboot);
if (dosboot.PT1[m].TYpe!=0)
{ for (i=0;i<4;i++)
{if (dosboot.PT1[i].TYpe!=0)
{dosboot.PT2[i]=dosboot.PT[0];};
};
dosboot.PT2[m]=dosboot.PT1[m];
dosboot.PT2[m].Flag=0x80;
};
biosdisk(3,0×80,0,0,1,1,&dosboot);
return;
};

六、举例及留意事项

在1.2G的硬盘上成立三个PRI DOS分区,巨细别离为300Mb, 400M和500MB的例子:

首先用FDISK成立一个300MB的PRI DOS分区和400MB的扩展分区,并激活PRI DOS分区,用软盘启动计较机并名目化C盘,执行PDOS S呼吁,使扩展分区酿成PRI DOS分区,再用软盘启动计较机并名目化C盘,原先的PRI DOS分区的盘符变为D。然后用FDISK成立500MB的扩展分区,在执行PDOS S呼吁后,再用软盘启动计较机并名目化C盘, 这样就成立了三个PRI DOS分区。其盘符和容量的对应干系为C:500MB; D :300MB;E:400MB。

由于在PRI DOS 分区表项之间切换时只保存一个表项可供利用,因此必需将PDOS.EXE措施拷贝到所有PRI DOS分区中。另个读者在应用本措施时必然要精确无误地输入源措施,以防粉碎硬盘上的数据。

 

    关键字:

天才代写-代写联系方式