⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch5.prg

📁 C 常用算法程序集 徐士良 编 清华大学出版社 1994.1
💻 PRG
📖 第 1 页 / 共 2 页
字号:
	} req_type;
};

struct BPB_struct
{
	unsigned int    bytes_per_sector;
	unsigned char   sector_allocation_unit;
	unsigned int    reserved_sector;
	unsigned char   num_FATs;
	unsigned int    root_entries;
	unsigned int    num_sectors;        
	unsigned char   media_descriptor;
	unsigned int    spfat;
	unsigned int    sectors_per_FAT;
	unsigned int    heads;
	unsigned long   hidden_sectors;
	unsigned long   num_sectors_32;
};


    2、设备驱动程序

/*****************************************************************
          程序名:mydm.c
          功能:  完整的块设备驱动框架程序
          说明:  本程序只提供一个框架程序,面向硬件的细节和把命令
                 转换为面向硬件的请求这两项工作未做。
          程序员:吕强
          时间:  1993,8,23. 第2.00版
*****************************************************************/

#include	<dos.h>
#include	<string.h>
#include	"dos_ddh.h"

void far Strategy(void);
void far Interrupt(void);

struct  DDH_struct      dos_header =
{
	(struct DDH_struct far *) 0xffffffffL,
	0x2000,
	(unsigned int) Strategy,
	(unsigned int) Interrupt,
	{
		0x01,
		0,
		0,
		0,
		0,
		0,
		0,
		0,
	}
};

struct  BPB_struct      bpb =
{
	512,
	1,
	1,
	2,
	64,
	360,
	0xf0,
	2,
	1,
	1,
	1L,
	0L
};

struct  BPB_struct      *bpb_ary[DEVICES] = { 0 };

/*      Globle data area        */
unsigned return_code=0;
unsigned SS_reg=0;
unsigned SP_reg=0;
unsigned BP_reg=0;
unsigned ES_reg=0;
unsigned DS_reg=0;
unsigned SI_reg=0;
unsigned DI_reg=0;
unsigned BX_reg=0;
unsigned CX_reg=0;
unsigned DX_reg=0;

unsigned local_stack[STACK_LENGTH] = {
0,
};

struct REQ_struct far *req_header_pointer=0;


unsigned	Init_cmd();
unsigned	Media_check_cmd();
unsigned	Build_bpb_cmd();
unsigned	Ioctl_input_cmd();
unsigned	Input_cmd();
unsigned	Input_no_wait_cmd();
unsigned	Input_status_cmd();
unsigned	Input_flush_cmd();
unsigned	Output_cmd();
unsigned	Output_verify_cmd();
unsigned	Output_status_cmd();
unsigned	Output_flush_cmd();
unsigned	Ioctl_output_cmd();
unsigned	Dev_open_cmd();
unsigned	Dev_close_cmd();
unsigned	Remove_media_cmd();
unsigned	Ioctl_cmd();
unsigned	Get_logical_device_map_cmd();
unsigned	Set_logical_device_map_cmd();
unsigned	Unknown_cmd();

unsigned (*dos_cmd[DOS_CMDS]) (struct REQ_struct far *r_p) =
{
	Init_cmd,
	Media_check_cmd,
	Build_bpb_cmd,
	Ioctl_input_cmd,
	Input_cmd,
	Input_no_wait_cmd,
	Input_status_cmd,
	Input_flush_cmd,
	Output_cmd,
	Output_verify_cmd,
	Output_status_cmd,
	Output_flush_cmd,
	Ioctl_output_cmd,
	Dev_open_cmd,
	Dev_close_cmd,
	Remove_media_cmd,
	Unknown_cmd,
	Unknown_cmd,
	Unknown_cmd,
	Ioctl_cmd,
	Unknown_cmd,
	Unknown_cmd,
	Unknown_cmd,
	Get_logical_device_map_cmd,
	Set_logical_device_map_cmd,
};

void far Strategy(void)
{

     /* 保存入口处的寄存器 */
	asm pusha
        asm push ds
        asm push es

     /* 设置数据段 */
	_AX = _CS;
	_DS = _AX;

     /* 保存请求头指针 */
	req_header_pointer = MK_FP(_ES,_BX);

     /* 恢复入口处的寄存器 */
        asm pop es
        asm pop ds
	asm popa

}

void far Interrupt(void)
{

     /* 保护为设置自己数据段而破坏的寄存器 */
	asm push	ax;
	asm push	ds;

     /* 设置数据段 */
	_AX = _CS;
	_DS = _AX;
     /* 保存入口的寄存器 */
	BX_reg = _BX;
	CX_reg = _CX;
	DX_reg = _DX;
	ES_reg = _ES;
	DI_reg = _DI;
	SI_reg = _SI;
	BP_reg = _BP;
	SS_reg = _SS;
	SP_reg = _SP;

     /* 设置自己的栈 */
	disable();
	_AX = _DS;
	_SS = _AX;
	_SP = (unsigned int )&local_stack[STACK_LENGTH];
	enable();

	return_code = 0x0;
	if (req_header_pointer->command>=DOS_CMDS)     /* 请求的命令号越界 */
	  return_code = ERROR_BIT|UNKNOWN_CMD;
	else   /* 调用相应的命令 */
	  return_code|=(*dos_cmd[req_header_pointer->command])(req_header_pointer);
	req_header_pointer->status = return_code | DONE_BIT;

     /* 恢复入口时的栈 */
	disable();
	_SS = SS_reg;
	_SP = SP_reg;
	enable();

     /* 恢复入口时的寄存器 */
	_DX = DX_reg;
	_CX = CX_reg;
	_BX = BX_reg;
	_ES = ES_reg;
	_DI = DI_reg;
	_SI = SI_reg;
	_BP = BP_reg;

     /* 恢复为设置自己数据段而破坏的寄存器 */
	asm pop		ds;
	asm pop		ax;

}


unsigned	Ioctl_input_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Input_no_wait_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Input_status_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Input_flush_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Output_status_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Output_flush_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Ioctl_output_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Dev_open_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Dev_close_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Remove_media_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Ioctl_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Get_logical_device_map_cmd()
{
	return UNKNOWN_CMD;
}

unsigned	Set_logical_device_map_cmd()
{
	return UNKNOWN_CMD;
}


unsigned int Media_check_cmd(struct REQ_struct far *r_p)
{
	r_p->req_type.media_check_req.return_info = 1;
	return OP_COMPLETE;
}

unsigned int Build_bpb_cmd(struct REQ_struct far *r_p)
{
	r_p->req_type.build_BPB_req.BPB_table = &bpb;
	return OP_COMPLETE;
}

unsigned int Unknown_cmd(struct REQ_struct far *r_p)
{
	return UNKNOWN_CMD;
}

unsigned int Input_cmd(struct REQ_struct far *r_p)
{
	return OP_COMPLETE;
}

unsigned int Output_cmd(struct REQ_struct far *r_p)
{
	return OP_COMPLETE;
}

unsigned int Output_verify_cmd(struct REQ_struct far *r_p)
{
	return OP_COMPLETE;
}


/* 本函数必需放在本程序的最后 */
unsigned int Init_cmd(struct REQ_struct far *r_p)
{
	r_p->req_type.init_req.num_of_units=1;
	bpb_ary[0] = &bpb;
	r_p->req_type.init_req.BPB_ptr = MK_FP(_DS,(unsigned int)bpb_ary);
	r_p->req_type.init_req.end_ptr = dos_cmd[INIT];
	return OP_COMPLETE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -