139 lines
4.4 KiB
C++
139 lines
4.4 KiB
C++
/*
|
|
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
|