Операционная система MS-DOS
© Александр Фролов, Григорий Фролов
Том 1, книга 3, М.: Диалог-МИФИ, 1992.
![[Назад]](../../prev.gif) |
![[Содеожание]](../../sod.gif) |
/* SYSP.H - include-файл для
примеров, приведенных в книге */
/**
*.Name FP_MAKE
*
*.Title Макро для составления FAR-указателя
*
*.Descr Макро составляет FAR-указатель, пользуясь
* значениями сегмента и смещения
*
*.Params FP_MAKE(seg,off)
* seg - сегмент;
* off - смещение
*
*.Return FAR-указатель seg:off
**/
#define FP_MAKE(seg,off) ((void far *) \
((((unsigned long) (unsigned)(seg)) << 16L) | \
((unsigned long) (unsigned) (off))))
/* Структура векторной таблицы связи DOS */
#pragma pack(1)
typedef struct _CVT_ {
unsigned mcb_seg;
void far *dev_cb;
void far *file_tab;
void far *clock_dr;
void far *con_dr;
unsigned max_btbl;
void far *disk_buf;
void far *drv_info;
void far *fcb_tabl;
unsigned fcb_size;
unsigned char num_bdev;
unsigned char lastdriv;
} CVT;
/* Блок управления памятью MCB */
typedef struct _MCB_ {
unsigned char type;
unsigned owner;
unsigned size;
char reserve[11];
} MCB;
/* Префикс программного сегмента PSP */
typedef struct _PSP_ {
unsigned char int20h[2];
unsigned mem_top;
unsigned char reserv1;
unsigned char call_dsp[5];
void far *term_adr;
void far *cbrk_adr;
void far *crit_err;
unsigned parn_psp;
unsigned char file_tab[20];
unsigned env_seg;
void far *ss_sp;
unsigned max_open;
void far *file_tba;
unsigned char reserv2[24];
unsigned char disp[3];
unsigned char reserv3[9];
unsigned char fcb1[16];
unsigned char fcb2[20];
unsigned char p_size;
unsigned char parm[127];
} PSP;
/* Блок управления устройством DOS */
typedef struct _DDCB_ {
unsigned char drv_num;
unsigned char drv_numd;
unsigned sec_size;
unsigned char clu_size;
unsigned char clu_base;
unsigned boot_siz;
unsigned char fat_num;
unsigned max_dir;
unsigned data_sec;
unsigned hi_clust;
unsigned char fat_size;
char reserv1;
unsigned root_sec;
void far *drv_addr;
unsigned char media;
unsigned char acc_flag;
struct _DDCB_ far *next;
unsigned reserv2;
unsigned built;
} DDCB;
/* Управляющий блок DOS для файлов */
typedef struct _DFCB_ {
unsigned handl_num;
unsigned char access_mode;
unsigned reserv1;
unsigned dev_info;
void far *driver;
unsigned first_clu;
unsigned time;
unsigned date;
unsigned long fl_size;
unsigned long offset;
unsigned reserv2;
unsigned reserv7;
unsigned reserv3;
char reserv4;
char filename[11];
char reserv5[6];
unsigned ownr_psp;
unsigned reserv6;
unsigned last_clu;
char reserv8[4];
} DFCB;
/* Таблица файлов DOS */
typedef struct _DFT_ {
struct _DFT_ far *next;
unsigned file_count;
DFCB dfcb;
} DFT;
/* Управляющий блок дискового буфера BCB */
typedef struct _BCB_ {
struct _BCB_ far *next;
unsigned char drive;
unsigned char flag;
unsigned sect_num;
unsigned reserv1;
DDCB far *ddcb;
unsigned reserv2;
} BCB;
/* Информация о диске */
typedef struct _DINFO_ {
char path[64];
unsigned reserv1;
unsigned reserv2;
unsigned char reserv3;
DDCB far *ddcb;
unsigned cdir_clu;
unsigned reserv4;
unsigned reserv5;
unsigned reserv6;
unsigned char reserv7[7];
} DINFO;
/* Заголовок EXE-программы */
typedef struct _EXE_HDR_ {
unsigned signature;
unsigned part_pag;
unsigned file_size;
unsigned rel_item;
unsigned hdr_size;
unsigned min_mem;
unsigned max_mem;
unsigned ss_reg;
unsigned sp_reg;
unsigned chk_summ;
unsigned ip_reg;
unsigned cs_reg;
unsigned relt_off;
unsigned overlay;
} EXE_HDR;
/* таблица расположения сегментов EXE-программы */
typedef struct _RELOC_TAB_ {
unsigned offset;
unsigned segment;
} RELOC_TAB;
/* конфигурация дисковой подсистемы */
typedef struct _DISK_CONFIG_ {
int n_floppy;
int n_hard;
int t_floppy1;
int t_floppy2;
int t_hard1;
int t_hard2;
} DISK_CONFIG;
/* таблица параметров дискеты */
typedef struct _DPT_ {
unsigned char srt_hut;
unsigned char dma_hlt;
unsigned char motor_w;
unsigned char sec_size;
unsigned char eot;
unsigned char gap_rw;
unsigned char dtl;
unsigned char gap_f;
unsigned char fill_char;
unsigned char hst;
unsigned char mot_start;
} DPT;
/* таблица параметров диска */
typedef struct _HDPT_ {
unsigned max_cyl;
unsigned char max_head;
unsigned srwcc;
unsigned swpc;
unsigned char max_ecc;
unsigned char dstopt;
unsigned char st_del;
unsigned char fm_del;
unsigned char chk_del;
unsigned char reserve[4];
} HDPT;
/* Элемент таблицы разделов */
typedef struct _PART_ENTRY_ {
unsigned char flag;
unsigned char beg_head;
unsigned beg_sec_cyl;
unsigned char sys;
unsigned char end_head;
unsigned end_sec_cyl;
unsigned long rel_sec;
unsigned long size;
} PART_ENTRY;
/* Главная загрузочная запись */
typedef struct _MBOOT_ {
char boot_prg[0x1be];
PART_ENTRY part_table[4];
unsigned char signature[2];
} MBOOT;
/* Расширенный блок параметров BIOS */
typedef struct _EBPB_ {
unsigned sectsize;
char clustsize;
unsigned ressecs;
char fatcnt;
unsigned rootsize;
unsigned totsecs;
char media;
unsigned fatsize;
unsigned seccnt;
unsigned headcnt;
unsigned hiddensec_low;
unsigned hiddensec_hi;
unsigned long drvsecs;
} EBPB;
/* Загрузочная запись для MS-DOS 4.01 */
typedef struct _BOOT_ {
char jmp[3];
char oem[8];
EBPB bpb;
char drive;
char reserved;
char signature;
unsigned volser_lo;
unsigned volser_hi;
char label[11];
char fat_format[8];
char boot_code[450];
} BOOT;
/* Время последнего обновления файла */
typedef struct _FTIME_ {
unsigned sec : 5, min : 6, hour : 5;
} FTIME;
/* Дата последнего обновления файла */
typedef struct _FDATE_ {
unsigned day : 5, month : 4, year : 7;
} FDATE;
/* Дескриптор файла в каталоге */
typedef struct _FITEM_ {
char name[8];
char ext[3];
char attr;
char reserved[10];
FTIME time;
FDATE date;
unsigned cluster_nu;
unsigned long size;
} FITEM;
/* Формат дорожки для GENERIC IOCTL */
typedef struct _TRK_LY_ {
unsigned no;
unsigned size;
} TRK_LY;
/* Параметры устройства для GENERIC IOCTL */
typedef struct _DPB_ {
char spec;
char devtype;
unsigned devattr;
unsigned numofcyl;
char media_type;
EBPB bpb;
char reserved[6];
unsigned trkcnt;
TRK_LY trk[100];
} DPB;
/* Параметры для форматирования функцией GENERIC IOCTL */
typedef struct _DPB_FORMAT_ {
char spec;
unsigned head;
unsigned track;
} DPB_FORMAT;
/* Параметры для чтения/записи функцией GENERIC IOCTL */
typedef struct _DPB_WR_ {
char spec;
unsigned head;
unsigned track;
unsigned sector;
unsigned sectcnt;
void _far *buffer;
} DPB_WR;
/* Идентификатор BIOS */
typedef struct _BIOS_ID_ {
char date[8];
unsigned reserve;
char pc_type;
} BIOS_ID;
#pragma pack()
void far *get_cvt(void); /* получить адрес векторной таблицы связи */
CVT far *get_mcvt(void); /* получить адрес векторной таблицы связи */
MCB far *get_fmcb(CVT far *); /* получить адрес первого MCB */
MCB far *get_nmcb(MCB far *); /* получить адрес следующего MCB */
DDCB far *get_fddcb(CVT far *); /* получить адрес первого DDCB */
DDCB far *get_nddcb(DDCB far *); /* получить адрес следующего DDCB */
DDCB far *get_ddcb(unsigned char); /* получить адрес DDCB для диска */
DFT far *get_fdft(CVT far *); /* получить адрес первой DFT */
DFT far *get_ndft(DFT far *); /* получить адрес следующей DFT */
BCB far *get_fbcb(CVT far *); /* получить адрес первого BCB */
BCB far *get_nbcb(BCB far *); /* получить адрес следующего BCB */
int get_exeh(EXE_HDR *,RELOC_TAB **, FILE *); /* прочитать заголовок EXE */
char unsigned pc_model(void); /* получить модель компьютера */
void disk_cfg(DISK_CONFIG*); /* определить конфигурацию
дисковой подсистемы */
DPT _far *get_dpt(void); /* получить адрес DPT */
HDPT _far *get_hdp1(void); /* получить адрес первой HDPT */
HDPT _far *get_hdp2(void); /* получить адрес второй HDPT */
BIOS_ID _far *getbiosi(void); /* получить адрес идентификатора BIOS */
![[Назад]](../../prev.gif) |
![[Содеожание]](../../sod.gif) |
|