📄 ch5.prg
字号:
} 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 + -