⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logdr_st.h

📁 Unix操作系统minix 2.0源码
💻 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -