Операционная система MS DOS (том 2)

Содержимое файла sysp.h


/* 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 */


Содержание раздела