www.pudn.com > minix.instalation.cd-rom-2.0.rar > DISK_IO.H


/*  
	FIPS - the First nondestructive Interactive Partition Splitting program  
  
	Module disk_io.h  
  
	RCS - Header:  
	$Header: c:/daten/fips/source/main/RCS/disk_io.h 1.4 1995/01/19 00:01:25 schaefer Exp schaefer $  
  
	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 DISK_IO_H  
#define DISK_IO_H  
  
#include "types.h"  
  
  
/* ----------------------------------------------------------------------- */  
/* Structure to hold information about the drive geometry                  */  
/* ----------------------------------------------------------------------- */  
  
struct drive_geometry  
{  
	dword heads;  
	dword cylinders;  
	dword sectors;  
};  
  
  
/* ----------------------------------------------------------------------- */  
/* Low level structure physical_drive, contains drive number and geometry, */  
/* as well as low level sector read and write routines                     */  
/* Geometry is determined on initialization, errorcode contains error      */  
/* number after call to get_geometry() and reset().                        */  
/* Initialization requires number (e.g. physical_drive drive1 (0x80);).    */  
/*                                                                         */  
/* Read and write are called max. 3 times in case of failure, return code  */  
/* contains 0 if successful. Sector CRC is verified after write.           */  
/* sector_number is absolute logical sector number (0 = master boot record)*/  
/* ----------------------------------------------------------------------- */  
  
class physical_drive  
{  
protected:  
	virtual void get_geometry (void);  
  
public:  
// constructors & operators  
  
	physical_drive (int number);  
	physical_drive (physical_drive &pd);  
	void operator= (physical_drive &pd);  
  
// public data  
  
	int number;  
	int errorcode;  
	drive_geometry geometry;  
  
// functions  
  
	virtual void reset (void);  
  
	int read_sector (struct sector* sector, dword sector_number);  
	int write_sector (struct sector* sector, dword sector_number);  
};  
  
  
/* ----------------------------------------------------------------------- */  
/* Physical_sector_no holds and calculates physical sector number (Head,   */  
/* Cylinder, Sector). Number is calculated on initialization. Log_sector   */  
/* is absolute logical sector number (0 = master boot record). Usage:      */  
/* physical_sector_no mbr (0,geometry);                                    */  
/* physical_sector_no mbr (0,0,1);                                         */  
/* ----------------------------------------------------------------------- */  
  
struct physical_sector_no  
{  
// public data  
  
	dword head;  
	dword cylinder;  
	dword sector;  
  
// constructors  
  
	physical_sector_no (dword logical_sector, const drive_geometry &geometry);  
	physical_sector_no (dword head, dword cylinder, dword sector)  
	{  
		physical_sector_no::head = head;  
		physical_sector_no::cylinder = cylinder;  
		physical_sector_no::sector = sector;  
	}  
};  
  
  
/* ----------------------------------------------------------------------- */  
/* Structure sector - contains only sector data                            */  
/* ----------------------------------------------------------------------- */  
  
struct sector  
{  
	byte data[512];  
};  
  
  
/* ----------------------------------------------------------------------- */  
/* Prototype for bios call get_disk_type - returns 0 if drive not present. */  
/* Valid drive numbers: 0 - 255, result: 1 - floppy without disk change    */  
/* detection, 2 - floppy with disk change detection, 3 - harddisk          */  
/* ----------------------------------------------------------------------- */  
  
int get_disk_type (int drive_number);  
  
/* Bios call get_no_of_drives */  
  
int get_no_of_drives (void);  
  
#endif