pdos.c
来自「这是一些c++例程」· C语言 代码 · 共 145 行
C
145 行
/* 包含必需的文件 */
#include <dos.h>
#include <bios.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
/* 定义需要的数据结构 */
typedef struct
{
char hd;
char sc;
char cy;
}HSC;
typedef struct /* 分区表结构 */
{
char Flag; /* 激活标志 */
HSC begin; /* 开始位置 */
char TYpe; /* 分区类型 */
HSC end; /* 结束位置 */
long id; /* 开始扇区的相对序号 */
long size; /* 分区大小 */
}PartitionTable;
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分区,其余均隐含 */
/* 主函数 */
void main(int argc,char *argv[])
{
char n;
if(argc!=2)
{
printf("Bad command !");
return;
};
strlwr(argv[1]); /* 将参数中的大写字母转换成小写字母 */
while(!(*(argv[1]++))); /* 搜寻第一个非空格字符 */
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;
};
return;
}
/* 函数功能:建立(将扩展分区修改成)主DOS分区 */
void create_pri_dos()
{
int i;
biosdisk(2,0x80,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,0x80,0,0,1,1,&dosboot);
};
/* 函数功能:对主DOS分区表项进行备份 */
void set_hidde_dos()
{
int i;
biosdisk(2,0x80,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,0x80,0,0,1,1,&dosboot);
};
/* 函数功能:恢复主DOS分区表项 */
void recall_dos()
{
int i;
biosdisk(2,0x80,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,0x80,0,0,1,1,&dosboot);
};
/* 函数功能:只保留一个主DOS分区,其余均隐含 */
void change_dos(char n)
{
int i,m;
m=n-49; /* 将n从char类型转成数字 */
biosdisk(2,0x80,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,0x80,0,0,1,1,&dosboot);
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?