www.pudn.com > fips15.zip > logdr_st.h


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