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 + -
显示快捷键?