用C言语树立多个PRI DOS分区及其隐含-C / C++-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:170回复:0

  用C言语树立多个PRI DOS分区及其隐含

楼主#
更多 发布于:2016-05-20 18:44

一、导言

在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(S:树立PRI DOS分区;S:对PRI

DOS分区表项进行备份;R:收复PRI DOS分区表项;1:只保存PRI DOS分区表项的第

一项,其他均隐含;2:只保存PRI DOS分区表项的第二项;3: 只保存PRI

DOS分区表项的第三项;4:只保存PRI DOS分区表项的最终一项)。

以下为PDOS.CPP程序清单:

#include

#include

#include

#include

#include

#include

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;

PartitionTable PT1;

PartitionTable PT2; /* 主DOS分区表项 */

char f;

}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); /* 将参数中的大写字母转换成小写字母 */

while((*(argv++))==0); /* 搜索榜首个非空格字符 */

n=*(--argv);

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,0x80,0,0,1,1,&dosboot);

for (i=0;i<4;i++)

{if

((dosboot.PT2.TYpe!=0)&&(dosboot.PT2.TYpe!=5))

{dosboot.PT2.Flag=0x00;};

if (dosboot.PT2.TYpe==5)

{dosboot.PT2.TYpe=6;

dosboot.PT2.Flag=0x80;};

};

biosdisk(3,0x80,0,0,1,1,&dosboot);

return;

};

void set_hidde_dos()

{

int i;

biosdisk(2,0x80,0,0,1,1,&dosboot);

for(i=0;i<4;i++)

{if

((dosboot.PT2.TYpe!=0)&&(dosboot.PT2.TYpe!=5))

{dosboot.PT1=dosboot.PT2;};

};

biosdisk(3,0x80,0,0,1,1,&dosboot);

return;

};

void recall_dos()

{

int i;

biosdisk(2,0x80,0,0,1,1,&dosboot);

for (i=0;i<4;i++)

{if (dosboot.PT1.TYpe!='0')

{

dosboot.PT2=dosboot.PT1;

dosboot.PT1=dosboot.PT[0];

};

};

biosdisk(3,0x80,0,0,1,1,&dosboot);

return;

};

void change_dos(char n)

{

int i,m;

m=n-49;

biosdisk(2,0x80,0,0,1,1,&dosboot);

if (dosboot.PT1[m].TYpe!=0)

{ for (i=0;i<4;i++)

{if (dosboot.PT1.TYpe!=0)

{dosboot.PT2=dosboot.PT[0];};

};

dosboot.PT2[m]=dosboot.PT1[m];

dosboot.PT2[m].Flag=0x80;

};

biosdisk(3,0x80,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分区中。 另个读者在应

用本程序时一定要准确无误地输入源程序,以防损坏硬盘上的数据。

优质IT资源分享社区[font=Tahoma  ]为你提供此文。[font=Tahoma  ]

[font=Tahoma  ]本站有大量优质C、C++教程视频,资料等资源,包含C,C++基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。[font=Tahoma  ]

C、C++教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客