LOGDR_ST.H
资源名称:os_source.zip [点击查看]
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:6k
源码类别:
操作系统开发
开发平台:
C/C++
- /*
- FIPS - the First nondestructive Interactive Partition Splitting program
- Module logdr_st.h
- RCS - Header:
- $Header: c:/daten/fips/source/main/RCS/logdr_st.h 1.4 1995/01/19 00:01:27 schaefer Exp $
- Copyright (C) 1993 Arno Schaefer
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- Report problems and direct all questions to:
- schaefer@rbg.informatik.th-darmstadt.de
- */
- #ifndef LOGDR_ST_H
- #define LOGDR_ST_H
- #include "types.h"
- #include "disk_io.h"
- /* ----------------------------------------------------------------------- */
- /* Class boot_sector - derived from structure sector */
- /* Must be initialized with pointer to logical drive object */
- /* Read() and write() read/write sector 0 of logical drive */
- /* ----------------------------------------------------------------------- */
- class boot_sector:public sector
- {
- class logical_drive *logical_drive;
- public:
- // constructor
- boot_sector (class logical_drive *logical_drive)
- { boot_sector::logical_drive = logical_drive; }
- // functions
- int read (void);
- int write (void);
- };
- /* ------------------------------------------------------------------------ */
- /* Bios Parameter Block structure */
- /* This is not exactly the BPB as understood by DOS, because it contains */
- /* the additional fields that are in the boot_sector like jump_instruction, */
- /* oem_name etc. Get() extracts info from the boot_sector, put() writes the */
- /* info back into the boot_sector buffer. */
- /* ------------------------------------------------------------------------ */
- struct bios_parameter_block
- {
- byte jump_instruction[3]; // EB xx 90 or E9 xx xx
- char oem_name[9];
- word bytes_per_sector; // usually 512
- byte sectors_per_cluster; // may differ
- word reserved_sectors; // usually 1 (boot_sector)
- byte no_of_fats; // usually 2
- word no_of_rootdir_entries; // usually 512 for HDs (?), 224 for
- // HD-Floppies, 112 for DD-Floppies
- word no_of_sectors; // 0 on BIGDOS partitions
- byte media_descriptor; // usually F8h
- word sectors_per_fat; // depends on partition size
- word sectors_per_track; // depends on drive
- word drive_heads; // dto.
- dword hidden_sectors; // first sector of partition or 0 for FDs
- dword no_of_sectors_long; // number of sectors on BIGDOS partitions
- byte phys_drive_no; // usually 80h
- byte signature; // usually 29h
- dword serial_number; // random
- char volume_label[12];
- char file_system_id[9];
- void get (boot_sector *boot_sector);
- void put (boot_sector *boot_sector);
- };
- /* ----------------------------------------------------------------------- */
- /* Some miscellaneous figures about the drive */
- /* Get() extracts this info from the BPB */
- /* ----------------------------------------------------------------------- */
- struct logical_drive_info
- {
- dword start_fat1;
- dword start_fat2;
- dword start_rootdir;
- dword start_data;
- dword no_of_clusters;
- virtual void get (const bios_parameter_block &bpb);
- };
- /* ----------------------------------------------------------------------- */
- /* Abstract Class logical_drive. This can be any DOS drive that allows */
- /* direct reading and writing of sectors, like Harddisk Partitions, Floppy */
- /* disks or Ramdisks */
- /* ----------------------------------------------------------------------- */
- class logical_drive
- {
- // private data
- struct bios_parameter_block pr_bpb;
- struct logical_drive_info pr_info;
- public:
- // public data
- class boot_sector *boot_sector;
- // member access functions
- virtual bios_parameter_block &bpb() { return pr_bpb; }
- virtual logical_drive_info &info() { return pr_info; }
- // functions
- virtual int read_sector (dword number,sector *sector) = 0;
- virtual int write_sector (dword number,sector *sector) = 0;
- // pure virtual functions
- int read_boot_sector (void) { return (boot_sector->read ()); }
- int write_boot_sector (void) { return (boot_sector->write ()); }
- void get_bpb (void) { bpb().get (boot_sector); }
- void put_bpb (void) { bpb().put (boot_sector); }
- void get_info (void) { info().get (bpb ()); }
- };
- /* ----------------------------------------------------------------------- */
- /* Function to read boot_sector from logical drive */
- /* It must be in the header file because it is inline */
- /* ----------------------------------------------------------------------- */
- inline int boot_sector::read (void)
- {
- return logical_drive->read_sector (0,this);
- }
- /* ----------------------------------------------------------------------- */
- /* Function to write boot_sector to logical drive */
- /* ----------------------------------------------------------------------- */
- inline int boot_sector::write (void)
- {
- return logical_drive->write_sector (0,this);
- }
- #endif